Skip to content

Commit

Permalink
Merge pull request #18 from isd-sgcu/gear/joh-56-johnjud-backend-filt…
Browse files Browse the repository at this point in the history
…er-find-all-pet

Gear/joh 56 johnjud backend filter find all pet
  • Loading branch information
macgeargear authored Jan 13, 2024
2 parents 42aa62a + ff66820 commit 8570958
Show file tree
Hide file tree
Showing 4 changed files with 240 additions and 119 deletions.
138 changes: 21 additions & 117 deletions src/app/service/pet/pet.service.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@ package pet
import (
"context"
"errors"
"fmt"

"time"

"github.com/google/uuid"
"github.com/isd-sgcu/johnjud-backend/src/app/model"
"github.com/isd-sgcu/johnjud-backend/src/app/model/pet"
petConst "github.com/isd-sgcu/johnjud-backend/src/constant/pet"
petUtils "github.com/isd-sgcu/johnjud-backend/src/app/utils/pet"
proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1"
image_proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1"
"github.com/rs/zerolog/log"
Expand All @@ -25,11 +22,11 @@ type Service struct {
}

type IRepository interface {
FindAll(result *[]*pet.Pet) error
FindOne(id string, result *pet.Pet) error
Create(in *pet.Pet) error
Update(id string, result *pet.Pet) error
Delete(id string) error
FindAll(*[]*pet.Pet) error
FindOne(string, *pet.Pet) error
Create(*pet.Pet) error
Update(string, *pet.Pet) error
Delete(string) error
}

type ImageService interface {
Expand All @@ -52,7 +49,7 @@ func (s *Service) Delete(ctx context.Context, req *proto.DeletePetRequest) (*pro
}

func (s *Service) Update(_ context.Context, req *proto.UpdatePetRequest) (res *proto.UpdatePetResponse, err error) {
raw, err := DtoToRaw(req.Pet)
raw, err := petUtils.DtoToRaw(req.Pet)
if err != nil {
return nil, status.Error(codes.Internal, "error converting dto to raw")
}
Expand All @@ -67,15 +64,15 @@ func (s *Service) Update(_ context.Context, req *proto.UpdatePetRequest) (res *p
return nil, status.Error(codes.Internal, "error querying image service")
}

return &proto.UpdatePetResponse{Pet: RawToDto(raw, images)}, nil
return &proto.UpdatePetResponse{Pet: petUtils.RawToDto(raw, images)}, nil
}

func (s *Service) ChangeView(_ context.Context, req *proto.ChangeViewPetRequest) (res *proto.ChangeViewPetResponse, err error) {
petData, err := s.FindOne(context.Background(), &proto.FindOnePetRequest{Id: req.Id})
if err != nil {
return nil, status.Error(codes.NotFound, "pet not found")
}
pet, err := DtoToRaw(petData.Pet)
pet, err := petUtils.DtoToRaw(petData.Pet)
if err != nil {
return nil, status.Error(codes.Internal, "error converting dto to raw")
}
Expand All @@ -92,27 +89,29 @@ func (s *Service) ChangeView(_ context.Context, req *proto.ChangeViewPetRequest)
func (s *Service) FindAll(_ context.Context, req *proto.FindAllPetRequest) (res *proto.FindAllPetResponse, err error) {
var pets []*pet.Pet
var imagesList [][]*image_proto.Image
metaData := proto.FindAllPetMetaData{}

err = s.repository.FindAll(&pets)
if err != nil {
log.Error().Err(err).Str("service", "event").Str("module", "find all").Msg("Error while querying all events")
return nil, status.Error(codes.Unavailable, "Internal error")
}

petUtils.FilterPet(&pets, req)
petUtils.PaginatePets(&pets, req.Page, req.PageSize, &metaData)

for _, pet := range pets {
images, err := s.imageService.FindByPetId(pet.ID.String())
if err != nil {
return nil, status.Error(codes.Internal, "error querying image service")
}
imagesList = append(imagesList, images)
}

petWithImages, err := RawToDtoList(&pets, imagesList)
petWithImages, err := petUtils.RawToDtoList(&pets, imagesList, req)
if err != nil {
return nil, status.Error(codes.Internal, "error converting raw to dto list")
return nil, status.Error(codes.Internal, fmt.Sprintf("error converting raw to dto list: %v", err))
}

return &proto.FindAllPetResponse{Pets: petWithImages}, nil
return &proto.FindAllPetResponse{Pets: petWithImages, Metadata: &metaData}, nil
}

func (s Service) FindOne(_ context.Context, req *proto.FindOnePetRequest) (res *proto.FindOnePetResponse, err error) {
Expand All @@ -130,11 +129,11 @@ func (s Service) FindOne(_ context.Context, req *proto.FindOnePetRequest) (res *
return nil, status.Error(codes.Internal, "error querying image service")
}

return &proto.FindOnePetResponse{Pet: RawToDto(&pet, images)}, err
return &proto.FindOnePetResponse{Pet: petUtils.RawToDto(&pet, images)}, err
}

func (s *Service) Create(_ context.Context, req *proto.CreatePetRequest) (res *proto.CreatePetResponse, err error) {
raw, err := DtoToRaw(req.Pet)
raw, err := petUtils.DtoToRaw(req.Pet)
if err != nil {
return nil, status.Error(codes.Internal, "error converting dto to raw: "+err.Error())
}
Expand All @@ -146,15 +145,15 @@ func (s *Service) Create(_ context.Context, req *proto.CreatePetRequest) (res *p
return nil, status.Error(codes.Internal, "failed to create pet")
}

return &proto.CreatePetResponse{Pet: RawToDto(raw, images)}, nil
return &proto.CreatePetResponse{Pet: petUtils.RawToDto(raw, images)}, nil
}

func (s *Service) AdoptPet(ctx context.Context, req *proto.AdoptPetRequest) (res *proto.AdoptPetResponse, err error) {
dtoPet, err := s.FindOne(context.Background(), &proto.FindOnePetRequest{Id: req.PetId})
if err != nil {
return nil, status.Error(codes.NotFound, "pet not found")
}
pet, err := DtoToRaw(dtoPet.Pet)
pet, err := petUtils.DtoToRaw(dtoPet.Pet)
if err != nil {
return nil, status.Error(codes.Internal, "error converting dto to raw")
}
Expand All @@ -167,98 +166,3 @@ func (s *Service) AdoptPet(ctx context.Context, req *proto.AdoptPetRequest) (res

return &proto.AdoptPetResponse{Success: true}, nil
}

func RawToDtoList(in *[]*pet.Pet, images [][]*image_proto.Image) ([]*proto.Pet, error) {
var result []*proto.Pet
if len(*in) != len(images) {
return nil, errors.New("length of in and imageUrls have to be the same")
}

for i, e := range *in {
result = append(result, RawToDto(e, images[i]))
}
return result, nil
}

func RawToDto(in *pet.Pet, images []*image_proto.Image) *proto.Pet {
return &proto.Pet{
Id: in.ID.String(),
Type: in.Type,
Name: in.Name,
Birthdate: in.Birthdate,
Gender: string(in.Gender),
Color: in.Color,
Pattern: in.Pattern,
Habit: in.Habit,
Caption: in.Caption,
Status: string(in.Status),
Images: images,
IsSterile: in.IsSterile,
IsVaccinated: in.IsVaccinated,
IsVisible: in.IsVisible,
Origin: in.Origin,
Address: in.Address,
Contact: in.Contact,
AdoptBy: in.AdoptBy,
}
}

func DtoToRaw(in *proto.Pet) (res *pet.Pet, err error) {
var id uuid.UUID
var gender petConst.Gender
var status petConst.Status

if in.Id != "" {
id, err = uuid.Parse(in.Id)
if err != nil {
return nil, err
}
}

switch in.Gender {
case string(petConst.MALE):
gender = petConst.MALE
case string(petConst.FEMALE):
gender = petConst.FEMALE
}

switch in.Status {
case string(petConst.ADOPTED):
status = petConst.ADOPTED
case string(petConst.FINDHOME):
status = petConst.FINDHOME
}

return &pet.Pet{
Base: model.Base{
ID: id,
CreatedAt: time.Time{},
UpdatedAt: time.Time{},
DeletedAt: gorm.DeletedAt{},
},
Type: in.Type,
Name: in.Name,
Birthdate: in.Birthdate,
Gender: gender,
Color: in.Color,
Pattern: in.Pattern,
Habit: in.Habit,
Caption: in.Caption,
Status: status,
IsSterile: in.IsSterile,
IsVaccinated: in.IsVaccinated,
IsVisible: in.IsVisible,
Origin: in.Origin,
Address: in.Address,
Contact: in.Contact,
AdoptBy: in.AdoptBy,
}, nil
}

func ExtractImageUrls(in []*image_proto.Image) []string {
var result []string
for _, e := range in {
result = append(result, e.ImageUrl)
}
return result
}
11 changes: 9 additions & 2 deletions src/app/service/pet/pet.service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,15 @@ func (t *PetServiceTest) TestFindOneSuccess() {

func (t *PetServiceTest) TestFindAllSuccess() {

want := &proto.FindAllPetResponse{Pets: t.createPetsDto(t.Pets, t.ImagesList)}
want := &proto.FindAllPetResponse{
Pets: t.createPetsDto(t.Pets, t.ImagesList),
Metadata: &proto.FindAllPetMetaData{
Page: 1,
TotalPages: 1,
PageSize: int32(len(t.Pets)),
Total: int32(len(t.Pets)),
},
}

var petsIn []*pet.Pet

Expand All @@ -329,7 +337,6 @@ func (t *PetServiceTest) TestFindAllSuccess() {
srv := NewService(repo, imgSrv)

actual, err := srv.FindAll(context.Background(), &proto.FindAllPetRequest{})

assert.Nil(t.T(), err)
assert.Equal(t.T(), want, actual)
}
Expand Down
Loading

0 comments on commit 8570958

Please sign in to comment.