Skip to content

Commit

Permalink
Merge pull request #24 from isd-sgcu/gear/joh-57-johnjud-gateway-fix-…
Browse files Browse the repository at this point in the history
…findall

Gear/joh 57 johnjud gateway fix findall
  • Loading branch information
macgeargear authored Jan 13, 2024
2 parents 55c5bbe + ee68bf4 commit df69d94
Show file tree
Hide file tree
Showing 10 changed files with 236 additions and 35 deletions.
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

0 comments on commit df69d94

Please sign in to comment.