Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gear/joh 57 johnjud gateway fix findall #24

Merged
merged 11 commits into from
Jan 13, 2024
24 changes: 24 additions & 0 deletions src/app/dto/pet.dto.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,30 @@ type PetResponse struct {
Images []ImageResponse `json:"images"`
}

type FindAllPetRequest struct {
Search string `json:"search"`
Type string `json:"type"`
Gender string `json:"gender"`
Color string `json:"color"`
Pattern string `json:"pattern"`
Age string `json:"age"`
Origin string `json:"origin"`
PageSize int `json:"page_size"`
Page int `json:"page"`
}

type FindAllMetadata struct {
Page int `json:"page"`
TotalPages int `json:"total_pages"`
PageSize int `json:"page_size"`
Total int `json:"total"`
}

type FindAllPetResponse struct {
Pets []*PetResponse `json:"pets"`
Metadata *FindAllMetadata `json:"metadata"`
}

type CreatePetRequest struct {
Type string `json:"type" validate:"required"`
Name string `json:"name" validate:"required"`
Expand Down
9 changes: 8 additions & 1 deletion src/app/handler/pet/pet.handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/isd-sgcu/johnjud-gateway/src/app/constant"
"github.com/isd-sgcu/johnjud-gateway/src/app/dto"
"github.com/isd-sgcu/johnjud-gateway/src/app/router"
petUtils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/pet"
"github.com/isd-sgcu/johnjud-gateway/src/app/validator"
imageSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/image"
petSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/pet"
Expand All @@ -33,7 +34,13 @@ func NewHandler(service petSvc.Service, imageService imageSvc.Service, validate
// @Failure 503 {object} dto.ResponseServiceDownErr "Service is down"
// @Router /v1/pets/ [get]
func (h *Handler) FindAll(c router.IContext) {
response, respErr := h.service.FindAll()
queries := c.Queries()
request, err := petUtils.QueriesToFindAllDto(queries)
if err != nil {
c.JSON(http.StatusBadRequest, err)
}

response, respErr := h.service.FindAll(request)
if respErr != nil {
c.JSON(respErr.StatusCode, respErr)
return
Expand Down
33 changes: 31 additions & 2 deletions src/app/handler/pet/pet.handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ type PetHandlerTest struct {
Pet *petProto.Pet
Pets []*petProto.Pet
PetDto *dto.PetResponse
QueriesMock map[string]string
Metadata *dto.FindAllMetadata
FindAllPetRequest *dto.FindAllPetRequest
CreatePetRequest *dto.CreatePetRequest
ChangeViewPetRequest *dto.ChangeViewPetRequest
UpdatePetRequest *dto.UpdatePetRequest
Expand Down Expand Up @@ -80,6 +83,13 @@ func (t *PetHandlerTest) SetupTest() {
t.Pets = pets
t.Pet = t.Pets[0]

t.Metadata = &dto.FindAllMetadata{
Page: 1,
TotalPages: 1,
PageSize: len(t.Pets),
Total: len(t.Pets),
}

t.PetDto = &dto.PetResponse{
Id: t.Pet.Id,
Type: t.Pet.Type,
Expand All @@ -100,6 +110,20 @@ func (t *PetHandlerTest) SetupTest() {
AdoptBy: t.Pet.AdoptBy,
}

t.QueriesMock = map[string]string{
"search": "",
"type": "",
"gender": "",
"color": "",
"pattern": "",
"age": "",
"origin": "",
"pageSize": "0",
"page": "0",
}

t.FindAllPetRequest = &dto.FindAllPetRequest{}

t.CreatePetRequest = &dto.CreatePetRequest{}

t.UpdatePetRequest = &dto.UpdatePetRequest{}
Expand Down Expand Up @@ -134,7 +158,11 @@ func (t *PetHandlerTest) SetupTest() {

func (t *PetHandlerTest) TestFindAllSuccess() {
findAllResponse := utils.ProtoToDtoList(t.Pets, t.ImagesList)
expectedResponse := findAllResponse
metadataResponse := t.Metadata
expectedResponse := &dto.FindAllPetResponse{
Pets: findAllResponse,
Metadata: metadataResponse,
}

controller := gomock.NewController(t.T())

Expand All @@ -143,7 +171,8 @@ func (t *PetHandlerTest) TestFindAllSuccess() {
validator := validatorMock.NewMockIDtoValidator(controller)
context := routerMock.NewMockIContext(controller)

petSvc.EXPECT().FindAll().Return(findAllResponse, nil)
context.EXPECT().Queries().Return(t.QueriesMock)
petSvc.EXPECT().FindAll(t.FindAllPetRequest).Return(expectedResponse, nil)
context.EXPECT().JSON(http.StatusOK, expectedResponse)

handler := NewHandler(petSvc, imageSvc, validator)
Expand Down
5 changes: 5 additions & 0 deletions src/app/router/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type IContext interface {
Path() string
StoreValue(string, string)
Next() error
Queries() map[string]string
}

type FiberCtx struct {
Expand Down Expand Up @@ -91,6 +92,10 @@ func (c *FiberCtx) StoreValue(k string, v string) {
c.Locals(k, v)
}

func (c *FiberCtx) Queries() map[string]string {
return c.Ctx.Queries()
}

//func (c *FiberCtx) Next() {
// err := c.Ctx.Next()
// fmt.Println(c.Route().Path)
Expand Down
13 changes: 9 additions & 4 deletions src/app/service/pet/pet.service.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ func NewService(petClient petproto.PetServiceClient) *Service {
}
}

func (s *Service) FindAll() (result []*dto.PetResponse, err *dto.ResponseErr) {
func (s *Service) FindAll(in *dto.FindAllPetRequest) (result *dto.FindAllPetResponse, err *dto.ResponseErr) {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

res, errRes := s.petClient.FindAll(ctx, &petproto.FindAllPetRequest{})
res, errRes := s.petClient.FindAll(ctx, utils.FindAllDtoToProto(in))
if errRes != nil {
st, _ := status.FromError(errRes)
log.Error().
Expand All @@ -51,8 +51,13 @@ func (s *Service) FindAll() (result []*dto.PetResponse, err *dto.ResponseErr) {
}
}
imagesList := utils.MockImageList(len(res.Pets))
findAllResponse := utils.ProtoToDtoList(res.Pets, imagesList)
return findAllResponse, nil
findAllDto := utils.ProtoToDtoList(res.Pets, imagesList)
metaData := utils.MetadataProtoToDto(res.Metadata)

return &dto.FindAllPetResponse{
Pets: findAllDto,
Metadata: metaData,
}, nil
}

func (s *Service) FindOne(id string) (result *dto.PetResponse, err *dto.ResponseErr) {
Expand Down
53 changes: 44 additions & 9 deletions src/app/service/pet/pet.service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,17 @@ type PetServiceTest struct {
suite.Suite
Pets []*petproto.Pet
Pet *petproto.Pet
MetadataDto *dto.FindAllMetadata
MetadataProto *petproto.FindAllPetMetaData
PetNotVisible *petproto.Pet
FindAllPetReq *petproto.FindAllPetRequest
UpdatePetReq *petproto.UpdatePetRequest
CreatePetReq *petproto.CreatePetRequest
ChangeViewPetReq *petproto.ChangeViewPetRequest
DeletePetReq *petproto.DeletePetRequest
AdoptReq *petproto.AdoptPetRequest
PetDto *dto.PetResponse
FindAllPetDto *dto.FindAllPetRequest
CreatePetDto *dto.CreatePetRequest
UpdatePetDto *dto.UpdatePetRequest
NotFoundErr *dto.ResponseErr
Expand Down Expand Up @@ -80,6 +84,20 @@ func (t *PetServiceTest) SetupTest() {
pets = append(pets, pet)
}

t.MetadataDto = &dto.FindAllMetadata{
Page: 1,
TotalPages: 1,
PageSize: len(t.Pets),
Total: len(t.Pets),
}

t.MetadataProto = &petproto.FindAllPetMetaData{
Page: 1,
TotalPages: 1,
PageSize: int32(len(t.Pets)),
Total: int32(len(t.Pets)),
}

t.Pets = pets
t.Pet = t.Pets[0]

Expand All @@ -106,6 +124,18 @@ func (t *PetServiceTest) SetupTest() {

t.PetDto = utils.ProtoToDto(t.Pet, t.Pet.Images)

t.FindAllPetDto = &dto.FindAllPetRequest{
Search: "",
Type: "",
Gender: "",
Color: "",
Pattern: "",
Age: "",
Origin: "",
PageSize: len(t.Pets),
Page: 1,
}

t.CreatePetDto = &dto.CreatePetRequest{
Type: t.Pet.Type,
Name: t.Pet.Name,
Expand Down Expand Up @@ -146,6 +176,7 @@ func (t *PetServiceTest) SetupTest() {
AdoptBy: t.Pet.AdoptBy,
}

t.FindAllPetReq = utils.FindAllDtoToProto(t.FindAllPetDto)
t.CreatePetReq = utils.CreateDtoToProto(t.CreatePetDto)
t.UpdatePetReq = utils.UpdateDtoToProto(t.Pet.Id, t.UpdatePetDto)

Expand Down Expand Up @@ -194,35 +225,39 @@ func (t *PetServiceTest) SetupTest() {
}

func (t *PetServiceTest) TestFindAllSuccess() {
protoReq := &petproto.FindAllPetRequest{}
protoResp := &petproto.FindAllPetResponse{
Pets: t.Pets,
Pets: t.Pets,
Metadata: t.MetadataProto,
}

expected := utils.ProtoToDtoList(t.Pets, t.ImagesList)
findAllPPetsDto := utils.ProtoToDtoList(t.Pets, t.ImagesList)
metadataDto := t.MetadataDto

expected := &dto.FindAllPetResponse{
Pets: findAllPPetsDto,
Metadata: metadataDto,
}

client := petmock.PetClientMock{}
client.On("FindAll", protoReq).Return(protoResp, nil)
client.On("FindAll", t.FindAllPetReq).Return(protoResp, nil)

svc := NewService(&client)
actual, err := svc.FindAll()
actual, err := svc.FindAll(t.FindAllPetDto)

assert.Nil(t.T(), err)
assert.Equal(t.T(), expected, actual)
}

func (t *PetServiceTest) TestFindAllUnavailableServiceError() {
protoReq := &petproto.FindAllPetRequest{}

expected := t.UnavailableServiceErr

clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage)

client := petmock.PetClientMock{}
client.On("FindAll", protoReq).Return(nil, clientErr)
client.On("FindAll", t.FindAllPetReq).Return(nil, clientErr)

svc := NewService(&client)
actual, err := svc.FindAll()
actual, err := svc.FindAll(t.FindAllPetDto)

assert.Nil(t.T(), actual)
assert.Equal(t.T(), expected, err)
Expand Down
72 changes: 72 additions & 0 deletions src/app/utils/pet/pet.utils.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package pet

import (
"errors"
"fmt"
"strconv"

"github.com/isd-sgcu/johnjud-gateway/src/app/dto"
"github.com/isd-sgcu/johnjud-gateway/src/constant/pet"
Expand Down Expand Up @@ -137,3 +139,73 @@ func extractImages(images []*imgproto.Image) []dto.ImageResponse {
}
return result
}

func FindAllDtoToProto(in *dto.FindAllPetRequest) *petproto.FindAllPetRequest {
return &petproto.FindAllPetRequest{
Search: in.Search,
Type: in.Type,
Gender: in.Gender,
Color: in.Color,
Pattern: in.Pattern,
Age: in.Age,
Origin: in.Origin,
PageSize: int32(in.PageSize),
Page: int32(in.Page),
}
}

func MetadataProtoToDto(in *petproto.FindAllPetMetaData) *dto.FindAllMetadata {
return &dto.FindAllMetadata{
Page: int(in.Page),
TotalPages: int(in.TotalPages),
PageSize: int(in.PageSize),
Total: int(in.Total),
}
}

func QueriesToFindAllDto(queries map[string]string) (*dto.FindAllPetRequest, error) {
request := &dto.FindAllPetRequest{
Search: "",
Type: "",
Gender: "",
Color: "",
Pattern: "",
Age: "",
Origin: "",
PageSize: 0,
Page: 0,
}

for q, v := range queries {
switch q {
case "search":
request.Search = v
case "type":
request.Type = v
case "gender":
request.Gender = v
case "color":
request.Color = v
case "pattern":
request.Pattern = v
case "age":
request.Age = v
case "origin":
request.Origin = v
case "pageSize":
pageSize, err := strconv.Atoi(v)
if err != nil {
return nil, errors.New("error pasring pageSize")
}
request.PageSize = pageSize
case "page":
page, err := strconv.Atoi(v)
if err != nil {
return nil, errors.New("error pasring page")
}
request.Page = page
}
}

return request, nil
}
Loading
Loading