From 8e68afb20db40296f983053660014f4aa18105e8 Mon Sep 17 00:00:00 2001 From: Sunioatm <104454675+Sunioatm@users.noreply.github.com> Date: Thu, 4 Jan 2024 13:08:51 +0700 Subject: [PATCH 001/134] feat: adopt gateway - adopt handler - adopt service - unit test pass but didn't test with manual test yet --- go.mod | 4 +- go.sum | 8 +-- src/app/dto/adopt.dto.go | 12 ++--- src/app/handler/pet/pet.handler.go | 49 +++++++++++++++++ src/app/handler/pet/pet.handler_test.go | 57 ++++++++++++++++++++ src/app/service/pet/pet.service.go | 47 +++++++++++++++++ src/app/service/pet/pet.service_test.go | 70 +++++++++++++++++++++++++ src/main.go | 1 + src/mocks/client/pet/pet.mock.go | 10 ++++ src/mocks/service/pet/pet.mock.go | 13 +++++ 10 files changed, 259 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 17065c7..2b09d6a 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/gofiber/fiber/v2 v2.51.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.5.0 - github.com/isd-sgcu/johnjud-go-proto v0.0.8 + github.com/isd-sgcu/johnjud-go-proto v0.0.9 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/spf13/viper v1.18.2 @@ -66,7 +66,7 @@ require ( golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect - google.golang.org/protobuf v1.31.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 499d0ee..5bdc034 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,8 @@ github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/isd-sgcu/johnjud-go-proto v0.0.8 h1:nIQBZgK2OFVrLjVtpeDgwows8poA7LhsIVE4hlbBC1o= -github.com/isd-sgcu/johnjud-go-proto v0.0.8/go.mod h1:HP0w9gC30b5WNnqeFBM9JJZud+pvyikz0+pGFSI/Wjw= +github.com/isd-sgcu/johnjud-go-proto v0.0.9 h1:cFfZ2JSpW0jg94Iv5zHQJGnoekj0eCQe42SJaTpnp3c= +github.com/isd-sgcu/johnjud-go-proto v0.0.9/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -234,8 +234,8 @@ google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/src/app/dto/adopt.dto.go b/src/app/dto/adopt.dto.go index 82a453d..fd42a51 100644 --- a/src/app/dto/adopt.dto.go +++ b/src/app/dto/adopt.dto.go @@ -1,10 +1,10 @@ package dto -import ( - "github.com/google/uuid" -) - type AdoptDto struct { - UserID uuid.UUID `json:"user_id" validate:"required"` - PetID uuid.UUID `json:"pet_id" validate:"required"` + UserID string `json:"user_id" validate:"required"` + PetID string `json:"pet_id" validate:"required"` +} + +type AdoptByRequest struct { + Adopt AdoptDto `json:"adopt" validate:"required"` } diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 95af61e..afbb469 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -25,6 +25,7 @@ type Service interface { Update(string, *dto.UpdatePetRequest) (*pet_proto.Pet, *dto.ResponseErr) ChangeView(string, *dto.ChangeViewPetRequest) (bool, *dto.ResponseErr) Delete(string) (bool, *dto.ResponseErr) + Adopt(string, *dto.AdoptByRequest) (bool, *dto.ResponseErr) } func NewHandler(service Service, imageService imageSrv.Service, validate validator.IDtoValidator) *Handler { @@ -216,3 +217,51 @@ func (h *Handler) Delete(c router.IContext) { c.JSON(http.StatusOK, res) return } + +func (h *Handler) Adopt(c router.IContext) { + petId, err := c.Param("id") + if err != nil { + c.JSON(http.StatusInternalServerError, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: "Invalid ID", + Data: nil, + }) + return + } + + request := &dto.AdoptByRequest{ + Adopt: dto.AdoptDto{}, + } + + err = c.Bind(request) + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + err.Error(), + Data: nil, + }) + return + } + + if err := h.validate.Validate(request); err != nil { + var errorMessage []string + for _, reqErr := range err { + errorMessage = append(errorMessage, reqErr.Message) + } + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + }) + return + } + + pet, errRes := h.service.Adopt(petId, request) + if errRes != nil { + c.JSON(errRes.StatusCode, errRes) + return + } + + c.JSON(http.StatusOK, pet) + return +} diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 1b544a4..c85c816 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -26,6 +26,7 @@ type PetHandlerTest struct { CreatePetRequest *dto.CreatePetRequest ChangeViewPetRequest *dto.ChangeViewPetRequest UpdatePetRequest *dto.UpdatePetRequest + AdoptByRequest *dto.AdoptByRequest BindErr *dto.ResponseErr NotFoundErr *dto.ResponseErr ServiceDownErr *dto.ResponseErr @@ -94,6 +95,8 @@ func (t *PetHandlerTest) SetupTest() { t.ChangeViewPetRequest = &dto.ChangeViewPetRequest{} + t.AdoptByRequest = &dto.AdoptByRequest{} + t.ServiceDownErr = &dto.ResponseErr{ StatusCode: http.StatusServiceUnavailable, Message: "Service is down", @@ -393,3 +396,57 @@ func (t *PetHandlerTest) TestChangeViewGrpcErr() { handler := NewHandler(petSvc, imageSvc, validator) handler.Delete(context) } + +func (t *PetHandlerTest) TestAdoptSuccess() { + adoptResponse := true + + controller := gomock.NewController(t.T()) + + petSvc := mock_pet.NewMockService(controller) + imageSvc := mock_image.NewMockService(controller) + validator := mock_validator.NewMockIDtoValidator(controller) + context := mock_router.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Pet.Id, nil) + petSvc.EXPECT().Delete(t.Pet.Id).Return(adoptResponse, nil) + context.EXPECT().JSON(http.StatusOK, adoptResponse) + + handler := NewHandler(petSvc, imageSvc, validator) + handler.Delete(context) +} + +func (t *PetHandlerTest) TestAdoptNotFound() { + adoptResponse := false + + controller := gomock.NewController(t.T()) + + petSvc := mock_pet.NewMockService(controller) + imageSvc := mock_image.NewMockService(controller) + validator := mock_validator.NewMockIDtoValidator(controller) + context := mock_router.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Pet.Id, nil) + petSvc.EXPECT().Delete(t.Pet.Id).Return(adoptResponse, t.NotFoundErr) + context.EXPECT().JSON(http.StatusNotFound, t.NotFoundErr) + + handler := NewHandler(petSvc, imageSvc, validator) + handler.Delete(context) +} + +func (t *PetHandlerTest) TestAdoptGrpcErr() { + adoptResponse := false + + controller := gomock.NewController(t.T()) + + petSvc := mock_pet.NewMockService(controller) + imageSvc := mock_image.NewMockService(controller) + validator := mock_validator.NewMockIDtoValidator(controller) + context := mock_router.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Pet.Id, nil) + petSvc.EXPECT().Delete(t.Pet.Id).Return(adoptResponse, t.ServiceDownErr) + context.EXPECT().JSON(http.StatusServiceUnavailable, t.ServiceDownErr) + + handler := NewHandler(petSvc, imageSvc, validator) + handler.Delete(context) +} diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 0667893..ebb6928 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -235,6 +235,53 @@ func (s *Service) ChangeView(id string, in *dto.ChangeViewPetRequest) (result bo return res.Success, nil } +func (s *Service) Adopt(petId string, in *dto.AdoptByRequest) (result bool, err *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + request := &proto.AdoptPetRequest{ + PetId: petId, + UserId: in.Adopt.UserID, + } + + res, errRes := s.petClient.AdoptPet(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "pet"). + Str("module", "adopt pet"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return false, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.PetNotFoundMessage, + Data: nil, + } + case codes.InvalidArgument: + return false, &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidArgument, + Data: nil, + } + case codes.Unavailable: + return false, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return false, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return res.Success, nil +} + func DtoToRaw(in *dto.PetDto) *proto.Pet { return &proto.Pet{ Id: in.Id, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index 61b3559..a36b2a1 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -33,6 +33,8 @@ type PetServiceTest struct { InvalidArgumentErr *dto.ResponseErr InternalErr *dto.ResponseErr ChangeViewedPetDto *dto.ChangeViewPetRequest + AdoptPetReq *petProto.AdoptPetRequest + AdoptPetDto *dto.AdoptByRequest Images []*imageProto.Image ImageUrls []string @@ -135,6 +137,18 @@ func (t *PetServiceTest) SetupTest() { Visible: false, } + t.AdoptPetDto = &dto.AdoptByRequest{ + Adopt: dto.AdoptDto{ + PetID: t.Pet.Id, + UserID: faker.UUIDDigit(), + }, + } + + t.AdoptPetReq = &petProto.AdoptPetRequest{ + PetId: t.Pet.Id, + UserId: t.AdoptPetDto.Adopt.UserID, + } + t.UnavailableServiceErr = &dto.ResponseErr{ StatusCode: http.StatusServiceUnavailable, Message: constant.UnavailableServiceMessage, @@ -497,3 +511,59 @@ func (t *PetServiceTest) TestChangeViewUnavailableServiceError() { assert.False(t.T(), actual) assert.Equal(t.T(), expected, err) } + +func (t *PetServiceTest) TestAdoptSuccess() { + protoReq := t.AdoptPetReq + protoResp := &petProto.AdoptPetResponse{ + Success: true, + } + + client := &petMock.PetClientMock{} + client.On("AdoptPet", protoReq).Return(protoResp, nil) + + svc := NewService(client) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + + assert.Nil(t.T(), err) + assert.True(t.T(), actual) +} + +func (t *PetServiceTest) TestAdoptNotFoundError() { + protoReq := t.AdoptPetReq + protoResp := &petProto.AdoptPetResponse{ + Success: false, + } + + clientErr := status.Error(codes.NotFound, constant.PetNotFoundMessage) + + expected := t.NotFoundErr + + client := &petMock.PetClientMock{} + client.On("AdoptPet", protoReq).Return(protoResp, clientErr) + + svc := NewService(client) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + + assert.False(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *PetServiceTest) TestAdoptUnavailableServiceError() { + protoReq := t.AdoptPetReq + protoResp := &petProto.AdoptPetResponse{ + Success: false, + } + + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + + expected := t.UnavailableServiceErr + + client := &petMock.PetClientMock{} + client.On("AdoptPet", protoReq).Return(protoResp, clientErr) + + svc := NewService(client) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + + assert.False(t.T(), actual) + assert.Equal(t.T(), expected, err) +} diff --git a/src/main.go b/src/main.go index ebda5be..9578a2d 100644 --- a/src/main.go +++ b/src/main.go @@ -127,6 +127,7 @@ func main() { r.PostPet("/create", petHandler.Create) r.PutPet("/:id", petHandler.Update) r.PutPet("/:id/visible", petHandler.Update) + r.PutPet("/:id/adopt", petHandler.Adopt) r.DeletePet("/:id", petHandler.Delete) v1 := router.NewAPIv1(r, conf.App) diff --git a/src/mocks/client/pet/pet.mock.go b/src/mocks/client/pet/pet.mock.go index 8627e7f..ebd3b18 100644 --- a/src/mocks/client/pet/pet.mock.go +++ b/src/mocks/client/pet/pet.mock.go @@ -69,3 +69,13 @@ func (c *PetClientMock) Delete(ctx context.Context, in *petProto.DeletePetReques return res, args.Error(1) } + +func (c *PetClientMock) AdoptPet(ctx context.Context, in *petProto.AdoptPetRequest, opts ...grpc.CallOption) (res *petProto.AdoptPetResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*petProto.AdoptPetResponse) + } + + return res, args.Error(1) +} diff --git a/src/mocks/service/pet/pet.mock.go b/src/mocks/service/pet/pet.mock.go index 690ed24..d61b428 100644 --- a/src/mocks/service/pet/pet.mock.go +++ b/src/mocks/service/pet/pet.mock.go @@ -124,3 +124,16 @@ func (mr *MockServiceMockRecorder) Update(id, in interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockService)(nil).Update), id, in) } + +func (m *MockService) Adopt(petId string, in *dto.AdoptByRequest) (bool, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Adopt", petId, in) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +func (mr *MockServiceMockRecorder) Adopt(petId, in interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Adopt", reflect.TypeOf((*MockService)(nil).Adopt), petId, in) +} From 3ac9be0999d06de79553bafb3f1029fc8ab31b84 Mon Sep 17 00:00:00 2001 From: Sunioatm <104454675+Sunioatm@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:52:43 +0700 Subject: [PATCH 002/134] Merge dev --- src/app/service/pet/pet.service_test.go | 15 +++++++-------- src/mocks/client/pet/pet.mock.go | 10 ---------- src/mocks/service/pet/pet.mock.go | 17 ++--------------- 3 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index 03bc07d..c1ad487 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -34,8 +34,7 @@ type PetServiceTest struct { InvalidArgumentErr *dto.ResponseErr InternalErr *dto.ResponseErr ChangeViewedPetDto *dto.ChangeViewPetRequest - AdoptPetReq *petProto.AdoptPetRequest - AdoptPetDto *dto.AdoptByRequest + AdoptDto *dto.AdoptByRequest Images []*imageProto.Image ImageUrls []string @@ -517,7 +516,7 @@ func (t *PetServiceTest) TestChangeViewUnavailableServiceError() { } func (t *PetServiceTest) TestAdoptSuccess() { - protoReq := t.AdoptPetReq + protoReq := t.AdoptReq protoResp := &petProto.AdoptPetResponse{ Success: true, } @@ -526,14 +525,14 @@ func (t *PetServiceTest) TestAdoptSuccess() { client.On("AdoptPet", protoReq).Return(protoResp, nil) svc := NewService(client) - actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptDto) assert.Nil(t.T(), err) assert.True(t.T(), actual) } func (t *PetServiceTest) TestAdoptNotFoundError() { - protoReq := t.AdoptPetReq + protoReq := t.AdoptReq protoResp := &petProto.AdoptPetResponse{ Success: false, } @@ -546,14 +545,14 @@ func (t *PetServiceTest) TestAdoptNotFoundError() { client.On("AdoptPet", protoReq).Return(protoResp, clientErr) svc := NewService(client) - actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptDto) assert.False(t.T(), actual) assert.Equal(t.T(), expected, err) } func (t *PetServiceTest) TestAdoptUnavailableServiceError() { - protoReq := t.AdoptPetReq + protoReq := t.AdoptReq protoResp := &petProto.AdoptPetResponse{ Success: false, } @@ -566,7 +565,7 @@ func (t *PetServiceTest) TestAdoptUnavailableServiceError() { client.On("AdoptPet", protoReq).Return(protoResp, clientErr) svc := NewService(client) - actual, err := svc.Adopt(t.Pet.Id, t.AdoptPetDto) + actual, err := svc.Adopt(t.Pet.Id, t.AdoptDto) assert.False(t.T(), actual) assert.Equal(t.T(), expected, err) diff --git a/src/mocks/client/pet/pet.mock.go b/src/mocks/client/pet/pet.mock.go index 6428b0f..5148750 100644 --- a/src/mocks/client/pet/pet.mock.go +++ b/src/mocks/client/pet/pet.mock.go @@ -78,13 +78,3 @@ func (c *PetClientMock) Delete(ctx context.Context, in *petProto.DeletePetReques return res, args.Error(1) } - -func (c *PetClientMock) AdoptPet(ctx context.Context, in *petProto.AdoptPetRequest, opts ...grpc.CallOption) (res *petProto.AdoptPetResponse, err error) { - args := c.Called(in) - - if args.Get(0) != nil { - res = args.Get(0).(*petProto.AdoptPetResponse) - } - - return res, args.Error(1) -} diff --git a/src/mocks/service/pet/pet.mock.go b/src/mocks/service/pet/pet.mock.go index 90a639f..2e235bc 100644 --- a/src/mocks/service/pet/pet.mock.go +++ b/src/mocks/service/pet/pet.mock.go @@ -36,9 +36,9 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { } // Adopt mocks base method. -func (m *MockService) Adopt(arg0 *dto.AdoptDto) (bool, *dto.ResponseErr) { +func (m *MockService) Adopt(arg0 string, arg1 *dto.AdoptByRequest) (bool, *dto.ResponseErr) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Adopt", arg0) + ret := m.ctrl.Call(m, "Adopt", arg0, arg1) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 @@ -139,16 +139,3 @@ func (mr *MockServiceMockRecorder) Update(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockService)(nil).Update), arg0, arg1) } - -func (m *MockService) Adopt(petId string, in *dto.AdoptByRequest) (bool, *dto.ResponseErr) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Adopt", petId, in) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(*dto.ResponseErr) - return ret0, ret1 -} - -func (mr *MockServiceMockRecorder) Adopt(petId, in interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Adopt", reflect.TypeOf((*MockService)(nil).Adopt), petId, in) -} From cd3b103b46894861e1cbb47acb29d5988b350bc9 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:02:08 +0700 Subject: [PATCH 003/134] feat: usersvc findone --- src/app/constant/error.constant.go | 2 + src/app/dto/user.dto.go | 12 +++--- src/app/handler/user/user.handler.go | 5 ++- src/app/service/user/user.service.go | 55 +++++++++++++++++++++++++-- src/mocks/service/image/image.mock.go | 24 ++++++------ src/mocks/service/pet/pet.mock.go | 19 ++++----- src/mocks/service/user/user.mock.go | 6 +-- src/mocks/user/user.mock.go | 2 +- src/pkg/service/user/user.service.go | 4 +- 9 files changed, 88 insertions(+), 41 deletions(-) diff --git a/src/app/constant/error.constant.go b/src/app/constant/error.constant.go index cf607bc..fe4edb8 100644 --- a/src/app/constant/error.constant.go +++ b/src/app/constant/error.constant.go @@ -11,3 +11,5 @@ const UnavailableServiceMessage = "Unavailable Service" const PetNotFoundMessage = "Pet not found" const InvalidArgument = "Invalid Argument" + +const UserNotFoundMessage = "User not found" diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index 30d1320..0658faa 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -1,13 +1,13 @@ package dto -type UserDto struct { - Email string `json:"email" validate:"required,email"` - Password string `json:"password" validate:"required,gte=6,lte=30"` - Firstname string `json:"firstname" validate:"required"` - Lastname string `json:"lastname" validate:"required"` +type FindOneUserResponse struct { + Id string `json:"id"` + Email string `json:"email"` + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` } -type UpdateUserDto struct { +type UpdateUserRequest struct { Password string `json:"password" validate:"required,gte=6,lte=30"` Firstname string `json:"firstname" validate:"required"` Lastname string `json:"lastname" validate:"required"` diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index 9e25ed6..3ac1e8b 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -1,11 +1,12 @@ package user import ( + "net/http" + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/user" - "net/http" ) type Handler struct { @@ -41,7 +42,7 @@ func (h *Handler) FindOne(c *router.FiberCtx) { func (h *Handler) Update(c *router.FiberCtx) { usrId := c.UserID() - usrDto := dto.UpdateUserDto{} + usrDto := dto.UpdateUserRequest{} err := c.Bind(&usrDto) if err != nil { diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index 382bb3f..76d8abc 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -1,8 +1,16 @@ package user import ( + "context" + "net/http" + "time" + + "github.com/isd-sgcu/johnjud-gateway/src/app/constant" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" + "github.com/rs/zerolog/log" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) type Service struct { @@ -15,10 +23,51 @@ func NewService(client proto.UserServiceClient) *Service { } } -func (s *Service) FindOne(id string) (*proto.User, *dto.ResponseErr) { - return nil, nil +func (s *Service) FindOne(id string) (*dto.FindOneUserResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + response, err := s.client.FindOne(ctx, &proto.FindOneUserRequest{ + Id: id, + }) + if err != nil { + st, _ := status.FromError(err) + log.Error(). + Err(err). + Str("service", "user"). + Str("module", "find one"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.UserNotFoundMessage, + Data: nil, + } + + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + + return &dto.FindOneUserResponse{ + Id: response.User.Id, + Firstname: response.User.Firstname, + Lastname: response.User.Lastname, + Email: response.User.Email, + }, nil } -func (s *Service) Update(id string, in *dto.UpdateUserDto) (*proto.User, *dto.ResponseErr) { +func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*proto.User, *dto.ResponseErr) { return nil, nil } diff --git a/src/mocks/service/image/image.mock.go b/src/mocks/service/image/image.mock.go index 09a1ae0..c09925a 100644 --- a/src/mocks/service/image/image.mock.go +++ b/src/mocks/service/image/image.mock.go @@ -36,46 +36,46 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { } // Delete mocks base method. -func (m *MockService) Delete(id string) (bool, *dto.ResponseErr) { +func (m *MockService) Delete(arg0 string) (bool, *dto.ResponseErr) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", id) + ret := m.ctrl.Call(m, "Delete", arg0) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // Delete indicates an expected call of Delete. -func (mr *MockServiceMockRecorder) Delete(id interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) } // FindByPetId mocks base method. -func (m *MockService) FindByPetId(id string) ([]*v1.Image, *dto.ResponseErr) { +func (m *MockService) FindByPetId(arg0 string) ([]*v1.Image, *dto.ResponseErr) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindByPetId", id) + ret := m.ctrl.Call(m, "FindByPetId", arg0) ret0, _ := ret[0].([]*v1.Image) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // FindByPetId indicates an expected call of FindByPetId. -func (mr *MockServiceMockRecorder) FindByPetId(id interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) FindByPetId(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByPetId", reflect.TypeOf((*MockService)(nil).FindByPetId), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByPetId", reflect.TypeOf((*MockService)(nil).FindByPetId), arg0) } // Upload mocks base method. -func (m *MockService) Upload(in *dto.ImageDto) (*v1.Image, *dto.ResponseErr) { +func (m *MockService) Upload(arg0 *dto.ImageDto) (*v1.Image, *dto.ResponseErr) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Upload", in) + ret := m.ctrl.Call(m, "Upload", arg0) ret0, _ := ret[0].(*v1.Image) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // Upload indicates an expected call of Upload. -func (mr *MockServiceMockRecorder) Upload(in interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Upload(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockService)(nil).Upload), in) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockService)(nil).Upload), arg0) } diff --git a/src/mocks/service/pet/pet.mock.go b/src/mocks/service/pet/pet.mock.go index 1673704..b0e81c5 100644 --- a/src/mocks/service/pet/pet.mock.go +++ b/src/mocks/service/pet/pet.mock.go @@ -1,10 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./src/pkg/service/pet/pet.service.go -// -// Generated by this command: -// -// mockgen -source ./src/pkg/service/pet/pet.service.go -destination ./src/mocks/service/pet/pet.mock.go -// // Package mock_pet is a generated GoMock package. package mock_pet @@ -12,8 +7,8 @@ package mock_pet import ( reflect "reflect" - dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" gomock "github.com/golang/mock/gomock" + dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" ) // MockService is a mock of Service interface. @@ -49,7 +44,7 @@ func (m *MockService) Adopt(arg0 *dto.AdoptDto) (bool, *dto.ResponseErr) { } // Adopt indicates an expected call of Adopt. -func (mr *MockServiceMockRecorder) Adopt(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Adopt(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Adopt", reflect.TypeOf((*MockService)(nil).Adopt), arg0) } @@ -64,7 +59,7 @@ func (m *MockService) ChangeView(arg0 string, arg1 *dto.ChangeViewPetRequest) (* } // ChangeView indicates an expected call of ChangeView. -func (mr *MockServiceMockRecorder) ChangeView(arg0, arg1 any) *gomock.Call { +func (mr *MockServiceMockRecorder) ChangeView(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChangeView", reflect.TypeOf((*MockService)(nil).ChangeView), arg0, arg1) } @@ -79,7 +74,7 @@ func (m *MockService) Create(arg0 *dto.CreatePetRequest) (*dto.PetResponse, *dto } // Create indicates an expected call of Create. -func (mr *MockServiceMockRecorder) Create(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Create(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockService)(nil).Create), arg0) } @@ -94,7 +89,7 @@ func (m *MockService) Delete(arg0 string) (*dto.DeleteResponse, *dto.ResponseErr } // Delete indicates an expected call of Delete. -func (mr *MockServiceMockRecorder) Delete(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) } @@ -124,7 +119,7 @@ func (m *MockService) FindOne(arg0 string) (*dto.PetResponse, *dto.ResponseErr) } // FindOne indicates an expected call of FindOne. -func (mr *MockServiceMockRecorder) FindOne(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) FindOne(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindOne", reflect.TypeOf((*MockService)(nil).FindOne), arg0) } @@ -139,7 +134,7 @@ func (m *MockService) Update(arg0 string, arg1 *dto.UpdatePetRequest) (*dto.PetR } // Update indicates an expected call of Update. -func (mr *MockServiceMockRecorder) Update(arg0, arg1 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Update(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockService)(nil).Update), arg0, arg1) } diff --git a/src/mocks/service/user/user.mock.go b/src/mocks/service/user/user.mock.go index daa4fdb..581da09 100644 --- a/src/mocks/service/user/user.mock.go +++ b/src/mocks/service/user/user.mock.go @@ -36,10 +36,10 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { } // FindOne mocks base method. -func (m *MockService) FindOne(arg0 string) (*v1.User, *dto.ResponseErr) { +func (m *MockService) FindOne(arg0 string) (*dto.FindOneUserResponse, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FindOne", arg0) - ret0, _ := ret[0].(*v1.User) + ret0, _ := ret[0].(*dto.FindOneUserResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } @@ -51,7 +51,7 @@ func (mr *MockServiceMockRecorder) FindOne(arg0 interface{}) *gomock.Call { } // Update mocks base method. -func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserDto) (*v1.User, *dto.ResponseErr) { +func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserRequest) (*v1.User, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Update", arg0, arg1) ret0, _ := ret[0].(*v1.User) diff --git a/src/mocks/user/user.mock.go b/src/mocks/user/user.mock.go index 909dab8..b5a4a70 100644 --- a/src/mocks/user/user.mock.go +++ b/src/mocks/user/user.mock.go @@ -27,7 +27,7 @@ func (s *ServiceMock) FindOne(id string) (result *user_proto.User, err *dto.Resp return } -func (s *ServiceMock) Update(id string, in *dto.UpdateUserDto) (result *user_proto.User, err *dto.ResponseErr) { +func (s *ServiceMock) Update(id string, in *dto.UpdateUserRequest) (result *user_proto.User, err *dto.ResponseErr) { args := s.Called(id, in) if args.Get(0) != nil { diff --git a/src/pkg/service/user/user.service.go b/src/pkg/service/user/user.service.go index 1002d1d..99d6802 100644 --- a/src/pkg/service/user/user.service.go +++ b/src/pkg/service/user/user.service.go @@ -6,6 +6,6 @@ import ( ) type Service interface { - FindOne(string) (*user_proto.User, *dto.ResponseErr) - Update(string, *dto.UpdateUserDto) (*user_proto.User, *dto.ResponseErr) + FindOne(string) (*dto.FindOneUserResponse, *dto.ResponseErr) + Update(string, *dto.UpdateUserRequest) (*user_proto.User, *dto.ResponseErr) } From ce0e52f094ba98f6f0d50f2e03934792f55286bd Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:03:11 +0700 Subject: [PATCH 004/134] fix: typo --- src/app/service/pet/pet.service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 147b22c..fe0b4c7 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -94,7 +94,7 @@ func (s *Service) FindOne(id string) (result *dto.PetResponse, err *dto.Response return findOneResponse, nil } -func (s *Service) Create(in *dto.CreatePetRequest) (ressult *dto.PetResponse, err *dto.ResponseErr) { +func (s *Service) Create(in *dto.CreatePetRequest) (result *dto.PetResponse, err *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() From dc549036e8b81607e94a76335735043fe9739450 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:11:59 +0700 Subject: [PATCH 005/134] feat: usersvc update --- src/app/dto/user.dto.go | 7 +++++ src/app/service/user/user.service.go | 47 ++++++++++++++++++++++++++-- src/mocks/service/user/user.mock.go | 5 ++- src/pkg/service/user/user.service.go | 3 +- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index 0658faa..b2e67ed 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -12,3 +12,10 @@ type UpdateUserRequest struct { Firstname string `json:"firstname" validate:"required"` Lastname string `json:"lastname" validate:"required"` } + +type UpdateUserResponse struct { + Id string `json:"id"` + Email string `json:"email"` + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` +} diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index 76d8abc..24f6f3a 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -68,6 +68,49 @@ func (s *Service) FindOne(id string) (*dto.FindOneUserResponse, *dto.ResponseErr }, nil } -func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*proto.User, *dto.ResponseErr) { - return nil, nil +func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + response, err := s.client.Update(ctx, &proto.UpdateUserRequest{ + Id: id, + Firstname: in.Firstname, + Lastname: in.Lastname, + }) + if err != nil { + st, _ := status.FromError(err) + log.Error(). + Err(err). + Str("service", "user"). + Str("module", "update"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.UserNotFoundMessage, + Data: nil, + } + + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + + return &dto.UpdateUserResponse{ + Id: response.User.Id, + Firstname: response.User.Firstname, + Lastname: response.User.Lastname, + Email: response.User.Email, + }, nil } diff --git a/src/mocks/service/user/user.mock.go b/src/mocks/service/user/user.mock.go index 581da09..92f7776 100644 --- a/src/mocks/service/user/user.mock.go +++ b/src/mocks/service/user/user.mock.go @@ -9,7 +9,6 @@ import ( gomock "github.com/golang/mock/gomock" dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - v1 "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" ) // MockService is a mock of Service interface. @@ -51,10 +50,10 @@ func (mr *MockServiceMockRecorder) FindOne(arg0 interface{}) *gomock.Call { } // Update mocks base method. -func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserRequest) (*v1.User, *dto.ResponseErr) { +func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Update", arg0, arg1) - ret0, _ := ret[0].(*v1.User) + ret0, _ := ret[0].(*dto.UpdateUserResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } diff --git a/src/pkg/service/user/user.service.go b/src/pkg/service/user/user.service.go index 99d6802..a3bae68 100644 --- a/src/pkg/service/user/user.service.go +++ b/src/pkg/service/user/user.service.go @@ -2,10 +2,9 @@ package user import ( "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - user_proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" ) type Service interface { FindOne(string) (*dto.FindOneUserResponse, *dto.ResponseErr) - Update(string, *dto.UpdateUserRequest) (*user_proto.User, *dto.ResponseErr) + Update(string, *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) } From 59baa4869bbdb62345a60c6aa909e15ce983875c Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:18:36 +0700 Subject: [PATCH 006/134] fix: remove validation in resp --- src/app/dto/pet.dto.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 0d7c5b1..1e99090 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -55,7 +55,7 @@ type ChangeViewPetRequest struct { } type ChangeViewPetResponse struct { - Success bool `json:"success" validate:"required"` + Success bool `json:"success"` } type UpdatePetRequest struct { @@ -81,5 +81,5 @@ type DeleteRequest struct { Id string `json:"id" validate:"required"` } type DeleteResponse struct { - Success bool `json:"success" validate:"required"` + Success bool `json:"success"` } From 6ab09337c7319e185f1b27b469d8dfe022774bd1 Mon Sep 17 00:00:00 2001 From: Sunioatm <104454675+Sunioatm@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:22:59 +0700 Subject: [PATCH 007/134] fix: handler --- src/app/dto/adopt.dto.go | 3 ++- src/app/handler/pet/pet.handler.go | 19 +++++++++++++++---- src/app/service/pet/pet.service.go | 2 +- src/app/service/pet/pet.service_test.go | 6 ++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/app/dto/adopt.dto.go b/src/app/dto/adopt.dto.go index fd42a51..e42302d 100644 --- a/src/app/dto/adopt.dto.go +++ b/src/app/dto/adopt.dto.go @@ -6,5 +6,6 @@ type AdoptDto struct { } type AdoptByRequest struct { - Adopt AdoptDto `json:"adopt" validate:"required"` + UserID string `json:"user_id" validate:"required"` + PetID string `json:"pet_id" validate:"required"` } diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index d43414c..560be0b 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -288,6 +288,20 @@ func (h *Handler) Delete(c router.IContext) { return } +// Adopt is a function that handles the adoption of a pet in the database +// @Summary Adopt a pet +// @Description Return true if the pet is successfully adopted +// @Param id path string true "Pet ID" +// @Param user_id body string true "User ID" +// @Param pet_id body string true "Pet ID" +// @Tags pet +// @Accept json +// @Produce json +// @Success 201 {object} bool +// @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" +// @Failure 500 {object} dto.ResponseInternalErr "Internal service error" +// @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" +// @Router /v1/pets/{id}/adopt [put] func (h *Handler) Adopt(c router.IContext) { petId, err := c.Param("id") if err != nil { @@ -299,10 +313,7 @@ func (h *Handler) Adopt(c router.IContext) { return } - request := &dto.AdoptByRequest{ - Adopt: dto.AdoptDto{}, - } - + request := &dto.AdoptByRequest{} err = c.Bind(request) if err != nil { c.JSON(http.StatusBadRequest, dto.ResponseErr{ diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 03eb118..4d2904f 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -277,7 +277,7 @@ func (s *Service) Adopt(petId string, in *dto.AdoptByRequest) (result bool, err request := &proto.AdoptPetRequest{ PetId: petId, - UserId: in.Adopt.UserID, + UserId: in.UserID, } res, errRes := s.petClient.AdoptPet(ctx, request) diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index c1ad487..4191741 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -141,10 +141,8 @@ func (t *PetServiceTest) SetupTest() { } t.AdoptDto = &dto.AdoptByRequest{ - Adopt: dto.AdoptDto{ - PetID: t.Pet.Id, - UserID: t.Pet.AdoptBy, - }, + PetID: t.Pet.Id, + UserID: t.Pet.AdoptBy, } t.AdoptReq = &petProto.AdoptPetRequest{ From 3ac9671df6aaadf128a5cdec2ab1a0ba17309808 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:25:16 +0700 Subject: [PATCH 008/134] feat: user svc delete --- src/app/dto/user.dto.go | 4 ++++ src/app/service/user/user.service.go | 31 ++++++++++++++++++++++++++-- src/mocks/service/user/user.mock.go | 15 ++++++++++++++ src/pkg/service/user/user.service.go | 1 + 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index b2e67ed..dcabf42 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -19,3 +19,7 @@ type UpdateUserResponse struct { Firstname string `json:"firstname"` Lastname string `json:"lastname"` } + +type DeleteUserResponse struct { + Success bool `json:"success" validate:"required"` +} diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index 24f6f3a..d5d5a3d 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -85,10 +85,10 @@ func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserR Str("module", "update"). Msg(st.Message()) switch st.Code() { - case codes.NotFound: + case codes.AlreadyExists: return nil, &dto.ResponseErr{ StatusCode: http.StatusNotFound, - Message: constant.UserNotFoundMessage, + Message: constant.DuplicateEmailMessage, Data: nil, } @@ -114,3 +114,30 @@ func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserR Email: response.User.Email, }, nil } + +func (s *Service) Delete(id string) (*dto.DeleteUserResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + response, err := s.client.Delete(ctx, &proto.DeleteUserRequest{ + Id: id, + }) + if err != nil { + st, _ := status.FromError(err) + log.Error(). + Err(err). + Str("service", "user"). + Str("module", "delete"). + Msg(st.Message()) + + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + + return &dto.DeleteUserResponse{ + Success: response.Success, + }, nil +} diff --git a/src/mocks/service/user/user.mock.go b/src/mocks/service/user/user.mock.go index 92f7776..d48aad4 100644 --- a/src/mocks/service/user/user.mock.go +++ b/src/mocks/service/user/user.mock.go @@ -34,6 +34,21 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { return m.recorder } +// Delete mocks base method. +func (m *MockService) Delete(arg0 string) (*dto.DeleteUserResponse, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0) + ret0, _ := ret[0].(*dto.DeleteUserResponse) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +// Delete indicates an expected call of Delete. +func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) +} + // FindOne mocks base method. func (m *MockService) FindOne(arg0 string) (*dto.FindOneUserResponse, *dto.ResponseErr) { m.ctrl.T.Helper() diff --git a/src/pkg/service/user/user.service.go b/src/pkg/service/user/user.service.go index a3bae68..15d58fb 100644 --- a/src/pkg/service/user/user.service.go +++ b/src/pkg/service/user/user.service.go @@ -7,4 +7,5 @@ import ( type Service interface { FindOne(string) (*dto.FindOneUserResponse, *dto.ResponseErr) Update(string, *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) + Delete(string) (*dto.DeleteUserResponse, *dto.ResponseErr) } From 3059615aabe49be0149b7167134f4646aa999a51 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Fri, 5 Jan 2024 23:28:31 +0700 Subject: [PATCH 009/134] fix: pet svc delete return nil --- src/app/service/pet/pet.service.go | 31 +++++++++++-------------- src/app/service/pet/pet.service_test.go | 4 ++-- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index fe0b4c7..6cfe664 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -196,29 +196,24 @@ func (s *Service) Delete(id string) (result *dto.DeleteResponse, err *dto.Respon Msg(st.Message()) switch st.Code() { case codes.NotFound: - return &dto.DeleteResponse{ - Success: false, - }, &dto.ResponseErr{ - StatusCode: http.StatusNotFound, - Message: constant.PetNotFoundMessage, - Data: nil, - } + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.PetNotFoundMessage, + Data: nil, + } case codes.Unavailable: - return &dto.DeleteResponse{ - Success: false, - }, &dto.ResponseErr{ - StatusCode: http.StatusServiceUnavailable, - Message: constant.UnavailableServiceMessage, - Data: nil, - } - } - return &dto.DeleteResponse{ - Success: false, - }, &dto.ResponseErr{ + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ StatusCode: http.StatusInternalServerError, Message: constant.InternalErrorMessage, Data: nil, } + } } return &dto.DeleteResponse{ Success: res.Success, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index abab448..aaa2b73 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -434,7 +434,7 @@ func (t *PetServiceTest) TestDeleteNotFound() { svc := NewService(client) actual, err := svc.Delete(t.Pet.Id) - assert.Equal(t.T(), &dto.DeleteResponse{Success: false}, actual) + assert.Nil(t.T(), actual) assert.Equal(t.T(), expected, err) } @@ -455,7 +455,7 @@ func (t *PetServiceTest) TestDeleteServiceUnavailableError() { svc := NewService(client) actual, err := svc.Delete(t.Pet.Id) - assert.Equal(t.T(), &dto.DeleteResponse{Success: false}, actual) + assert.Nil(t.T(), actual) assert.Equal(t.T(), expected, err) } From 020f89a0c329fce197b3a0ed17b72731cfb714e7 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 00:58:09 +0700 Subject: [PATCH 010/134] feat: like dto --- src/app/dto/like.dto.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/app/dto/like.dto.go b/src/app/dto/like.dto.go index 3caf974..9a1002f 100644 --- a/src/app/dto/like.dto.go +++ b/src/app/dto/like.dto.go @@ -1,10 +1,23 @@ package dto -import ( - "github.com/google/uuid" -) +type LikeResponse struct { + UserID string `json:"user_id"` + PetID string `json:"pet_id"` +} + +type FindLikeRequest struct { + UserID string `json:"user_id" validate:"required"` +} + +type CreateLikeRequest struct { + UserID string `json:"user_id" validate:"required"` + PetID string `json:"pet_id" validate:"required"` +} + +type DeleteLikeRequest struct { + Id string `json:"id" validate:"required"` +} -type LikeDto struct { - UserID uuid.UUID `json:"user_id" validate:"required"` - PetID uuid.UUID `json:"pet_id" validate:"required"` +type DeleteLikeResponse struct { + Success bool `json:"success"` } From 204753894866eac726c7516aca2e94166ef51c4c Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 00:58:23 +0700 Subject: [PATCH 011/134] feat: like service interface --- src/pkg/service/like/like.service.go | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/pkg/service/like/like.service.go diff --git a/src/pkg/service/like/like.service.go b/src/pkg/service/like/like.service.go new file mode 100644 index 0000000..0e5e089 --- /dev/null +++ b/src/pkg/service/like/like.service.go @@ -0,0 +1,9 @@ +package like + +import "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + +type Service interface { + FindByUserId(string) ([]*dto.LikeResponse, *dto.ResponseErr) + Create(*dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) + Delete(string) (*dto.DeleteResponse, *dto.ResponseErr) +} From eae566cd3596a21ce42acd5726fc47814d123620 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 00:58:30 +0700 Subject: [PATCH 012/134] feat: like utils --- src/app/utils/like/like.utils.go | 33 ++++++++++++++++++++++++++++++++ src/app/utils/pet/pet.utils.go | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/app/utils/like/like.utils.go diff --git a/src/app/utils/like/like.utils.go b/src/app/utils/like/like.utils.go new file mode 100644 index 0000000..1349010 --- /dev/null +++ b/src/app/utils/like/like.utils.go @@ -0,0 +1,33 @@ +package like + +import ( + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" +) + +func ProtoToDto(in *likeProto.Like) *dto.LikeResponse { + return &dto.LikeResponse{ + UserID: in.UserId, + PetID: in.PetId, + } +} + +func ProtoToDtoList(in []*likeProto.Like) []*dto.LikeResponse { + var res []*dto.LikeResponse + for _, i := range in { + res = append(res, &dto.LikeResponse{ + UserID: i.UserId, + PetID: i.PetId, + }) + } + return res +} + +func CreateDtoToProto(in *dto.CreateLikeRequest) *likeProto.CreateLikeRequest { + return &likeProto.CreateLikeRequest{ + Like: &likeProto.Like{ + UserId: in.UserID, + PetId: in.PetID, + }, + } +} diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index 0ed39e3..1f68987 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -122,7 +122,7 @@ func UpdateDtoToProto(id string, in *dto.UpdatePetRequest) *petproto.UpdatePetRe return req } -func RawToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.PetResponse { +func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.PetResponse { var resp []*dto.PetResponse for i, p := range in { pet := &dto.PetResponse{ From e84a5ca2104b6dcabe71049b52873019b820b50d Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 00:59:16 +0700 Subject: [PATCH 013/134] feat: like service --- src/app/service/like/like.service.go | 129 +++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 9 deletions(-) diff --git a/src/app/service/like/like.service.go b/src/app/service/like/like.service.go index ef610f6..caaa5a5 100644 --- a/src/app/service/like/like.service.go +++ b/src/app/service/like/like.service.go @@ -1,28 +1,139 @@ package like import ( + "context" + "net/http" + "time" + + "github.com/isd-sgcu/johnjud-gateway/src/app/constant" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" + utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/like" + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" + "github.com/rs/zerolog/log" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) type Service struct { - client proto.LikeServiceClient + client likeProto.LikeServiceClient } -func NewService(client proto.LikeServiceClient) *Service { +func NewService(client likeProto.LikeServiceClient) *Service { return &Service{ client: client, } } -func (s *Service) FindByUserId(userId string) ([]*proto.Like, *dto.ResponseErr) { - return nil, nil +func (s *Service) FindByUserId(userId string) ([]*likeProto.Like, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + res, errRes := s.client.FindByUserId(ctx, &likeProto.FindLikeByUserIdRequest{UserId: userId}) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Str("service", "like"). + Str("module", "find by user id"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: 0, + Message: "user not found", + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return res.Likes, nil } -func (s *Service) Create(in *dto.LikeDto) (*proto.Like, *dto.ResponseErr) { - return nil, nil +func (s *Service) Create(in *dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + request := utils.CreateDtoToProto(in) + res, errRes := s.client.Create(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "like"). + Str("module", "create"). + Msg(st.Message()) + switch st.Code() { + case codes.InvalidArgument: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidArgument, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return utils.ProtoToDto(res.Like), nil } -func (s *Service) Delete(id string) (bool, *dto.ResponseErr) { - return false, nil +func (s *Service) Delete(id string) (*dto.DeleteLikeResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + request := &likeProto.DeleteLikeRequest{ + Id: id, + } + + res, errRes := s.client.Delete(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "like"). + Str("module", "delete"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.PetNotFoundMessage, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return &dto.DeleteLikeResponse{ + Success: res.Success, + }, nil } From 77473bf112d3caccfe93da1732845dc80e3bf0c8 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:55:46 +0700 Subject: [PATCH 014/134] feat: add user error not found message --- src/app/constant/error.constant.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/constant/error.constant.go b/src/app/constant/error.constant.go index a618499..34ff2a8 100644 --- a/src/app/constant/error.constant.go +++ b/src/app/constant/error.constant.go @@ -9,4 +9,5 @@ const InternalErrorMessage = "Internal Error" const UnavailableServiceMessage = "Unavailable Service" const PetNotFoundMessage = "Pet not found" +const UserNotFoundMessage = "User not found" const InvalidArgument = "Invalid Argument" From 19efab203b5baa9ba1c0144cb8c35c79d3bc916a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:56:04 +0700 Subject: [PATCH 015/134] chore --- src/app/handler/pet/pet.handler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 9f613dd..0b0dab6 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -125,7 +125,7 @@ func (t *PetHandlerTest) SetupTest() { } func (t *PetHandlerTest) TestFindAllSuccess() { - findAllResponse := utils.RawToDtoList(t.Pets, t.ImagesList) + findAllResponse := utils.ProtoToDtoList(t.Pets, t.ImagesList) expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, Message: petconst.FindAllPetSuccessMessage, From f6871e433417e0b76d7e973ff57b3a18b8000319 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:56:27 +0700 Subject: [PATCH 016/134] feat: like service test --- src/app/service/like/like.service_test.go | 315 ++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 src/app/service/like/like.service_test.go diff --git a/src/app/service/like/like.service_test.go b/src/app/service/like/like.service_test.go new file mode 100644 index 0000000..8a6945a --- /dev/null +++ b/src/app/service/like/like.service_test.go @@ -0,0 +1,315 @@ +package like + +import ( + "net/http" + "testing" + + "github.com/bxcodec/faker/v4" + "github.com/isd-sgcu/johnjud-gateway/src/app/constant" + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/like" + likeMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/client/like" + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type LikeServiceTest struct { + suite.Suite + Likes []*likeProto.Like + Like *likeProto.Like + LikeResponse *dto.LikeResponse + CreateLikeProtoReq *likeProto.CreateLikeRequest + CreateLikeDtoReq *dto.CreateLikeRequest + DeleteLikeProtoReq *likeProto.DeleteLikeRequest + DeleteLikeDtoReq *dto.DeleteLikeRequest + NotFoundErr *dto.ResponseErr + + UnavailableServiceErr *dto.ResponseErr + InvalidArgumentErr *dto.ResponseErr + InternalErr *dto.ResponseErr +} + +func TestLikeService(t *testing.T) { + suite.Run(t, new(LikeServiceTest)) +} + +func (t *LikeServiceTest) SetupTest() { + var likes []*likeProto.Like + for i := 0; i <= 3; i++ { + like := &likeProto.Like{ + Id: faker.UUIDDigit(), + UserId: faker.UUIDDigit(), + PetId: faker.UUIDDigit(), + } + likes = append(likes, like) + } + + t.Likes = likes + t.Like = likes[0] + + t.CreateLikeProtoReq = &likeProto.CreateLikeRequest{ + Like: &likeProto.Like{ + UserId: t.Like.UserId, + PetId: t.Like.PetId, + }, + } + + t.CreateLikeDtoReq = &dto.CreateLikeRequest{ + UserID: t.Like.UserId, + PetID: t.Like.PetId, + } + + t.DeleteLikeProtoReq = &likeProto.DeleteLikeRequest{ + Id: t.Like.Id, + } + + t.UnavailableServiceErr = &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + + t.NotFoundErr = &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.UserNotFoundMessage, + Data: nil, + } + + t.InternalErr = &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + + t.InvalidArgumentErr = &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidArgument, + Data: nil, + } +} + +func (t *LikeServiceTest) TestFindByUserIdSuccess() { + protoReq := &likeProto.FindLikeByUserIdRequest{ + UserId: t.Like.UserId, + } + protoResp := &likeProto.FindLikeByUserIdResponse{ + Likes: t.Likes, + } + + expected := utils.ProtoToDtoList(t.Likes) + + client := likeMock.LikeClientMock{} + client.On("FindByUserId", protoReq).Return(protoResp, nil) + + svc := NewService(&client) + actual, err := svc.FindByUserId(t.Like.UserId) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *LikeServiceTest) TestFindByUserIdNotFoundError() { + protoReq := &likeProto.FindLikeByUserIdRequest{ + UserId: t.Like.UserId, + } + + clientErr := status.Error(codes.NotFound, constant.UserNotFoundMessage) + + expected := t.NotFoundErr + + client := likeMock.LikeClientMock{} + client.On("FindByUserId", protoReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.FindByUserId(t.Like.UserId) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestFindByUserIdUnavailableServiceError() { + protoReq := &likeProto.FindLikeByUserIdRequest{ + UserId: t.Like.UserId, + } + + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + + expected := t.UnavailableServiceErr + + client := likeMock.LikeClientMock{} + client.On("FindByUserId", protoReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.FindByUserId(t.Like.UserId) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestFindByUserIdInternalError() { + protoReq := &likeProto.FindLikeByUserIdRequest{ + UserId: t.Like.UserId, + } + + clientErr := status.Error(codes.Internal, constant.InternalErrorMessage) + + expected := t.InternalErr + + client := likeMock.LikeClientMock{} + client.On("FindByUserId", protoReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.FindByUserId(t.Like.UserId) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestCreateSuccess() { + protoReq := t.CreateLikeProtoReq + protoResp := &likeProto.CreateLikeResponse{ + Like: t.Like, + } + + expected := utils.ProtoToDto(t.Like) + + client := &likeMock.LikeClientMock{} + client.On("Create", protoReq).Return(protoResp, nil) + + svc := NewService(client) + actual, err := svc.Create(t.CreateLikeDtoReq) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *LikeServiceTest) TestCreateInvalidArgumentError() { + protoReq := t.CreateLikeProtoReq + + expected := t.InvalidArgumentErr + + clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgument) + + client := &likeMock.LikeClientMock{} + client.On("Create", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Create(t.CreateLikeDtoReq) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestCreateInternalError() { + protoReq := t.CreateLikeProtoReq + + expected := t.InvalidArgumentErr + + clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgument) + + client := &likeMock.LikeClientMock{} + client.On("Create", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Create(t.CreateLikeDtoReq) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestCreateUnavailableServiceError() { + protoReq := t.CreateLikeProtoReq + + expected := t.UnavailableServiceErr + + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + + client := &likeMock.LikeClientMock{} + client.On("Create", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Create(t.CreateLikeDtoReq) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestDeleteSuccess() { + protoReq := &likeProto.DeleteLikeRequest{ + Id: t.Like.Id, + } + protoResp := &likeProto.DeleteLikeResponse{ + Success: true, + } + + expected := &dto.DeleteLikeResponse{Success: true} + + client := &likeMock.LikeClientMock{} + client.On("Delete", protoReq).Return(protoResp, nil) + + svc := NewService(client) + actual, err := svc.Delete(t.Like.Id) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *LikeServiceTest) TestDeleteNotFoundError() { + protoReq := &likeProto.DeleteLikeRequest{ + Id: t.Like.Id, + } + + clientErr := status.Error(codes.NotFound, constant.UserNotFoundMessage) + + expected := t.NotFoundErr + + client := &likeMock.LikeClientMock{} + client.On("Delete", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Delete(t.Like.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestDeleteUnavailableServiceError() { + protoReq := &likeProto.DeleteLikeRequest{ + Id: t.Like.Id, + } + + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + + expected := t.UnavailableServiceErr + + client := &likeMock.LikeClientMock{} + client.On("Delete", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Delete(t.Like.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *LikeServiceTest) TestDeleteInternalError() { + protoReq := &likeProto.DeleteLikeRequest{ + Id: t.Like.Id, + } + + clientErr := status.Error(codes.Internal, constant.InternalErrorMessage) + + expected := t.InternalErr + + client := &likeMock.LikeClientMock{} + client.On("Delete", protoReq).Return(nil, clientErr) + + svc := NewService(client) + actual, err := svc.Delete(t.Like.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} From de0ead81a49f59c79520281c7b91065976e6048a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:56:50 +0700 Subject: [PATCH 017/134] feat: like client mock --- src/mocks/client/like/like.mock.go | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/mocks/client/like/like.mock.go diff --git a/src/mocks/client/like/like.mock.go b/src/mocks/client/like/like.mock.go new file mode 100644 index 0000000..1faca0e --- /dev/null +++ b/src/mocks/client/like/like.mock.go @@ -0,0 +1,38 @@ +package like + +import ( + "context" + + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" + "github.com/stretchr/testify/mock" + "google.golang.org/grpc" +) + +type LikeClientMock struct { + mock.Mock +} + +func (c *LikeClientMock) FindByUserId(ctx context.Context, in *likeProto.FindLikeByUserIdRequest, opts ...grpc.CallOption) (res *likeProto.FindLikeByUserIdResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*likeProto.FindLikeByUserIdResponse) + } + return res, args.Error(1) +} +func (c *LikeClientMock) Create(ctx context.Context, in *likeProto.CreateLikeRequest, opts ...grpc.CallOption) (res *likeProto.CreateLikeResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*likeProto.CreateLikeResponse) + } + return res, args.Error(1) +} +func (c *LikeClientMock) Delete(ctx context.Context, in *likeProto.DeleteLikeRequest, opts ...grpc.CallOption) (res *likeProto.DeleteLikeResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*likeProto.DeleteLikeResponse) + } + return res, args.Error(1) +} From fddf470e482b6e3b099482dbca4ef78a7ac8ec6e Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:56:54 +0700 Subject: [PATCH 018/134] chore --- src/app/service/pet/pet.service_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index abab448..f6ec81a 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -191,7 +191,7 @@ func (t *PetServiceTest) TestFindAllSuccess() { Pets: t.Pets, } - expected := utils.RawToDtoList(t.Pets, t.ImagesList) + expected := utils.ProtoToDtoList(t.Pets, t.ImagesList) client := petmock.PetClientMock{} client.On("FindAll", protoReq).Return(protoResp, nil) From a4f51158257c4c14692c17ab8227d9b299e218ef Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:58:20 +0700 Subject: [PATCH 019/134] chore --- src/app/service/pet/pet.service.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 147b22c..b6f2d4b 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -51,7 +51,7 @@ func (s *Service) FindAll() (result []*dto.PetResponse, err *dto.ResponseErr) { } } imagesList := utils.MockImageList(len(res.Pets)) - findAllResponse := utils.RawToDtoList(res.Pets, imagesList) + findAllResponse := utils.ProtoToDtoList(res.Pets, imagesList) return findAllResponse, nil } @@ -94,7 +94,7 @@ func (s *Service) FindOne(id string) (result *dto.PetResponse, err *dto.Response return findOneResponse, nil } -func (s *Service) Create(in *dto.CreatePetRequest) (ressult *dto.PetResponse, err *dto.ResponseErr) { +func (s *Service) Create(in *dto.CreatePetRequest) (result *dto.PetResponse, err *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() From 66b5de73ff7956a02f75bde526b1def9eeaa9cc0 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:58:40 +0700 Subject: [PATCH 020/134] chore --- src/app/service/like/like.service.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/service/like/like.service.go b/src/app/service/like/like.service.go index caaa5a5..d547c0e 100644 --- a/src/app/service/like/like.service.go +++ b/src/app/service/like/like.service.go @@ -24,7 +24,7 @@ func NewService(client likeProto.LikeServiceClient) *Service { } } -func (s *Service) FindByUserId(userId string) ([]*likeProto.Like, *dto.ResponseErr) { +func (s *Service) FindByUserId(userId string) ([]*dto.LikeResponse, *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -38,8 +38,8 @@ func (s *Service) FindByUserId(userId string) ([]*likeProto.Like, *dto.ResponseE switch st.Code() { case codes.NotFound: return nil, &dto.ResponseErr{ - StatusCode: 0, - Message: "user not found", + StatusCode: http.StatusNotFound, + Message: constant.UserNotFoundMessage, Data: nil, } case codes.Unavailable: @@ -56,7 +56,7 @@ func (s *Service) FindByUserId(userId string) ([]*likeProto.Like, *dto.ResponseE } } } - return res.Likes, nil + return utils.ProtoToDtoList(res.Likes), nil } func (s *Service) Create(in *dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) { @@ -116,7 +116,7 @@ func (s *Service) Delete(id string) (*dto.DeleteLikeResponse, *dto.ResponseErr) case codes.NotFound: return nil, &dto.ResponseErr{ StatusCode: http.StatusNotFound, - Message: constant.PetNotFoundMessage, + Message: constant.UserNotFoundMessage, Data: nil, } case codes.Unavailable: From 72069cbfa7999d2d0c90b7d4fce013f92a1d852f Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 01:58:46 +0700 Subject: [PATCH 021/134] chore --- src/app/handler/like/like.handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/handler/like/like.handler.go b/src/app/handler/like/like.handler.go index d01bf03..a10e930 100644 --- a/src/app/handler/like/like.handler.go +++ b/src/app/handler/like/like.handler.go @@ -14,7 +14,7 @@ type Handler struct { type Service interface { FindByUserId(string) ([]*proto.Like, *dto.ResponseErr) - Create(*dto.LikeDto) (*proto.Like, *dto.ResponseErr) + Create(*dto.CreateLikeRequest) (*proto.Like, *dto.ResponseErr) Delete(string) (bool, *dto.ResponseErr) } From 917c2784e3ebeb3403736103d47c960640e8f206 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:13:48 +0700 Subject: [PATCH 022/134] feat: like constant --- src/constant/like/like.constant.go | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/constant/like/like.constant.go diff --git a/src/constant/like/like.constant.go b/src/constant/like/like.constant.go new file mode 100644 index 0000000..35960ae --- /dev/null +++ b/src/constant/like/like.constant.go @@ -0,0 +1,5 @@ +package like + +const FindLikeSuccessMessage = "find likes success" +const CreateLikeSuccessMessage = "create like success" +const DelteLikeSuccessMessage = "delete like success" From e1069f32d01e4eb08dff738befd5c2533de696c4 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:13:51 +0700 Subject: [PATCH 023/134] chore --- src/app/handler/pet/pet.handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 6af1f2b..f3182cc 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -73,7 +73,7 @@ func (h *Handler) FindOne(c router.IContext) { if err != nil { c.JSON(http.StatusInternalServerError, dto.ResponseErr{ StatusCode: http.StatusInternalServerError, - Message: "Invalid ID", + Message: constant.InvalidID, Data: nil, }) return From 6fd72245f2e16a350ee33fc96c489c8907ce73c8 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:14:01 +0700 Subject: [PATCH 024/134] chore --- src/app/constant/error.constant.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/constant/error.constant.go b/src/app/constant/error.constant.go index 34ff2a8..893ef18 100644 --- a/src/app/constant/error.constant.go +++ b/src/app/constant/error.constant.go @@ -11,3 +11,4 @@ const UnavailableServiceMessage = "Unavailable Service" const PetNotFoundMessage = "Pet not found" const UserNotFoundMessage = "User not found" const InvalidArgument = "Invalid Argument" +const InvalidID = "Invalid ID" From 8fa01be55b966ace74eac72da3e503c733307aa6 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:14:07 +0700 Subject: [PATCH 025/134] feat: like handler --- src/app/handler/like/like.handler.go | 88 +++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/src/app/handler/like/like.handler.go b/src/app/handler/like/like.handler.go index a10e930..d00fa95 100644 --- a/src/app/handler/like/like.handler.go +++ b/src/app/handler/like/like.handler.go @@ -1,9 +1,14 @@ package auth import ( + "net/http" + "strings" + + "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" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" + likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" ) @@ -22,14 +27,91 @@ func NewHandler(service Service, validate *validator.DtoValidator) *Handler { return &Handler{service, validate} } -func (h *Handler) FindByUserId(c *router.FiberCtx) { +func (h *Handler) FindByUserId(c router.IContext) { + id, err := c.Param("id") + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InvalidID, + Data: nil, + }) + return + } + + response, respErr := h.service.FindByUserId(id) + if respErr != nil { + c.JSON(respErr.StatusCode, respErr) + return + } + c.JSON(http.StatusOK, dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: likeConst.FindLikeSuccessMessage, + Data: response, + }) + return } -func (h *Handler) Create(c *router.FiberCtx) { +func (h *Handler) Create(c router.IContext) { + request := &dto.CreateLikeRequest{} + err := c.Bind(request) + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + err.Error(), + Data: nil, + }) + return + } + + if err := h.validate.Validate(request); err != nil { + var errorMessage []string + for _, reqErr := range err { + errorMessage = append(errorMessage, reqErr.Message) + } + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + }) + return + } + response, respErr := h.service.Create(request) + if respErr != nil { + c.JSON(respErr.StatusCode, respErr) + return + } + + c.JSON(http.StatusCreated, dto.ResponseSuccess{ + StatusCode: http.StatusCreated, + Message: likeConst.CreateLikeSuccessMessage, + Data: response, + }) + return } -func (h *Handler) Delete(c *router.FiberCtx) { +func (h *Handler) Delete(c router.IContext) { + id, err := c.Param("id") + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: err.Error(), + Data: nil, + }) + return + } + + res, errRes := h.service.Delete(id) + if errRes != nil { + c.JSON(errRes.StatusCode, errRes) + return + } + c.JSON(http.StatusOK, dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: likeConst.DelteLikeSuccessMessage, + Data: res, + }) + return } From d22fe17667273bdc4697723d4e9e734f543db24c Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:46:37 +0700 Subject: [PATCH 026/134] chore --- src/app/constant/error.constant.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/constant/error.constant.go b/src/app/constant/error.constant.go index 893ef18..d97e0ce 100644 --- a/src/app/constant/error.constant.go +++ b/src/app/constant/error.constant.go @@ -7,8 +7,8 @@ const UnauthorizedMessage = "Unauthorized" const DuplicateEmailMessage = "Duplicate Email" const InternalErrorMessage = "Internal Error" const UnavailableServiceMessage = "Unavailable Service" +const InvalidIDMessage = "Invalid ID" +const InvalidArgumentMessage = "Invalid Argument" const PetNotFoundMessage = "Pet not found" const UserNotFoundMessage = "User not found" -const InvalidArgument = "Invalid Argument" -const InvalidID = "Invalid ID" From c70b1f12d6bb36ce40b8d10b5122ef34bd416942 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:46:51 +0700 Subject: [PATCH 027/134] feat: like service mock --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 6e0a369..e54dade 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ mock-gen: mockgen -source ./src/pkg/service/auth/auth.service.go -destination ./src/mocks/service/auth/auth.mock.go mockgen -source ./src/pkg/service/user/user.service.go -destination ./src/mocks/service/user/user.mock.go mockgen -source ./src/pkg/service/pet/pet.service.go -destination ./src/mocks/service/pet/pet.mock.go + mockgen -source ./src/pkg/service/like/like.service.go -destination ./src/mocks/service/like/like.mock.go mockgen -source ./src/pkg/service/image/image.service.go -destination ./src/mocks/service/image/image.mock.go mockgen -source ./src/app/validator/validator.go -destination ./src/mocks/validator/validator.mock.go mockgen -source ./src/app/router/context.go -destination ./src/mocks/router/context.mock.go From 89c2d59874bf7e6e8834f8b2ecf02934ef69c026 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:46:59 +0700 Subject: [PATCH 028/134] chore --- src/pkg/service/like/like.service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pkg/service/like/like.service.go b/src/pkg/service/like/like.service.go index 0e5e089..e260a4b 100644 --- a/src/pkg/service/like/like.service.go +++ b/src/pkg/service/like/like.service.go @@ -5,5 +5,5 @@ import "github.com/isd-sgcu/johnjud-gateway/src/app/dto" type Service interface { FindByUserId(string) ([]*dto.LikeResponse, *dto.ResponseErr) Create(*dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) - Delete(string) (*dto.DeleteResponse, *dto.ResponseErr) + Delete(string) (*dto.DeleteLikeResponse, *dto.ResponseErr) } From 63575d4e1b2a598f96ff1619378f2d8925b4874b Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:06 +0700 Subject: [PATCH 029/134] feat: gen service mock --- src/mocks/service/like/like.mock.go | 85 +++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/mocks/service/like/like.mock.go diff --git a/src/mocks/service/like/like.mock.go b/src/mocks/service/like/like.mock.go new file mode 100644 index 0000000..a40c24a --- /dev/null +++ b/src/mocks/service/like/like.mock.go @@ -0,0 +1,85 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: ./src/pkg/service/like/like.service.go +// +// Generated by this command: +// +// mockgen -source ./src/pkg/service/like/like.service.go -destination ./src/mocks/service/like/like.mock.go +// + +// Package mock_like is a generated GoMock package. +package mock_like + +import ( + reflect "reflect" + + dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + gomock "github.com/golang/mock/gomock" +) + +// MockService is a mock of Service interface. +type MockService struct { + ctrl *gomock.Controller + recorder *MockServiceMockRecorder +} + +// MockServiceMockRecorder is the mock recorder for MockService. +type MockServiceMockRecorder struct { + mock *MockService +} + +// NewMockService creates a new mock instance. +func NewMockService(ctrl *gomock.Controller) *MockService { + mock := &MockService{ctrl: ctrl} + mock.recorder = &MockServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockService) EXPECT() *MockServiceMockRecorder { + return m.recorder +} + +// Create mocks base method. +func (m *MockService) Create(arg0 *dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Create", arg0) + ret0, _ := ret[0].(*dto.LikeResponse) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +// Create indicates an expected call of Create. +func (mr *MockServiceMockRecorder) Create(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockService)(nil).Create), arg0) +} + +// Delete mocks base method. +func (m *MockService) Delete(arg0 string) (*dto.DeleteLikeResponse, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Delete", arg0) + ret0, _ := ret[0].(*dto.DeleteLikeResponse) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +// Delete indicates an expected call of Delete. +func (mr *MockServiceMockRecorder) Delete(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) +} + +// FindByUserId mocks base method. +func (m *MockService) FindByUserId(arg0 string) ([]*dto.LikeResponse, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "FindByUserId", arg0) + ret0, _ := ret[0].([]*dto.LikeResponse) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +// FindByUserId indicates an expected call of FindByUserId. +func (mr *MockServiceMockRecorder) FindByUserId(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByUserId", reflect.TypeOf((*MockService)(nil).FindByUserId), arg0) +} From 4502efc196551c0187ef2e62d172a5bb749a5617 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:18 +0700 Subject: [PATCH 030/134] chore --- src/app/service/pet/pet.service_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index f6ec81a..87fe217 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -180,7 +180,7 @@ func (t *PetServiceTest) SetupTest() { t.InvalidArgumentErr = &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: constant.InvalidArgument, + Message: constant.InvalidArgumentMessage, Data: nil, } } @@ -301,7 +301,7 @@ func (t *PetServiceTest) TestCreateInvalidArgumentError() { expected := t.InvalidArgumentErr - clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgument) + clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgumentMessage) client := &petmock.PetClientMock{} client.On("Create", protoReq).Return(nil, clientErr) From d6fd29015a2779f26f751baf7c3a077653b2e2f0 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:23 +0700 Subject: [PATCH 031/134] chore --- src/app/service/pet/pet.service.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index b6f2d4b..e68aef5 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -112,7 +112,7 @@ func (s *Service) Create(in *dto.CreatePetRequest) (result *dto.PetResponse, err case codes.InvalidArgument: return nil, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: constant.InvalidArgument, + Message: constant.InvalidArgumentMessage, Data: nil, } case codes.Unavailable: @@ -158,7 +158,7 @@ func (s *Service) Update(id string, in *dto.UpdatePetRequest) (result *dto.PetRe case codes.InvalidArgument: return nil, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: constant.InvalidArgument, + Message: constant.InvalidArgumentMessage, Data: nil, } case codes.Unavailable: From be17a319d0b512c355a4f4dc080257afe61d9d5f Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:31 +0700 Subject: [PATCH 032/134] chore --- src/app/service/like/like.service_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/service/like/like.service_test.go b/src/app/service/like/like.service_test.go index 8a6945a..c76c74c 100644 --- a/src/app/service/like/like.service_test.go +++ b/src/app/service/like/like.service_test.go @@ -86,7 +86,7 @@ func (t *LikeServiceTest) SetupTest() { t.InvalidArgumentErr = &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: constant.InvalidArgument, + Message: constant.InvalidArgumentMessage, Data: nil, } } @@ -191,7 +191,7 @@ func (t *LikeServiceTest) TestCreateInvalidArgumentError() { expected := t.InvalidArgumentErr - clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgument) + clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgumentMessage) client := &likeMock.LikeClientMock{} client.On("Create", protoReq).Return(nil, clientErr) @@ -208,7 +208,7 @@ func (t *LikeServiceTest) TestCreateInternalError() { expected := t.InvalidArgumentErr - clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgument) + clientErr := status.Error(codes.InvalidArgument, constant.InvalidArgumentMessage) client := &likeMock.LikeClientMock{} client.On("Create", protoReq).Return(nil, clientErr) From 9da17af844bfc64ad73c9435a12c69fb2474632a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:33 +0700 Subject: [PATCH 033/134] chore --- src/app/service/like/like.service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/service/like/like.service.go b/src/app/service/like/like.service.go index d547c0e..b966ae3 100644 --- a/src/app/service/like/like.service.go +++ b/src/app/service/like/like.service.go @@ -76,7 +76,7 @@ func (s *Service) Create(in *dto.CreateLikeRequest) (*dto.LikeResponse, *dto.Res case codes.InvalidArgument: return nil, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: constant.InvalidArgument, + Message: constant.InvalidArgumentMessage, Data: nil, } case codes.Unavailable: From ca876aaa2b42158e597881bf088552cf20b9fa75 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:47:56 +0700 Subject: [PATCH 034/134] fix: package name to `camelCase` --- src/app/handler/pet/pet.handler_test.go | 171 ++++++++++++------------ 1 file changed, 86 insertions(+), 85 deletions(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 0b0dab6..74f20d8 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -9,22 +9,23 @@ import ( "github.com/golang/mock/gomock" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" - mock_router "github.com/isd-sgcu/johnjud-gateway/src/mocks/router" - mock_image "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/image" - mock_pet "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/pet" - mock_validator "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" + routerMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/router" + imageMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/image" + petMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/pet" + validatorMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" + errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/pet" - petconst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" - 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" + petConst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" + petProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1" + imgProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" "github.com/stretchr/testify/suite" ) type PetHandlerTest struct { suite.Suite - Pet *pet_proto.Pet - Pets []*pet_proto.Pet + Pet *petProto.Pet + Pets []*petProto.Pet PetDto *dto.PetResponse CreatePetRequest *dto.CreatePetRequest ChangeViewPetRequest *dto.ChangeViewPetRequest @@ -33,8 +34,8 @@ type PetHandlerTest struct { NotFoundErr *dto.ResponseErr ServiceDownErr *dto.ResponseErr InternalErr *dto.ResponseErr - Images []*image_proto.Image - ImagesList [][]*image_proto.Image + Images []*imgProto.Image + ImagesList [][]*imgProto.Image } func TestPetHandler(t *testing.T) { @@ -45,19 +46,19 @@ func (t *PetHandlerTest) SetupTest() { imagesList := utils.MockImageList(3) t.ImagesList = imagesList t.Images = imagesList[0] - var pets []*pet_proto.Pet + var pets []*petProto.Pet for i := 0; i <= 3; i++ { - pet := &pet_proto.Pet{ + pet := &petProto.Pet{ Id: faker.UUIDDigit(), Type: faker.Word(), Species: faker.Word(), Name: faker.Name(), Birthdate: faker.Word(), - Gender: pet_proto.Gender(rand.Intn(1) + 1), + Gender: petProto.Gender(rand.Intn(1) + 1), Habit: faker.Paragraph(), Caption: faker.Paragraph(), - Images: []*image_proto.Image{}, - Status: pet_proto.PetStatus(rand.Intn(1) + 1), + Images: []*imgProto.Image{}, + Status: petProto.PetStatus(rand.Intn(1) + 1), IsSterile: true, IsVaccinated: true, IsVisible: true, @@ -108,18 +109,18 @@ func (t *PetHandlerTest) SetupTest() { t.NotFoundErr = &dto.ResponseErr{ StatusCode: http.StatusNotFound, - Message: "Pet not found", + Message: errConst.PetNotFoundMessage, Data: nil, } t.BindErr = &dto.ResponseErr{ StatusCode: http.StatusBadRequest, - Message: "Invalid ID", + Message: errConst.InvalidIDMessage, } t.InternalErr = &dto.ResponseErr{ StatusCode: http.StatusInternalServerError, - Message: "Internal Server Error", + Message: errConst.InternalErrorMessage, Data: nil, } } @@ -128,16 +129,16 @@ func (t *PetHandlerTest) TestFindAllSuccess() { findAllResponse := utils.ProtoToDtoList(t.Pets, t.ImagesList) expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.FindAllPetSuccessMessage, + Message: petConst.FindAllPetSuccessMessage, Data: findAllResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) petSvc.EXPECT().FindAll().Return(findAllResponse, nil) context.EXPECT().JSON(http.StatusOK, expectedResponse) @@ -150,16 +151,16 @@ func (t *PetHandlerTest) TestFindOneSuccess() { findOneResponse := utils.ProtoToDto(t.Pet, t.Images) expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.FindOnePetSuccessMessage, + Message: petConst.FindOnePetSuccessMessage, Data: findOneResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().FindOne(t.Pet.Id).Return(findOneResponse, nil) @@ -174,10 +175,10 @@ func (t *PetHandlerTest) TestFindOneNotFoundErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().FindOne(t.Pet.Id).Return(nil, findOneResponse) @@ -192,10 +193,10 @@ func (t *PetHandlerTest) TestFindOneGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().FindOne(t.Pet.Id).Return(nil, findOneResponse) @@ -209,16 +210,16 @@ func (t *PetHandlerTest) TestCreateSuccess() { createResponse := utils.ProtoToDto(t.Pet, t.Images) expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusCreated, - Message: petconst.CreatePetSuccessMessage, + Message: petConst.CreatePetSuccessMessage, Data: createResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Bind(t.CreatePetRequest).Return(nil) validator.EXPECT().Validate(t.CreatePetRequest).Return(nil) @@ -234,10 +235,10 @@ func (t *PetHandlerTest) TestCreateGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Bind(t.CreatePetRequest).Return(nil) validator.EXPECT().Validate(t.CreatePetRequest).Return(nil) @@ -252,16 +253,16 @@ func (t *PetHandlerTest) TestUpdateSuccess() { updateResponse := utils.ProtoToDto(t.Pet, t.Images) expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.UpdatePetSuccessMessage, + Message: petConst.UpdatePetSuccessMessage, Data: updateResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.UpdatePetRequest).Return(nil) @@ -278,10 +279,10 @@ func (t *PetHandlerTest) TestUpdateNotFound() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.UpdatePetRequest).Return(nil) @@ -298,10 +299,10 @@ func (t *PetHandlerTest) TestUpdateGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.UpdatePetRequest).Return(nil) @@ -319,16 +320,16 @@ func (t *PetHandlerTest) TestDeleteSuccess() { } expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.DeletePetSuccessMessage, + Message: petConst.DeletePetSuccessMessage, Data: deleteResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().Delete(t.Pet.Id).Return(deleteResponse, nil) @@ -344,10 +345,10 @@ func (t *PetHandlerTest) TestDeleteNotFound() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().Delete(t.Pet.Id).Return(deleteResponse, t.NotFoundErr) @@ -364,10 +365,10 @@ func (t *PetHandlerTest) TestDeleteGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) petSvc.EXPECT().Delete(t.Pet.Id).Return(deleteResponse, t.ServiceDownErr) @@ -383,16 +384,16 @@ func (t *PetHandlerTest) TestChangeViewSuccess() { } expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.ChangeViewPetSuccessMessage, + Message: petConst.ChangeViewPetSuccessMessage, Data: changeViewResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.ChangeViewPetRequest).Return(nil) @@ -411,10 +412,10 @@ func (t *PetHandlerTest) TestChangeViewNotFound() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.ChangeViewPetRequest).Return(nil) @@ -433,10 +434,10 @@ func (t *PetHandlerTest) TestChangeViewGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.ChangeViewPetRequest).Return(nil) From 8cdcd1b10cb0814021d9c19f3665998e05b14009 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:48:00 +0700 Subject: [PATCH 035/134] chore --- src/app/handler/pet/pet.handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index f3182cc..25fd22a 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -73,7 +73,7 @@ func (h *Handler) FindOne(c router.IContext) { if err != nil { c.JSON(http.StatusInternalServerError, dto.ResponseErr{ StatusCode: http.StatusInternalServerError, - Message: constant.InvalidID, + Message: constant.InvalidIDMessage, Data: nil, }) return From a21c3e196248ba874c6116ed5e961039e1d8f9b3 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:48:08 +0700 Subject: [PATCH 036/134] feat: like handler test --- src/app/handler/like/like.handler_test.go | 280 ++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 src/app/handler/like/like.handler_test.go diff --git a/src/app/handler/like/like.handler_test.go b/src/app/handler/like/like.handler_test.go new file mode 100644 index 0000000..db72655 --- /dev/null +++ b/src/app/handler/like/like.handler_test.go @@ -0,0 +1,280 @@ +package auth + +import ( + "net/http" + "testing" + + "github.com/bxcodec/faker/v4" + "github.com/golang/mock/gomock" + errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/like" + likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" + routerMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/router" + likeMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/like" + validatorMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" + "github.com/stretchr/testify/suite" +) + +type LikeHandlerTest struct { + suite.Suite + Likes []*likeProto.Like + Like *likeProto.Like + LikeResponse *dto.LikeResponse + CreateLikeRequest *dto.CreateLikeRequest + DeleteLikeRequest *dto.DeleteLikeRequest + NotFoundErr *dto.ResponseErr + + UnavailableServiceErr *dto.ResponseErr + InvalidArgumentErr *dto.ResponseErr + BindErr *dto.ResponseErr + InternalErr *dto.ResponseErr +} + +func TestLikeHandler(t *testing.T) { + suite.Run(t, new(LikeHandlerTest)) +} + +func (t *LikeHandlerTest) SetupTest() { + var likes []*likeProto.Like + for i := 0; i <= 3; i++ { + like := &likeProto.Like{ + Id: faker.UUIDDigit(), + UserId: faker.UUIDDigit(), + PetId: faker.UUIDDigit(), + } + likes = append(likes, like) + } + + t.Likes = likes + t.Like = likes[0] + + t.CreateLikeRequest = &dto.CreateLikeRequest{} + t.DeleteLikeRequest = &dto.DeleteLikeRequest{} + + t.NotFoundErr = &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: errConst.UserNotFoundMessage, + Data: nil, + } + + t.InternalErr = &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: errConst.InternalErrorMessage, + Data: nil, + } + + t.UnavailableServiceErr = &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: errConst.UnavailableServiceMessage, + Data: nil, + } +} + +func (t *LikeHandlerTest) TestFindLikesSuccess() { + findLikeResponse := utils.ProtoToDtoList(t.Likes) + expectedResponse := dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: likeConst.FindLikeSuccessMessage, + Data: findLikeResponse, + } + + controller := gomock.NewController(t.T()) + + likeSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + likeSvc.EXPECT().FindByUserId(t.Like.UserId).Return(utils.ProtoToDtoList(t.Likes), nil) + context.EXPECT().JSON(http.StatusOK, expectedResponse) + + handler := NewHandler(likeSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestFindLikeNotFoundError() { + findLikeErrorResponse := t.NotFoundErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, findLikeErrorResponse) + context.EXPECT().JSON(http.StatusNotFound, findLikeErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestFindLikeServiceUnavailableError() { + findLikeErrorResponse := t.UnavailableServiceErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, findLikeErrorResponse) + context.EXPECT().JSON(http.StatusServiceUnavailable, findLikeErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestFindLikeInternalError() { + findLikeErrorResponse := t.InternalErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, findLikeErrorResponse) + context.EXPECT().JSON(http.StatusInternalServerError, findLikeErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestCreateSuccess() { + createLikeResponse := utils.ProtoToDto(t.Like) + expectedResponse := dto.ResponseSuccess{ + StatusCode: http.StatusCreated, + Message: likeConst.CreateLikeSuccessMessage, + Data: createLikeResponse, + } + + controller := gomock.NewController(t.T()) + + likeSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Bind(t.CreateLikeRequest).Return(nil) + validator.EXPECT().Validate(t.CreateLikeRequest).Return(nil) + likeSvc.EXPECT().Create(t.CreateLikeRequest).Return(createLikeResponse, nil) + context.EXPECT().JSON(http.StatusCreated, expectedResponse) + + handler := NewHandler(likeSvc, validator) + handler.Create(context) +} + +func (t *LikeHandlerTest) TestCreateUnavailableServiceError() { + createLikeErrorResponse := t.UnavailableServiceErr + + controller := gomock.NewController(t.T()) + + likeSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Bind(t.CreateLikeRequest).Return(nil) + validator.EXPECT().Validate(t.CreateLikeRequest).Return(nil) + likeSvc.EXPECT().Create(t.CreateLikeRequest).Return(nil, createLikeErrorResponse) + context.EXPECT().JSON(http.StatusServiceUnavailable, createLikeErrorResponse) + + handler := NewHandler(likeSvc, validator) + handler.Create(context) +} + +func (t *LikeHandlerTest) TestCreateInternalError() { + createLikeErrorResponse := t.InternalErr + + controller := gomock.NewController(t.T()) + + likeSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Bind(t.CreateLikeRequest).Return(nil) + validator.EXPECT().Validate(t.CreateLikeRequest).Return(nil) + likeSvc.EXPECT().Create(t.CreateLikeRequest).Return(nil, createLikeErrorResponse) + context.EXPECT().JSON(http.StatusInternalServerError, createLikeErrorResponse) + + handler := NewHandler(likeSvc, validator) + handler.Create(context) +} + +func (t *LikeHandlerTest) TestDeleteSuccess() { + deleteResponse := &dto.DeleteLikeResponse{ + Success: true, + } + expectedResponse := dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: likeConst.DelteLikeSuccessMessage, + Data: deleteResponse, + } + + controller := gomock.NewController(t.T()) + + likeSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + likeSvc.EXPECT().Delete(t.Like.UserId).Return(deleteResponse, nil) + context.EXPECT().JSON(http.StatusOK, expectedResponse) + + handler := NewHandler(likeSvc, validator) + handler.Delete(context) +} + +func (t *LikeHandlerTest) TestDeleteNotFoundError() { + deleteErrorResponse := t.NotFoundErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, deleteErrorResponse) + context.EXPECT().JSON(http.StatusNotFound, deleteErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestDeleteServiceUnavailableError() { + deleteErrorResponse := t.UnavailableServiceErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, deleteErrorResponse) + context.EXPECT().JSON(http.StatusServiceUnavailable, deleteErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} + +func (t *LikeHandlerTest) TestDeleteInternalError() { + deleteErrorResponse := t.InternalErr + + controller := gomock.NewController(t.T()) + + petSvc := likeMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().Param("id").Return(t.Like.UserId, nil) + petSvc.EXPECT().FindByUserId(t.Like.UserId).Return(nil, deleteErrorResponse) + context.EXPECT().JSON(http.StatusInternalServerError, deleteErrorResponse) + + handler := NewHandler(petSvc, validator) + handler.FindByUserId(context) +} From 03d2afa9ac1ccceb3b859d07a829a4eec4a330b9 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 16:48:22 +0700 Subject: [PATCH 037/134] chore --- src/app/handler/like/like.handler.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/app/handler/like/like.handler.go b/src/app/handler/like/like.handler.go index d00fa95..e8be8ec 100644 --- a/src/app/handler/like/like.handler.go +++ b/src/app/handler/like/like.handler.go @@ -9,21 +9,20 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" - proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" ) type Handler struct { service Service - validate *validator.DtoValidator + validate validator.IDtoValidator } type Service interface { - FindByUserId(string) ([]*proto.Like, *dto.ResponseErr) - Create(*dto.CreateLikeRequest) (*proto.Like, *dto.ResponseErr) - Delete(string) (bool, *dto.ResponseErr) + FindByUserId(string) ([]*dto.LikeResponse, *dto.ResponseErr) + Create(*dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) + Delete(string) (*dto.DeleteLikeResponse, *dto.ResponseErr) } -func NewHandler(service Service, validate *validator.DtoValidator) *Handler { +func NewHandler(service Service, validate validator.IDtoValidator) *Handler { return &Handler{service, validate} } @@ -32,7 +31,7 @@ func (h *Handler) FindByUserId(c router.IContext) { if err != nil { c.JSON(http.StatusBadRequest, dto.ResponseErr{ StatusCode: http.StatusInternalServerError, - Message: constant.InvalidID, + Message: constant.InvalidIDMessage, Data: nil, }) return From 637c4eb736e7695c7bd08a5e38ac0b8cfce46957 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 17:03:41 +0700 Subject: [PATCH 038/134] feat: like endpoint --- src/main.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main.go b/src/main.go index aae156e..cfc31c8 100644 --- a/src/main.go +++ b/src/main.go @@ -12,12 +12,14 @@ import ( authHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/auth" healthcheck "github.com/isd-sgcu/johnjud-gateway/src/app/handler/healthcheck" + likeHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/like" petHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/pet" userHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/user" guard "github.com/isd-sgcu/johnjud-gateway/src/app/middleware/auth" "github.com/isd-sgcu/johnjud-gateway/src/app/router" authSvc "github.com/isd-sgcu/johnjud-gateway/src/app/service/auth" imageSvc "github.com/isd-sgcu/johnjud-gateway/src/app/service/image" + likeSvc "github.com/isd-sgcu/johnjud-gateway/src/app/service/like" petSvc "github.com/isd-sgcu/johnjud-gateway/src/app/service/pet" userSvc "github.com/isd-sgcu/johnjud-gateway/src/app/service/user" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" @@ -25,6 +27,7 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/constant/auth" authProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/auth/v1" userProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" + likeProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" petProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1" imageProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" "github.com/rs/zerolog/log" @@ -109,6 +112,10 @@ func main() { petService := petSvc.NewService(petClient) petHandler := petHdr.NewHandler(petService, imageService, v) + likeClient := likeProto.NewLikeServiceClient(backendConn) + likeService := likeSvc.NewService(likeClient) + likeHandler := likeHdr.NewHandler(likeService, v) + r := router.NewFiberRouter(&authGuard, conf.App) r.GetUser("/:id", userHandler.FindOne) @@ -129,6 +136,10 @@ func main() { r.PutPet("/:id/visible", petHandler.ChangeView) r.DeletePet("/:id", petHandler.Delete) + r.GetLike("/:id", likeHandler.FindByUserId) + r.PostLike("/", likeHandler.Create) + r.DeleteLike("/:id", likeHandler.Delete) + v1 := router.NewAPIv1(r, conf.App) go func() { From 99e72f448b21ec3b89ca3c902aafd99a686577a1 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 17:04:00 +0700 Subject: [PATCH 039/134] chore: use IContext instead *FiberCtx --- src/app/router/like.router.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/router/like.router.go b/src/app/router/like.router.go index 094d032..08395c4 100644 --- a/src/app/router/like.router.go +++ b/src/app/router/like.router.go @@ -2,21 +2,21 @@ package router import "github.com/gofiber/fiber/v2" -func (r *FiberRouter) GetLike(path string, h func(ctx *FiberCtx)) { +func (r *FiberRouter) GetLike(path string, h func(ctx IContext)) { r.like.Get(path, func(c *fiber.Ctx) error { h(NewFiberCtx(c)) return nil }) } -func (r *FiberRouter) PostLike(path string, h func(ctx *FiberCtx)) { +func (r *FiberRouter) PostLike(path string, h func(ctx IContext)) { r.like.Post(path, func(c *fiber.Ctx) error { h(NewFiberCtx(c)) return nil }) } -func (r *FiberRouter) DeleteLike(path string, h func(ctx *FiberCtx)) { +func (r *FiberRouter) DeleteLike(path string, h func(ctx IContext)) { r.like.Delete(path, func(c *fiber.Ctx) error { h(NewFiberCtx(c)) return nil From 7715d1380db91e4f626d9e164be3a0efb98ab67f Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 17:04:36 +0700 Subject: [PATCH 040/134] chore --- src/app/router/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/router/router.go b/src/app/router/router.go index 0c2716b..2a2bb91 100644 --- a/src/app/router/router.go +++ b/src/app/router/router.go @@ -52,7 +52,7 @@ func NewFiberRouter(authGuard IGuard, conf config.App) *FiberRouter { pet := GroupWithAuthMiddleware(r, "/pets", authGuard.Use) image := GroupWithAuthMiddleware(r, "/image", authGuard.Use) - like := GroupWithAuthMiddleware(r, "/like", authGuard.Use) + like := GroupWithAuthMiddleware(r, "/likes", authGuard.Use) return &FiberRouter{r, auth, user, pet, image, like} } From a1c96470fdcd6018a73e1f8b1f1b090afd978fa6 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sat, 6 Jan 2024 16:52:58 +0700 Subject: [PATCH 041/134] fix: build pkg add platform --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02a3fce..a0e9ba1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,7 @@ jobs: uses: docker/build-push-action@v2 with: context: . + platforms: linux/amd64,linux/arm64 push: true tags: ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }},${{ env.IMAGE_NAME }}:latest cache-from: type=registry,ref=${{ env.IMAGE_NAME }}:buildcache From 6d3a11f26aeae0db585c275aa576f7d515eca0e3 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:37:06 +0700 Subject: [PATCH 042/134] chore --- src/mocks/client/pet/pet.mock.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mocks/client/pet/pet.mock.go b/src/mocks/client/pet/pet.mock.go index 5148750..10554c2 100644 --- a/src/mocks/client/pet/pet.mock.go +++ b/src/mocks/client/pet/pet.mock.go @@ -12,7 +12,7 @@ type PetClientMock struct { mock.Mock } -func (c *PetClientMock) AdoptPet(ctx context.Context, in *petProto.AdoptPetRequest, opts ...grpc.CallOption) (res *petProto.AdoptPetResponse, err error) { +func (c *PetClientMock) AdoptPet(_ context.Context, in *petProto.AdoptPetRequest, _ ...grpc.CallOption) (res *petProto.AdoptPetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -21,7 +21,7 @@ func (c *PetClientMock) AdoptPet(ctx context.Context, in *petProto.AdoptPetReque return res, args.Error(1) } -func (c *PetClientMock) FindAll(ctx context.Context, in *petProto.FindAllPetRequest, opts ...grpc.CallOption) (res *petProto.FindAllPetResponse, err error) { +func (c *PetClientMock) FindAll(_ context.Context, in *petProto.FindAllPetRequest, _ ...grpc.CallOption) (res *petProto.FindAllPetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -30,7 +30,7 @@ func (c *PetClientMock) FindAll(ctx context.Context, in *petProto.FindAllPetRequ return res, args.Error(1) } -func (c *PetClientMock) FindOne(ctx context.Context, in *petProto.FindOnePetRequest, opts ...grpc.CallOption) (res *petProto.FindOnePetResponse, err error) { +func (c *PetClientMock) FindOne(_ context.Context, in *petProto.FindOnePetRequest, _ ...grpc.CallOption) (res *petProto.FindOnePetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -39,7 +39,7 @@ func (c *PetClientMock) FindOne(ctx context.Context, in *petProto.FindOnePetRequ return res, args.Error(1) } -func (c *PetClientMock) Create(ctx context.Context, in *petProto.CreatePetRequest, opts ...grpc.CallOption) (res *petProto.CreatePetResponse, err error) { +func (c *PetClientMock) Create(_ context.Context, in *petProto.CreatePetRequest, _ ...grpc.CallOption) (res *petProto.CreatePetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -49,7 +49,7 @@ func (c *PetClientMock) Create(ctx context.Context, in *petProto.CreatePetReques return res, args.Error(1) } -func (c *PetClientMock) Update(ctx context.Context, in *petProto.UpdatePetRequest, opts ...grpc.CallOption) (res *petProto.UpdatePetResponse, err error) { +func (c *PetClientMock) Update(_ context.Context, in *petProto.UpdatePetRequest, _ ...grpc.CallOption) (res *petProto.UpdatePetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -59,7 +59,7 @@ func (c *PetClientMock) Update(ctx context.Context, in *petProto.UpdatePetReques return res, args.Error(1) } -func (c *PetClientMock) ChangeView(ctx context.Context, in *petProto.ChangeViewPetRequest, opts ...grpc.CallOption) (res *petProto.ChangeViewPetResponse, err error) { +func (c *PetClientMock) ChangeView(_ context.Context, in *petProto.ChangeViewPetRequest, _ ...grpc.CallOption) (res *petProto.ChangeViewPetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -69,7 +69,7 @@ func (c *PetClientMock) ChangeView(ctx context.Context, in *petProto.ChangeViewP return res, args.Error(1) } -func (c *PetClientMock) Delete(ctx context.Context, in *petProto.DeletePetRequest, opts ...grpc.CallOption) (res *petProto.DeletePetResponse, err error) { +func (c *PetClientMock) Delete(_ context.Context, in *petProto.DeletePetRequest, _ ...grpc.CallOption) (res *petProto.DeletePetResponse, err error) { args := c.Called(in) if args.Get(0) != nil { From a7c4a02fa130b01e4872d55c4dedbea1c3398f03 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:37:10 +0700 Subject: [PATCH 043/134] chore --- src/mocks/client/like/like.mock.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mocks/client/like/like.mock.go b/src/mocks/client/like/like.mock.go index 1faca0e..0bb7bd8 100644 --- a/src/mocks/client/like/like.mock.go +++ b/src/mocks/client/like/like.mock.go @@ -12,7 +12,7 @@ type LikeClientMock struct { mock.Mock } -func (c *LikeClientMock) FindByUserId(ctx context.Context, in *likeProto.FindLikeByUserIdRequest, opts ...grpc.CallOption) (res *likeProto.FindLikeByUserIdResponse, err error) { +func (c *LikeClientMock) FindByUserId(_ context.Context, in *likeProto.FindLikeByUserIdRequest, _ ...grpc.CallOption) (res *likeProto.FindLikeByUserIdResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -20,7 +20,7 @@ func (c *LikeClientMock) FindByUserId(ctx context.Context, in *likeProto.FindLik } return res, args.Error(1) } -func (c *LikeClientMock) Create(ctx context.Context, in *likeProto.CreateLikeRequest, opts ...grpc.CallOption) (res *likeProto.CreateLikeResponse, err error) { +func (c *LikeClientMock) Create(_ context.Context, in *likeProto.CreateLikeRequest, _ ...grpc.CallOption) (res *likeProto.CreateLikeResponse, err error) { args := c.Called(in) if args.Get(0) != nil { @@ -28,7 +28,7 @@ func (c *LikeClientMock) Create(ctx context.Context, in *likeProto.CreateLikeReq } return res, args.Error(1) } -func (c *LikeClientMock) Delete(ctx context.Context, in *likeProto.DeleteLikeRequest, opts ...grpc.CallOption) (res *likeProto.DeleteLikeResponse, err error) { +func (c *LikeClientMock) Delete(_ context.Context, in *likeProto.DeleteLikeRequest, _ ...grpc.CallOption) (res *likeProto.DeleteLikeResponse, err error) { args := c.Called(in) if args.Get(0) != nil { From 325fa121e4bf3f71699bb5b630cd9173704ab758 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:37:28 +0700 Subject: [PATCH 044/134] fix: use `Service` from `pkg` instead hand written --- src/app/handler/pet/pet.handler.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 55eb678..f167a1c 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -6,28 +6,20 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/constant" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - imageSvc "github.com/isd-sgcu/johnjud-gateway/src/app/handler/image" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" petconst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" + imageSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/image" + petSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/pet" ) type Handler struct { - service Service + service petSvc.Service imageService imageSvc.Service validate validator.IDtoValidator } -type Service interface { - FindAll() ([]*dto.PetResponse, *dto.ResponseErr) - FindOne(string) (*dto.PetResponse, *dto.ResponseErr) - Create(*dto.CreatePetRequest) (*dto.PetResponse, *dto.ResponseErr) - Update(string, *dto.UpdatePetRequest) (*dto.PetResponse, *dto.ResponseErr) - ChangeView(string, *dto.ChangeViewPetRequest) (*dto.ChangeViewPetResponse, *dto.ResponseErr) - Delete(string) (*dto.DeleteResponse, *dto.ResponseErr) -} - -func NewHandler(service Service, imageService imageSvc.Service, validate validator.IDtoValidator) *Handler { +func NewHandler(service petSvc.Service, imageService imageSvc.Service, validate validator.IDtoValidator) *Handler { return &Handler{service, imageService, validate} } From 19729f497504a0c370c1b5116a4ea6e4da3a79ce Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:37:46 +0700 Subject: [PATCH 045/134] fix: use `Service` from `pkg` instead of hand written --- src/app/handler/like/like.handler.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/app/handler/like/like.handler.go b/src/app/handler/like/like.handler.go index e8be8ec..ab57fd8 100644 --- a/src/app/handler/like/like.handler.go +++ b/src/app/handler/like/like.handler.go @@ -9,20 +9,15 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" + likeSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/like" ) type Handler struct { - service Service + service likeSvc.Service validate validator.IDtoValidator } -type Service interface { - FindByUserId(string) ([]*dto.LikeResponse, *dto.ResponseErr) - Create(*dto.CreateLikeRequest) (*dto.LikeResponse, *dto.ResponseErr) - Delete(string) (*dto.DeleteLikeResponse, *dto.ResponseErr) -} - -func NewHandler(service Service, validate validator.IDtoValidator) *Handler { +func NewHandler(service likeSvc.Service, validate validator.IDtoValidator) *Handler { return &Handler{service, validate} } From f87e1bc19fcd3a6b33475465f7d753e2921e55b1 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 18:38:13 +0700 Subject: [PATCH 046/134] fix: use `Service` from `pkg` --- src/app/handler/image/image.handler.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/app/handler/image/image.handler.go b/src/app/handler/image/image.handler.go index 552498b..7e496cb 100644 --- a/src/app/handler/image/image.handler.go +++ b/src/app/handler/image/image.handler.go @@ -1,24 +1,17 @@ package auth import ( - "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" - proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" + imageSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/image" ) type Handler struct { - service Service + service imageSvc.Service validate *validator.DtoValidator } -type Service interface { - FindByPetId(string) ([]*proto.Image, *dto.ResponseErr) - Upload(*dto.ImageDto) (*proto.Image, *dto.ResponseErr) - Delete(string) (bool, *dto.ResponseErr) -} - -func NewHandler(service Service, validate *validator.DtoValidator) *Handler { +func NewHandler(service imageSvc.Service, validate *validator.DtoValidator) *Handler { return &Handler{service, validate} } From cabac9bd3ad35a233d7f985d23764595d012a91b Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:33:42 +0700 Subject: [PATCH 047/134] chore --- src/app/service/pet/pet.service.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index e68aef5..7798ad0 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -18,6 +18,11 @@ type Service struct { petClient petproto.PetServiceClient } +// Adopt implements pet.Service. +func (*Service) Adopt(*dto.AdoptDto) (bool, *dto.ResponseErr) { + panic("unimplemented") +} + func NewService(petClient petproto.PetServiceClient) *Service { return &Service{ petClient: petClient, From 495bc8e39652b27d6dcfc237f21f58650a0bd226 Mon Sep 17 00:00:00 2001 From: Sunioatm <104454675+Sunioatm@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:44:12 +0700 Subject: [PATCH 048/134] fix: change variable name - change to make variable name consistency with dev branch --- src/app/handler/pet/pet.handler_test.go | 26 ++++++++++++------------- src/app/service/pet/pet.service.go | 5 ----- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index ad5e326..659e221 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -459,16 +459,16 @@ func (t *PetHandlerTest) TestAdoptSuccess() { } expectedResponse := dto.ResponseSuccess{ StatusCode: http.StatusOK, - Message: petconst.AdoptPetSuccessMessage, + Message: petConst.AdoptPetSuccessMessage, Data: adoptByResponse, } controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.AdoptByRequest).Return(nil) @@ -487,10 +487,10 @@ func (t *PetHandlerTest) TestAdoptNotFound() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.AdoptByRequest).Return(nil) @@ -509,10 +509,10 @@ func (t *PetHandlerTest) TestAdoptGrpcErr() { controller := gomock.NewController(t.T()) - petSvc := mock_pet.NewMockService(controller) - imageSvc := mock_image.NewMockService(controller) - validator := mock_validator.NewMockIDtoValidator(controller) - context := mock_router.NewMockIContext(controller) + petSvc := petMock.NewMockService(controller) + imageSvc := imageMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) context.EXPECT().Param("id").Return(t.Pet.Id, nil) context.EXPECT().Bind(t.AdoptByRequest).Return(nil) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index d8e8cf1..8cc0401 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -18,11 +18,6 @@ type Service struct { petClient petproto.PetServiceClient } -// Adopt implements pet.Service. -func (*Service) Adopt(*dto.AdoptDto) (bool, *dto.ResponseErr) { - panic("unimplemented") -} - func NewService(petClient petproto.PetServiceClient) *Service { return &Service{ petClient: petClient, From 3caba53c2f01267f913287c1271971599018a57b Mon Sep 17 00:00:00 2001 From: Sunioatm <104454675+Sunioatm@users.noreply.github.com> Date: Sun, 7 Jan 2024 00:28:55 +0700 Subject: [PATCH 049/134] fix: changes requested - remove response validate required - adopt service error return nil - fix test --- src/app/dto/adopt.dto.go | 2 +- src/app/service/pet/pet.service.go | 16 ++++++---------- src/app/service/pet/pet.service_test.go | 14 ++++---------- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/app/dto/adopt.dto.go b/src/app/dto/adopt.dto.go index 5cf4ad2..56ecaef 100644 --- a/src/app/dto/adopt.dto.go +++ b/src/app/dto/adopt.dto.go @@ -11,5 +11,5 @@ type AdoptByRequest struct { } type AdoptByResponse struct { - Success bool `json:"success" validate:"required"` + Success bool `json:"success"` } diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 8cc0401..4362e19 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -280,7 +280,6 @@ func (s *Service) Adopt(petId string, in *dto.AdoptByRequest) (result *dto.Adopt UserId: in.UserID, PetId: in.PetID, }) - if errRes != nil { st, _ := status.FromError(errRes) log.Error(). @@ -290,25 +289,22 @@ func (s *Service) Adopt(petId string, in *dto.AdoptByRequest) (result *dto.Adopt Msg(st.Message()) switch st.Code() { case codes.NotFound: - return &dto.AdoptByResponse{ - Success: false, - }, &dto.ResponseErr{ + return nil, + &dto.ResponseErr{ StatusCode: http.StatusNotFound, Message: constant.PetNotFoundMessage, Data: nil, } case codes.Unavailable: - return &dto.AdoptByResponse{ - Success: false, - }, &dto.ResponseErr{ + return nil, + &dto.ResponseErr{ StatusCode: http.StatusServiceUnavailable, Message: constant.UnavailableServiceMessage, Data: nil, } default: - return &dto.AdoptByResponse{ - Success: false, - }, &dto.ResponseErr{ + return nil, + &dto.ResponseErr{ StatusCode: http.StatusServiceUnavailable, Message: constant.InternalErrorMessage, Data: nil, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index 797af40..5705c12 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -539,40 +539,34 @@ func (t *PetServiceTest) TestAdoptSuccess() { func (t *PetServiceTest) TestAdoptNotFoundError() { protoReq := t.AdoptReq - protoResp := &petproto.AdoptPetResponse{ - Success: false, - } clientErr := status.Error(codes.NotFound, constant.PetNotFoundMessage) expected := t.NotFoundErr client := &petmock.PetClientMock{} - client.On("AdoptPet", protoReq).Return(protoResp, clientErr) + client.On("AdoptPet", protoReq).Return(nil, clientErr) svc := NewService(client) actual, err := svc.Adopt(t.Pet.Id, t.AdoptDto) - assert.Equal(t.T(), &dto.AdoptByResponse{Success: false}, actual) + assert.Nil(t.T(), actual) assert.Equal(t.T(), expected, err) } func (t *PetServiceTest) TestAdoptUnavailableServiceError() { protoReq := t.AdoptReq - protoResp := &petproto.AdoptPetResponse{ - Success: false, - } clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) expected := t.UnavailableServiceErr client := &petmock.PetClientMock{} - client.On("AdoptPet", protoReq).Return(protoResp, clientErr) + client.On("AdoptPet", protoReq).Return(nil, clientErr) svc := NewService(client) actual, err := svc.Adopt(t.Pet.Id, t.AdoptDto) - assert.Equal(t.T(), &dto.AdoptByResponse{Success: false}, actual) + assert.Nil(t.T(), actual) assert.Equal(t.T(), expected, err) } From ba9a37e837ec295175f016b40bb73f165040780c Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 01:07:14 +0700 Subject: [PATCH 050/134] fix: auth config --- config/auth/config.example.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 config/auth/config.example.yaml diff --git a/config/auth/config.example.yaml b/config/auth/config.example.yaml new file mode 100644 index 0000000..6db63c4 --- /dev/null +++ b/config/auth/config.example.yaml @@ -0,0 +1,23 @@ +app: + port: 3002 + debug: true + secret: + +database: + host: local-db + port: 5432 + name: johnjud_db + username: root + password: root + +jwt: + secret: + expires_in: 3600 + refresh_token_ttl: 604800 + issuer: + +redis: + host: localhost + port: 6379 + password: "" + dbnum: 0 \ No newline at end of file From 0c1b3974b37a8e61e926dd637ae253a1766c8b97 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 10:35:34 +0700 Subject: [PATCH 051/134] feat: pr template --- .../PULL_REQUEST_TEMPLATE/pull_request_template.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 0000000..4615521 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,13 @@ +## Change made + +- [ ]  New features +- [ ]  Bug fixes +- [ ]  Breaking changes +## Describe what you have done +- +### New Features +- +### Fix +- +### Others +- \ No newline at end of file From 5876f32a0e947f56d854ab25a434247abec1a3bb Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 11:12:54 +0700 Subject: [PATCH 052/134] feat: pr template --- .github/PULL_REQUEST_TEMPLATE/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md index 4615521..7748e23 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -4,7 +4,7 @@ - [ ]  Bug fixes - [ ]  Breaking changes ## Describe what you have done -- +- ### New Features - ### Fix From 6bead9774a04e8144965f4a580d9205273c45ed5 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 11:13:05 +0700 Subject: [PATCH 053/134] fix: remove user old svc mock --- src/mocks/user/user.mock.go | 76 ------------------------------------- 1 file changed, 76 deletions(-) delete mode 100644 src/mocks/user/user.mock.go diff --git a/src/mocks/user/user.mock.go b/src/mocks/user/user.mock.go deleted file mode 100644 index b5a4a70..0000000 --- a/src/mocks/user/user.mock.go +++ /dev/null @@ -1,76 +0,0 @@ -package user - -import ( - "context" - - "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - user_proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" - "github.com/stretchr/testify/mock" - "google.golang.org/grpc" -) - -type ServiceMock struct { - mock.Mock -} - -func (s *ServiceMock) FindOne(id string) (result *user_proto.User, err *dto.ResponseErr) { - args := s.Called(id) - - if args.Get(0) != nil { - result = args.Get(0).(*user_proto.User) - } - - if args.Get(1) != nil { - err = args.Get(1).(*dto.ResponseErr) - } - - return -} - -func (s *ServiceMock) Update(id string, in *dto.UpdateUserRequest) (result *user_proto.User, err *dto.ResponseErr) { - args := s.Called(id, in) - - if args.Get(0) != nil { - result = args.Get(0).(*user_proto.User) - } - - if args.Get(1) != nil { - err = args.Get(1).(*dto.ResponseErr) - } - - return -} - -type ClientMock struct { - mock.Mock -} - -func (c *ClientMock) FindOne(_ context.Context, in *user_proto.FindOneUserRequest, _ ...grpc.CallOption) (res *user_proto.FindOneUserResponse, err error) { - args := c.Called(in) - - if args.Get(0) != nil { - res = args.Get(0).(*user_proto.FindOneUserResponse) - } - - return res, args.Error(1) -} - -func (c *ClientMock) Update(_ context.Context, in *user_proto.UpdateUserRequest, _ ...grpc.CallOption) (res *user_proto.UpdateUserResponse, err error) { - args := c.Called(in) - - if args.Get(0) != nil { - res = args.Get(0).(*user_proto.UpdateUserResponse) - } - - return res, args.Error(1) -} - -func (c *ClientMock) Delete(_ context.Context, in *user_proto.DeleteUserRequest, _ ...grpc.CallOption) (res *user_proto.DeleteUserResponse, err error) { - args := c.Called(in) - - if args.Get(0) != nil { - res = args.Get(0).(*user_proto.DeleteUserResponse) - } - - return res, args.Error(1) -} From 898a26ca05e74cac22f621dd57800a89fc430459 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 11:27:20 +0700 Subject: [PATCH 054/134] fix: update user add password, email --- src/app/dto/user.dto.go | 1 + src/app/service/user/user.service.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index dcabf42..ca19e4e 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -8,6 +8,7 @@ type FindOneUserResponse struct { } type UpdateUserRequest struct { + Email string `json:"email" validate:"required,email"` Password string `json:"password" validate:"required,gte=6,lte=30"` Firstname string `json:"firstname" validate:"required"` Lastname string `json:"lastname" validate:"required"` diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index d5d5a3d..3340f9a 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -76,6 +76,8 @@ func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserR Id: id, Firstname: in.Firstname, Lastname: in.Lastname, + Password: in.Password, + Email: in.Email, }) if err != nil { st, _ := status.FromError(err) From 97a2beb2bd8ed20b511ef11a521a3a9d20b61dbb Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 22:52:39 +0700 Subject: [PATCH 055/134] chore: gen mock --- src/mocks/service/like/like.mock.go | 13 ++++--------- src/mocks/service/pet/pet.mock.go | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/mocks/service/like/like.mock.go b/src/mocks/service/like/like.mock.go index a40c24a..1e05b67 100644 --- a/src/mocks/service/like/like.mock.go +++ b/src/mocks/service/like/like.mock.go @@ -1,10 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./src/pkg/service/like/like.service.go -// -// Generated by this command: -// -// mockgen -source ./src/pkg/service/like/like.service.go -destination ./src/mocks/service/like/like.mock.go -// // Package mock_like is a generated GoMock package. package mock_like @@ -12,8 +7,8 @@ package mock_like import ( reflect "reflect" - dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" gomock "github.com/golang/mock/gomock" + dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" ) // MockService is a mock of Service interface. @@ -49,7 +44,7 @@ func (m *MockService) Create(arg0 *dto.CreateLikeRequest) (*dto.LikeResponse, *d } // Create indicates an expected call of Create. -func (mr *MockServiceMockRecorder) Create(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Create(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockService)(nil).Create), arg0) } @@ -64,7 +59,7 @@ func (m *MockService) Delete(arg0 string) (*dto.DeleteLikeResponse, *dto.Respons } // Delete indicates an expected call of Delete. -func (mr *MockServiceMockRecorder) Delete(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) } @@ -79,7 +74,7 @@ func (m *MockService) FindByUserId(arg0 string) ([]*dto.LikeResponse, *dto.Respo } // FindByUserId indicates an expected call of FindByUserId. -func (mr *MockServiceMockRecorder) FindByUserId(arg0 any) *gomock.Call { +func (mr *MockServiceMockRecorder) FindByUserId(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByUserId", reflect.TypeOf((*MockService)(nil).FindByUserId), arg0) } diff --git a/src/mocks/service/pet/pet.mock.go b/src/mocks/service/pet/pet.mock.go index a9787c9..d1689f4 100644 --- a/src/mocks/service/pet/pet.mock.go +++ b/src/mocks/service/pet/pet.mock.go @@ -44,7 +44,7 @@ func (m *MockService) Adopt(arg0 string, arg1 *dto.AdoptByRequest) (*dto.AdoptBy } // Adopt indicates an expected call of Adopt. -func (mr *MockServiceMockRecorder) Adopt(arg0, arg1 any) *gomock.Call { +func (mr *MockServiceMockRecorder) Adopt(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Adopt", reflect.TypeOf((*MockService)(nil).Adopt), arg0, arg1) } From 5714a97e799b73004b1bdaeb94ef4503ed336a25 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 23:25:54 +0700 Subject: [PATCH 056/134] feat: user client mock --- src/mocks/client/user/user.mock.go | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/mocks/client/user/user.mock.go diff --git a/src/mocks/client/user/user.mock.go b/src/mocks/client/user/user.mock.go new file mode 100644 index 0000000..7e54f5f --- /dev/null +++ b/src/mocks/client/user/user.mock.go @@ -0,0 +1,41 @@ +package user + +import ( + "context" + + proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" + "github.com/stretchr/testify/mock" + "google.golang.org/grpc" +) + +type UserClientMock struct { + mock.Mock +} + +func (c *UserClientMock) FindOne(_ context.Context, in *proto.FindOneUserRequest, _ ...grpc.CallOption) (res *proto.FindOneUserResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*proto.FindOneUserResponse) + } + return res, args.Error(1) +} +func (c *UserClientMock) Update(_ context.Context, in *proto.UpdateUserRequest, _ ...grpc.CallOption) (res *proto.UpdateUserResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*proto.UpdateUserResponse) + } + + return res, args.Error(1) +} + +func (c *UserClientMock) Delete(_ context.Context, in *proto.DeleteUserRequest, _ ...grpc.CallOption) (res *proto.DeleteUserResponse, err error) { + args := c.Called(in) + + if args.Get(0) != nil { + res = args.Get(0).(*proto.DeleteUserResponse) + } + + return res, args.Error(1) +} From ba8edcc65ca9fea3413a648c69018e22fd4da9a3 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 23:26:16 +0700 Subject: [PATCH 057/134] feat: user delete add unavailable --- src/app/service/user/user.service.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index 3340f9a..d1f3948 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -89,7 +89,7 @@ func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserR switch st.Code() { case codes.AlreadyExists: return nil, &dto.ResponseErr{ - StatusCode: http.StatusNotFound, + StatusCode: http.StatusConflict, Message: constant.DuplicateEmailMessage, Data: nil, } @@ -131,11 +131,19 @@ func (s *Service) Delete(id string) (*dto.DeleteUserResponse, *dto.ResponseErr) Str("service", "user"). Str("module", "delete"). Msg(st.Message()) - - return nil, &dto.ResponseErr{ - StatusCode: http.StatusInternalServerError, - Message: constant.InternalErrorMessage, - Data: nil, + switch st.Code() { + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } } } From fd4c0cff497de1f6cb05d7bee01c469eb91f5af6 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 23:26:28 +0700 Subject: [PATCH 058/134] feat: user svc test --- src/app/service/user/user.service_test.go | 278 ++++++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 src/app/service/user/user.service_test.go diff --git a/src/app/service/user/user.service_test.go b/src/app/service/user/user.service_test.go new file mode 100644 index 0000000..8f9103c --- /dev/null +++ b/src/app/service/user/user.service_test.go @@ -0,0 +1,278 @@ +package user + +import ( + "net/http" + "testing" + + "github.com/go-faker/faker/v4" + "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/mocks/client/user" + proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type UserServiceTest struct { + suite.Suite + User *proto.User + FindOneUserReq *proto.FindOneUserRequest + UpdateUserReq *proto.UpdateUserRequest + UpdateUserDto *dto.UpdateUserRequest + DeleteUserReq *proto.DeleteUserRequest + NotFoundErr *dto.ResponseErr + UnavailableServiceErr *dto.ResponseErr + ConflictErr *dto.ResponseErr + InternalErr *dto.ResponseErr +} + +func TestUserService(t *testing.T) { + suite.Run(t, new(UserServiceTest)) +} + +func (t *UserServiceTest) SetupTest() { + t.User = &proto.User{ + Id: faker.UUIDDigit(), + Email: faker.Email(), + Password: faker.Password(), + Firstname: faker.FirstName(), + Lastname: faker.LastName(), + Role: "user", + } + + t.FindOneUserReq = &proto.FindOneUserRequest{ + Id: t.User.Id, + } + + t.UpdateUserDto = &dto.UpdateUserRequest{ + Email: faker.Email(), + Password: faker.Password(), + Firstname: faker.FirstName(), + Lastname: faker.LastName(), + } + + t.UpdateUserReq = &proto.UpdateUserRequest{ + Id: t.User.Id, + Email: t.UpdateUserDto.Email, + Password: t.UpdateUserDto.Password, + Firstname: t.UpdateUserDto.Firstname, + Lastname: t.UpdateUserDto.Lastname, + } + + t.DeleteUserReq = &proto.DeleteUserRequest{ + Id: t.User.Id, + } + + t.UnavailableServiceErr = &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + + t.NotFoundErr = &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.UserNotFoundMessage, + Data: nil, + } + + t.ConflictErr = &dto.ResponseErr{ + StatusCode: http.StatusConflict, + Message: constant.DuplicateEmailMessage, + Data: nil, + } + + t.InternalErr = &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } +} + +func (t *UserServiceTest) TestFindOneSuccess() { + protoResp := &proto.FindOneUserResponse{ + User: &proto.User{ + Id: t.User.Id, + Email: t.User.Email, + Firstname: t.User.Firstname, + Lastname: t.User.Lastname, + Role: t.User.Role, + }, + } + + expected := &dto.FindOneUserResponse{ + Id: t.User.Id, + Email: t.User.Email, + Firstname: t.User.Firstname, + Lastname: t.User.Lastname, + } + + client := user.UserClientMock{} + client.On("FindOne", t.FindOneUserReq).Return(protoResp, nil) + + svc := NewService(&client) + actual, err := svc.FindOne(t.User.Id) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *UserServiceTest) TestFindOneNotFoundError() { + expected := t.NotFoundErr + + client := user.UserClientMock{} + clienErr := status.Error(codes.NotFound, constant.UserNotFoundMessage) + client.On("FindOne", t.FindOneUserReq).Return(nil, clienErr) + + svc := NewService(&client) + actual, err := svc.FindOne(t.User.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestFindOneUnavailableServiceError() { + expected := t.UnavailableServiceErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + client.On("FindOne", t.FindOneUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.FindOne(t.User.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestFindOneInternalError() { + expected := t.InternalErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Internal, constant.InternalErrorMessage) + client.On("FindOne", t.FindOneUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.FindOne(t.User.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestUpdateSuccess() { + protoResp := &proto.UpdateUserResponse{ + User: &proto.User{ + Id: t.User.Id, + Email: t.User.Email, + Firstname: t.User.Firstname, + Lastname: t.User.Lastname, + Role: t.User.Role, + }, + } + + expected := &dto.UpdateUserResponse{ + Id: t.User.Id, + Email: t.User.Email, + Firstname: t.User.Firstname, + Lastname: t.User.Lastname, + } + + client := user.UserClientMock{} + client.On("Update", t.UpdateUserReq).Return(protoResp, nil) + + svc := NewService(&client) + actual, err := svc.Update(t.User.Id, t.UpdateUserDto) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *UserServiceTest) TestUpdateDuplicateEmail() { + expected := t.ConflictErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.AlreadyExists, constant.DuplicateEmailMessage) + client.On("Update", t.UpdateUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.Update(t.User.Id, t.UpdateUserDto) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestUpdateUnavailableServiceError() { + expected := t.UnavailableServiceErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + client.On("Update", t.UpdateUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.Update(t.User.Id, t.UpdateUserDto) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestUpdateInternalError() { + expected := t.InternalErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Internal, constant.InternalErrorMessage) + client.On("Update", t.UpdateUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.Update(t.User.Id, t.UpdateUserDto) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestDeleteSuccess() { + protoResp := &proto.DeleteUserResponse{ + Success: true, + } + + expected := &dto.DeleteUserResponse{ + Success: true, + } + + client := user.UserClientMock{} + client.On("Delete", t.DeleteUserReq).Return(protoResp, nil) + + svc := NewService(&client) + actual, err := svc.Delete(t.User.Id) + + assert.Nil(t.T(), err) + assert.Equal(t.T(), expected, actual) +} + +func (t *UserServiceTest) TestDeleteUnavailableServiceError() { + expected := t.UnavailableServiceErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Unavailable, constant.UnavailableServiceMessage) + client.On("Delete", t.DeleteUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.Delete(t.User.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} + +func (t *UserServiceTest) TestDeleteInternalError() { + expected := t.InternalErr + + client := user.UserClientMock{} + clientErr := status.Error(codes.Internal, constant.InternalErrorMessage) + client.On("Delete", t.DeleteUserReq).Return(nil, clientErr) + + svc := NewService(&client) + actual, err := svc.Delete(t.User.Id) + + assert.Nil(t.T(), actual) + assert.Equal(t.T(), expected, err) +} From 2cae2d99e5a209949227178452f9fabeb4f38a3c Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 23:45:53 +0700 Subject: [PATCH 059/134] feat: findone swagger --- src/app/handler/user/user.handler.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index 3ac1e8b..9bdca07 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -18,6 +18,18 @@ func NewHandler(service user.Service, validate validator.IDtoValidator) *Handler return &Handler{service, validate} } +// FindOne is a function that returns a user by id from database +// @Summary finds one user +// @Description Returns the data of user if successful +// @Param id path string true "user id" +// @Tags user +// @Accept json +// @Produce json +// @Success 200 {object} dto.User +// @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" +// @Failure 500 {object} dto.ResponseInternalErr "Internal service error" +// @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" +// @Router /v1/users/{id} [get] func (h *Handler) FindOne(c *router.FiberCtx) { id, err := c.ID() if err != nil { From 6e11f07379e7aeeed89906f948d3f8618108b13e Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sun, 7 Jan 2024 23:49:25 +0700 Subject: [PATCH 060/134] fix: merge update, findone dto -> dto.User --- src/app/dto/user.dto.go | 9 +-------- src/app/service/user/user.service.go | 8 ++++---- src/app/service/user/user.service_test.go | 4 ++-- src/mocks/service/user/user.mock.go | 8 ++++---- src/pkg/service/user/user.service.go | 4 ++-- 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index ca19e4e..c96fcab 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -1,6 +1,6 @@ package dto -type FindOneUserResponse struct { +type User struct { Id string `json:"id"` Email string `json:"email"` Firstname string `json:"firstname"` @@ -14,13 +14,6 @@ type UpdateUserRequest struct { Lastname string `json:"lastname" validate:"required"` } -type UpdateUserResponse struct { - Id string `json:"id"` - Email string `json:"email"` - Firstname string `json:"firstname"` - Lastname string `json:"lastname"` -} - type DeleteUserResponse struct { Success bool `json:"success" validate:"required"` } diff --git a/src/app/service/user/user.service.go b/src/app/service/user/user.service.go index d1f3948..d4186f2 100644 --- a/src/app/service/user/user.service.go +++ b/src/app/service/user/user.service.go @@ -23,7 +23,7 @@ func NewService(client proto.UserServiceClient) *Service { } } -func (s *Service) FindOne(id string) (*dto.FindOneUserResponse, *dto.ResponseErr) { +func (s *Service) FindOne(id string) (*dto.User, *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -60,7 +60,7 @@ func (s *Service) FindOne(id string) (*dto.FindOneUserResponse, *dto.ResponseErr } } - return &dto.FindOneUserResponse{ + return &dto.User{ Id: response.User.Id, Firstname: response.User.Firstname, Lastname: response.User.Lastname, @@ -68,7 +68,7 @@ func (s *Service) FindOne(id string) (*dto.FindOneUserResponse, *dto.ResponseErr }, nil } -func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) { +func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.User, *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -109,7 +109,7 @@ func (s *Service) Update(id string, in *dto.UpdateUserRequest) (*dto.UpdateUserR } } - return &dto.UpdateUserResponse{ + return &dto.User{ Id: response.User.Id, Firstname: response.User.Firstname, Lastname: response.User.Lastname, diff --git a/src/app/service/user/user.service_test.go b/src/app/service/user/user.service_test.go index 8f9103c..9630508 100644 --- a/src/app/service/user/user.service_test.go +++ b/src/app/service/user/user.service_test.go @@ -101,7 +101,7 @@ func (t *UserServiceTest) TestFindOneSuccess() { }, } - expected := &dto.FindOneUserResponse{ + expected := &dto.User{ Id: t.User.Id, Email: t.User.Email, Firstname: t.User.Firstname, @@ -171,7 +171,7 @@ func (t *UserServiceTest) TestUpdateSuccess() { }, } - expected := &dto.UpdateUserResponse{ + expected := &dto.User{ Id: t.User.Id, Email: t.User.Email, Firstname: t.User.Firstname, diff --git a/src/mocks/service/user/user.mock.go b/src/mocks/service/user/user.mock.go index d48aad4..ba40d67 100644 --- a/src/mocks/service/user/user.mock.go +++ b/src/mocks/service/user/user.mock.go @@ -50,10 +50,10 @@ func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { } // FindOne mocks base method. -func (m *MockService) FindOne(arg0 string) (*dto.FindOneUserResponse, *dto.ResponseErr) { +func (m *MockService) FindOne(arg0 string) (*dto.User, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FindOne", arg0) - ret0, _ := ret[0].(*dto.FindOneUserResponse) + ret0, _ := ret[0].(*dto.User) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } @@ -65,10 +65,10 @@ func (mr *MockServiceMockRecorder) FindOne(arg0 interface{}) *gomock.Call { } // Update mocks base method. -func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) { +func (m *MockService) Update(arg0 string, arg1 *dto.UpdateUserRequest) (*dto.User, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Update", arg0, arg1) - ret0, _ := ret[0].(*dto.UpdateUserResponse) + ret0, _ := ret[0].(*dto.User) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } diff --git a/src/pkg/service/user/user.service.go b/src/pkg/service/user/user.service.go index 15d58fb..731063b 100644 --- a/src/pkg/service/user/user.service.go +++ b/src/pkg/service/user/user.service.go @@ -5,7 +5,7 @@ import ( ) type Service interface { - FindOne(string) (*dto.FindOneUserResponse, *dto.ResponseErr) - Update(string, *dto.UpdateUserRequest) (*dto.UpdateUserResponse, *dto.ResponseErr) + FindOne(string) (*dto.User, *dto.ResponseErr) + Update(string, *dto.UpdateUserRequest) (*dto.User, *dto.ResponseErr) Delete(string) (*dto.DeleteUserResponse, *dto.ResponseErr) } From 31438ab95277ae5110e4bcbb26e27ccec3e619f7 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 00:25:49 +0700 Subject: [PATCH 061/134] fix: adoptdto in userdto file --- src/app/dto/adopt.dto.go | 15 --------------- src/app/dto/pet.dto.go | 13 +++++++++++-- 2 files changed, 11 insertions(+), 17 deletions(-) delete mode 100644 src/app/dto/adopt.dto.go diff --git a/src/app/dto/adopt.dto.go b/src/app/dto/adopt.dto.go deleted file mode 100644 index 56ecaef..0000000 --- a/src/app/dto/adopt.dto.go +++ /dev/null @@ -1,15 +0,0 @@ -package dto - -type AdoptDto struct { - UserID string `json:"user_id" validate:"required"` - PetID string `json:"pet_id" validate:"required"` -} - -type AdoptByRequest struct { - UserID string `json:"user_id" validate:"required"` - PetID string `json:"pet_id" validate:"required"` -} - -type AdoptByResponse struct { - Success bool `json:"success"` -} diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 0d7c5b1..d6b7ce3 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -35,10 +35,10 @@ type CreatePetRequest struct { Species string `json:"species" validate:"required"` Name string `json:"name" validate:"required"` Birthdate string `json:"birthdate" validate:"required"` - Gender pet.Gender `json:"gender" validate:"required" example:"male"` + Gender pet.Gender `json:"gender" validate:"required" example:"1"` Habit string `json:"habit" validate:"required"` Caption string `json:"caption"` - Status pet.Status `json:"status" validate:"required" example:"findhome"` + Status pet.Status `json:"status" validate:"required" example:"1"` IsSterile *bool `json:"is_sterile" validate:"required"` IsVaccinated *bool `json:"is_vaccinated" validate:"required"` IsVisible *bool `json:"is_visible" validate:"required"` @@ -58,6 +58,15 @@ type ChangeViewPetResponse struct { Success bool `json:"success" validate:"required"` } +type AdoptByRequest struct { + UserID string `json:"user_id" validate:"required"` + PetID string `json:"pet_id" validate:"required"` +} + +type AdoptByResponse struct { + Success bool `json:"success"` +} + type UpdatePetRequest struct { Type string `json:"type"` Species string `json:"species"` From a993db28d8c429de5e948426ad4157bad3208a9f Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 00:26:00 +0700 Subject: [PATCH 062/134] fix: pet swagger docs --- src/app/handler/pet/pet.handler.go | 77 +++++++++++++++--------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 7dae48c..3e5b91f 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -23,13 +23,13 @@ func NewHandler(service petSvc.Service, imageService imageSvc.Service, validate return &Handler{service, imageService, validate} } -// FindAll is a function that return all pets in database -// @Summary find all pets -// @Description Return the data of pets if successfully -// @Tags auth +// FindAll is a function that returns all pets in database +// @Summary finds all pets +// @Description Returns the data of pets if successful +// @Tags pet // @Accept json // @Produce json -// @Success 200 {object} dto.PetDto +// @Success 200 {object} []dto.PetResponse // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" // @Router /v1/pets/ [get] @@ -48,14 +48,14 @@ func (h *Handler) FindAll(c router.IContext) { return } -// FindOne is a function that return all pet in database -// @Summary find one pet -// @Description Return the data of pets if successfully +// FindOne is a function that returns a pet by id in database +// @Summary finds one pet +// @Description Returns the data of a pet if successful // @Param id path string true "pet id" -// @Tags auth +// @Tags pet // @Accept json // @Produce json -// @Success 200 {object} dto.PetDto +// @Success 200 {object} dto.PetResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" @@ -85,14 +85,14 @@ func (h *Handler) FindOne(c router.IContext) { return } -// Create is a function that create pet in database -// @Summary create pet -// @Description Return the data of pet if successfully +// Create is a function that creates pet in database +// @Summary creates pet +// @Description Returns the data of pet if successful // @Param create body dto.CreatePetRequest true "pet dto" -// @Tags auth +// @Tags pet // @Accept json // @Produce json -// @Success 201 {object} dto.PetDto +// @Success 201 {object} dto.PetResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" @@ -136,15 +136,15 @@ func (h *Handler) Create(c router.IContext) { return } -// Update is a function that update pet in database -// @Summary update pet -// @Description Return the data of pet if successfully +// Update is a function that updates pet in database +// @Summary updates pet +// @Description Returns the data of pet if successfully // @Param update body dto.UpdatePetRequest true "update pet dto" -// @Param id path stirng true "pet id" -// @Tags auth +// @Param id path string true "pet id" +// @Tags pet // @Accept json // @Produce json -// @Success 201 {object} dto.PetDto +// @Success 201 {object} dto.PetResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" @@ -199,19 +199,19 @@ func (h *Handler) Update(c router.IContext) { return } -// Change is a function that change visibility of pet in database -// @Summary change view pet -// @Description Return the status true of pet if successfully else false -// @Param change view body dto.ChangeViewPetRequest true "change view pet dto" -// @Param id string true "pet id" -// @Tags auth +// ChangeView is a function that changes visibility of pet in database +// @Summary changes pet's public visiblility +// @Description Returns successful status if pet's IsVisible is successfully changed +// @Param changeViewDto body dto.ChangeViewPetRequest true "changeView pet dto" +// @Param id path string true "pet id" +// @Tags pet // @Accept json // @Produce json -// @Success 201 {object} bool +// @Success 201 {object} dto.ChangeViewPetResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" -// @Router /v1/pets/ [put] +// @Router /v1/pets/{id}/visible [put] func (h *Handler) ChangeView(c router.IContext) { id, err := c.Param("id") if err != nil { @@ -262,14 +262,14 @@ func (h *Handler) ChangeView(c router.IContext) { return } -// Delete is a function that delete pet in database -// @Summary delete pet -// @Description Return the status true of pet if successfully else false -// @Param id string true "pet id" -// @Tags auth +// Delete is a function that deletes pet in database +// @Summary deletes pet +// @Description Returns successful status if pet is successfully deleted +// @Param id path string true "pet id" +// @Tags pet // @Accept json // @Produce json -// @Success 201 {object} bool +// @Success 201 {object} dto.DeleteResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" @@ -300,15 +300,14 @@ func (h *Handler) Delete(c router.IContext) { } // Adopt is a function that handles the adoption of a pet in the database -// @Summary Adopt a pet +// @Summary Change a pet's adoptBy status // @Description Return true if the pet is successfully adopted +// @Param adoptDto body dto.AdoptByRequest true "adopt pet dto" // @Param id path string true "Pet ID" -// @Param user_id body string true "User ID" -// @Param pet_id body string true "Pet ID" // @Tags pet // @Accept json // @Produce json -// @Success 201 {object} bool +// @Success 201 {object} dto.AdoptByResponse // @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" From 69ac220a36263a94a86f13047063d38711b51a5a Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 00:26:05 +0700 Subject: [PATCH 063/134] chore: gen docs --- src/docs/docs.go | 593 ++++++++++++++++++++++++++++++++++++++++-- src/docs/swagger.json | 590 ++++++++++++++++++++++++++++++++++++++++- src/docs/swagger.yaml | 402 +++++++++++++++++++++++++++- 3 files changed, 1544 insertions(+), 41 deletions(-) diff --git a/src/docs/docs.go b/src/docs/docs.go index de72062..ee19d5a 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -1,5 +1,4 @@ -// Code generated by swaggo/swag. DO NOT EDIT. - +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs import "github.com/swaggo/swag" @@ -234,9 +233,9 @@ const docTemplate = `{ } } }, - "/v1/pet/": { + "/v1/pets/": { "get": { - "description": "Return the data of pets if successfully", + "description": "Returns the data of pets if successful", "consumes": [ "application/json" ], @@ -244,17 +243,103 @@ const docTemplate = `{ "application/json" ], "tags": [ - "auth" + "pet" + ], + "summary": "finds all pets", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PetResponse" + } + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + }, + "delete": { + "description": "Returns successful status if pet is successfully deleted", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "deletes pet", + "parameters": [ + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.DeleteResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/create": { + "post": { + "description": "Returns the data of pet if successful", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" ], - "summary": "find all pets", + "summary": "creates pet", "parameters": [ { "description": "pet dto", - "name": "signup", + "name": "create", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/dto.PetDto" + "$ref": "#/definitions/dto.CreatePetRequest" } } ], @@ -262,7 +347,7 @@ const docTemplate = `{ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/dto.PetDto" + "$ref": "#/definitions/dto.PetResponse" } }, "400": { @@ -271,10 +356,229 @@ const docTemplate = `{ "$ref": "#/definitions/dto.ResponseBadRequestErr" } }, - "409": { - "description": "Duplicate email", + "500": { + "description": "Internal service error", "schema": { - "$ref": "#/definitions/dto.ResponseConflictErr" + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}": { + "get": { + "description": "Returns the data of a pet if successful", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "finds one pet", + "parameters": [ + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + }, + "put": { + "description": "Returns the data of pet if successfully", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "updates pet", + "parameters": [ + { + "description": "update pet dto", + "name": "update", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdatePetRequest" + } + }, + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.PetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}/adopt": { + "put": { + "description": "Return true if the pet is successfully adopted", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "Change a pet's adoptBy status", + "parameters": [ + { + "description": "adopt pet dto", + "name": "adoptDto", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AdoptByRequest" + } + }, + { + "type": "string", + "description": "Pet ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.AdoptByResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}/visible": { + "put": { + "description": "Returns successful status if pet's IsVisible is successfully changed", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "changes pet's public visiblility", + "parameters": [ + { + "description": "changeView pet dto", + "name": "changeViewDto", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeViewPetRequest" + } + }, + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.ChangeViewPetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" } }, "500": { @@ -294,6 +598,29 @@ const docTemplate = `{ } }, "definitions": { + "dto.AdoptByRequest": { + "type": "object", + "required": [ + "pet_id", + "user_id" + ], + "properties": { + "pet_id": { + "type": "string" + }, + "user_id": { + "type": "string" + } + } + }, + "dto.AdoptByResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + } + }, "dto.BadReqErrResponse": { "type": "object", "properties": { @@ -306,6 +633,102 @@ const docTemplate = `{ "value": {} } }, + "dto.ChangeViewPetRequest": { + "type": "object", + "required": [ + "visible" + ], + "properties": { + "visible": { + "type": "boolean" + } + } + }, + "dto.ChangeViewPetResponse": { + "type": "object", + "required": [ + "success" + ], + "properties": { + "success": { + "type": "boolean" + } + } + }, + "dto.CreatePetRequest": { + "type": "object", + "required": [ + "birthdate", + "gender", + "habit", + "is_club_pet", + "is_sterile", + "is_vaccinated", + "is_visible", + "name", + "species", + "status", + "type" + ], + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer", + "example": 1 + }, + "habit": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer", + "example": 1 + }, + "type": { + "type": "string" + } + } + }, "dto.Credential": { "type": "object", "properties": { @@ -323,6 +746,90 @@ const docTemplate = `{ } } }, + "dto.DeleteResponse": { + "type": "object", + "required": [ + "success" + ], + "properties": { + "success": { + "type": "boolean" + } + } + }, + "dto.ImageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "dto.PetResponse": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer" + }, + "habit": { + "type": "string" + }, + "id": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageResponse" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, "dto.RefreshTokenRequest": { "type": "object", "required": [ @@ -334,9 +841,6 @@ const docTemplate = `{ } } }, - "dto.PetDto": { - "type": "object" - }, "dto.ResponseBadRequestErr": { "type": "object", "properties": { @@ -492,6 +996,65 @@ const docTemplate = `{ "type": "string" } } + }, + "dto.UpdatePetRequest": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer" + }, + "habit": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer" + }, + "type": { + "type": "string" + } + } } }, "securityDefinitions": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 1303f34..deaf951 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -229,9 +229,9 @@ } } }, - "/v1/pet/": { + "/v1/pets/": { "get": { - "description": "Return the data of pets if successfully", + "description": "Returns the data of pets if successful", "consumes": [ "application/json" ], @@ -239,17 +239,103 @@ "application/json" ], "tags": [ - "auth" + "pet" + ], + "summary": "finds all pets", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.PetResponse" + } + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + }, + "delete": { + "description": "Returns successful status if pet is successfully deleted", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "deletes pet", + "parameters": [ + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.DeleteResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/create": { + "post": { + "description": "Returns the data of pet if successful", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" ], - "summary": "find all pets", + "summary": "creates pet", "parameters": [ { "description": "pet dto", - "name": "signup", + "name": "create", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/dto.PetDto" + "$ref": "#/definitions/dto.CreatePetRequest" } } ], @@ -257,7 +343,7 @@ "201": { "description": "Created", "schema": { - "$ref": "#/definitions/dto.PetDto" + "$ref": "#/definitions/dto.PetResponse" } }, "400": { @@ -266,10 +352,229 @@ "$ref": "#/definitions/dto.ResponseBadRequestErr" } }, - "409": { - "description": "Duplicate email", + "500": { + "description": "Internal service error", "schema": { - "$ref": "#/definitions/dto.ResponseConflictErr" + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}": { + "get": { + "description": "Returns the data of a pet if successful", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "finds one pet", + "parameters": [ + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.PetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + }, + "put": { + "description": "Returns the data of pet if successfully", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "updates pet", + "parameters": [ + { + "description": "update pet dto", + "name": "update", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UpdatePetRequest" + } + }, + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.PetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}/adopt": { + "put": { + "description": "Return true if the pet is successfully adopted", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "Change a pet's adoptBy status", + "parameters": [ + { + "description": "adopt pet dto", + "name": "adoptDto", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.AdoptByRequest" + } + }, + { + "type": "string", + "description": "Pet ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.AdoptByResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" + } + }, + "500": { + "description": "Internal service error", + "schema": { + "$ref": "#/definitions/dto.ResponseInternalErr" + } + }, + "503": { + "description": "Service is down", + "schema": { + "$ref": "#/definitions/dto.ResponseServiceDownErr" + } + } + } + } + }, + "/v1/pets/{id}/visible": { + "put": { + "description": "Returns successful status if pet's IsVisible is successfully changed", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "pet" + ], + "summary": "changes pet's public visiblility", + "parameters": [ + { + "description": "changeView pet dto", + "name": "changeViewDto", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.ChangeViewPetRequest" + } + }, + { + "type": "string", + "description": "pet id", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/dto.ChangeViewPetResponse" + } + }, + "400": { + "description": "Invalid request body", + "schema": { + "$ref": "#/definitions/dto.ResponseBadRequestErr" } }, "500": { @@ -289,6 +594,29 @@ } }, "definitions": { + "dto.AdoptByRequest": { + "type": "object", + "required": [ + "pet_id", + "user_id" + ], + "properties": { + "pet_id": { + "type": "string" + }, + "user_id": { + "type": "string" + } + } + }, + "dto.AdoptByResponse": { + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + } + }, "dto.BadReqErrResponse": { "type": "object", "properties": { @@ -301,6 +629,102 @@ "value": {} } }, + "dto.ChangeViewPetRequest": { + "type": "object", + "required": [ + "visible" + ], + "properties": { + "visible": { + "type": "boolean" + } + } + }, + "dto.ChangeViewPetResponse": { + "type": "object", + "required": [ + "success" + ], + "properties": { + "success": { + "type": "boolean" + } + } + }, + "dto.CreatePetRequest": { + "type": "object", + "required": [ + "birthdate", + "gender", + "habit", + "is_club_pet", + "is_sterile", + "is_vaccinated", + "is_visible", + "name", + "species", + "status", + "type" + ], + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer", + "example": 1 + }, + "habit": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer", + "example": 1 + }, + "type": { + "type": "string" + } + } + }, "dto.Credential": { "type": "object", "properties": { @@ -318,6 +742,90 @@ } } }, + "dto.DeleteResponse": { + "type": "object", + "required": [ + "success" + ], + "properties": { + "success": { + "type": "boolean" + } + } + }, + "dto.ImageResponse": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "dto.PetResponse": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer" + }, + "habit": { + "type": "string" + }, + "id": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ImageResponse" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer" + }, + "type": { + "type": "string" + } + } + }, "dto.RefreshTokenRequest": { "type": "object", "required": [ @@ -329,9 +837,6 @@ } } }, - "dto.PetDto": { - "type": "object" - }, "dto.ResponseBadRequestErr": { "type": "object", "properties": { @@ -487,6 +992,65 @@ "type": "string" } } + }, + "dto.UpdatePetRequest": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "adopt_by": { + "type": "string" + }, + "background": { + "type": "string" + }, + "birthdate": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "contact": { + "type": "string" + }, + "gender": { + "type": "integer" + }, + "habit": { + "type": "string" + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "is_club_pet": { + "type": "boolean" + }, + "is_sterile": { + "type": "boolean" + }, + "is_vaccinated": { + "type": "boolean" + }, + "is_visible": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "species": { + "type": "string" + }, + "status": { + "type": "integer" + }, + "type": { + "type": "string" + } + } } }, "securityDefinitions": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index b6ed6da..e585f99 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -1,4 +1,19 @@ definitions: + dto.AdoptByRequest: + properties: + pet_id: + type: string + user_id: + type: string + required: + - pet_id + - user_id + type: object + dto.AdoptByResponse: + properties: + success: + type: boolean + type: object dto.BadReqErrResponse: properties: failed_field: @@ -7,6 +22,73 @@ definitions: type: string value: {} type: object + dto.ChangeViewPetRequest: + properties: + visible: + type: boolean + required: + - visible + type: object + dto.ChangeViewPetResponse: + properties: + success: + type: boolean + required: + - success + type: object + dto.CreatePetRequest: + properties: + address: + type: string + adopt_by: + type: string + background: + type: string + birthdate: + type: string + caption: + type: string + contact: + type: string + gender: + example: 1 + type: integer + habit: + type: string + images: + items: + type: string + type: array + is_club_pet: + type: boolean + is_sterile: + type: boolean + is_vaccinated: + type: boolean + is_visible: + type: boolean + name: + type: string + species: + type: string + status: + example: 1 + type: integer + type: + type: string + required: + - birthdate + - gender + - habit + - is_club_pet + - is_sterile + - is_vaccinated + - is_visible + - name + - species + - status + - type + type: object dto.Credential: properties: access_token: @@ -19,6 +101,61 @@ definitions: example: e7e84d54-7518-4... type: string type: object + dto.DeleteResponse: + properties: + success: + type: boolean + required: + - success + type: object + dto.ImageResponse: + properties: + id: + type: string + url: + type: string + type: object + dto.PetResponse: + properties: + address: + type: string + adopt_by: + type: string + background: + type: string + birthdate: + type: string + caption: + type: string + contact: + type: string + gender: + type: integer + habit: + type: string + id: + type: string + images: + items: + $ref: '#/definitions/dto.ImageResponse' + type: array + is_club_pet: + type: boolean + is_sterile: + type: boolean + is_vaccinated: + type: boolean + is_visible: + type: boolean + name: + type: string + species: + type: string + status: + type: integer + type: + type: string + type: object dto.RefreshTokenRequest: properties: refresh_token: @@ -26,8 +163,6 @@ definitions: required: - refresh_token type: object - dto.PetDto: - type: object dto.ResponseBadRequestErr: properties: data: @@ -137,6 +272,45 @@ definitions: lastname: type: string type: object + dto.UpdatePetRequest: + properties: + address: + type: string + adopt_by: + type: string + background: + type: string + birthdate: + type: string + caption: + type: string + contact: + type: string + gender: + type: integer + habit: + type: string + images: + items: + type: string + type: array + is_club_pet: + type: boolean + is_sterile: + type: boolean + is_vaccinated: + type: boolean + is_visible: + type: boolean + name: + type: string + species: + type: string + status: + type: integer + type: + type: string + type: object info: contact: email: sd.team.sgcu@gmail.com @@ -287,33 +461,162 @@ paths: summary: Signup user tags: - auth - /v1/pet/: + /v1/pets/: + delete: + consumes: + - application/json + description: Returns successful status if pet is successfully deleted + parameters: + - description: pet id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/dto.DeleteResponse' + "400": + description: Invalid request body + schema: + $ref: '#/definitions/dto.ResponseBadRequestErr' + "500": + description: Internal service error + schema: + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: deletes pet + tags: + - pet get: consumes: - application/json - description: Return the data of pets if successfully + description: Returns the data of pets if successful + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.PetResponse' + type: array + "500": + description: Internal service error + schema: + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: finds all pets + tags: + - pet + /v1/pets/{id}: + get: + consumes: + - application/json + description: Returns the data of a pet if successful parameters: - - description: pet dto + - description: pet id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.PetResponse' + "400": + description: Invalid request body + schema: + $ref: '#/definitions/dto.ResponseBadRequestErr' + "500": + description: Internal service error + schema: + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: finds one pet + tags: + - pet + put: + consumes: + - application/json + description: Returns the data of pet if successfully + parameters: + - description: update pet dto in: body - name: signup + name: update required: true schema: - $ref: '#/definitions/dto.PetDto' + $ref: '#/definitions/dto.UpdatePetRequest' + - description: pet id + in: path + name: id + required: true + type: string produces: - application/json responses: "201": description: Created schema: - $ref: '#/definitions/dto.PetDto' + $ref: '#/definitions/dto.PetResponse' "400": description: Invalid request body schema: $ref: '#/definitions/dto.ResponseBadRequestErr' - "409": - description: Duplicate email + "500": + description: Internal service error schema: - $ref: '#/definitions/dto.ResponseConflictErr' + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: updates pet + tags: + - pet + /v1/pets/{id}/adopt: + put: + consumes: + - application/json + description: Return true if the pet is successfully adopted + parameters: + - description: adopt pet dto + in: body + name: adoptDto + required: true + schema: + $ref: '#/definitions/dto.AdoptByRequest' + - description: Pet ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/dto.AdoptByResponse' + "400": + description: Invalid request body + schema: + $ref: '#/definitions/dto.ResponseBadRequestErr' "500": description: Internal service error schema: @@ -322,9 +625,82 @@ paths: description: Service is down schema: $ref: '#/definitions/dto.ResponseServiceDownErr' - summary: find all pets + summary: Change a pet's adoptBy status tags: - - auth + - pet + /v1/pets/{id}/visible: + put: + consumes: + - application/json + description: Returns successful status if pet's IsVisible is successfully changed + parameters: + - description: changeView pet dto + in: body + name: changeViewDto + required: true + schema: + $ref: '#/definitions/dto.ChangeViewPetRequest' + - description: pet id + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/dto.ChangeViewPetResponse' + "400": + description: Invalid request body + schema: + $ref: '#/definitions/dto.ResponseBadRequestErr' + "500": + description: Internal service error + schema: + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: changes pet's public visiblility + tags: + - pet + /v1/pets/create: + post: + consumes: + - application/json + description: Returns the data of pet if successful + parameters: + - description: pet dto + in: body + name: create + required: true + schema: + $ref: '#/definitions/dto.CreatePetRequest' + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/dto.PetResponse' + "400": + description: Invalid request body + schema: + $ref: '#/definitions/dto.ResponseBadRequestErr' + "500": + description: Internal service error + schema: + $ref: '#/definitions/dto.ResponseInternalErr' + "503": + description: Service is down + schema: + $ref: '#/definitions/dto.ResponseServiceDownErr' + summary: creates pet + tags: + - pet schemes: - https - http From d2d291cc20bd4123e6b480128f1a1ee5fc2fd03b Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 08:44:18 +0700 Subject: [PATCH 064/134] feat: user handler update --- src/app/handler/user/user.handler.go | 58 +++++++++++++++++++++++----- src/constant/user/user.constant.go | 5 +++ 2 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 src/constant/user/user.constant.go diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index 9bdca07..db905cd 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -2,10 +2,13 @@ package user import ( "net/http" + "strings" + "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" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" + userconst "github.com/isd-sgcu/johnjud-gateway/src/constant/user" "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/user" ) @@ -33,9 +36,9 @@ func NewHandler(service user.Service, validate validator.IDtoValidator) *Handler func (h *Handler) FindOne(c *router.FiberCtx) { id, err := c.ID() if err != nil { - c.JSON(http.StatusInternalServerError, dto.ResponseErr{ - StatusCode: http.StatusInternalServerError, - Message: "Invalid ID", + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: err.Error(), Data: nil, }) return @@ -47,27 +50,64 @@ func (h *Handler) FindOne(c *router.FiberCtx) { return } - c.JSON(http.StatusCreated, user) + c.JSON(http.StatusCreated, dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userconst.FindOneUserSuccessMessage, + Data: user, + }) return } +// Update is a function that updates user in database +// @Summary updates user +// @Description Returns the data of user if successfully +// @Param update body dto.UpdateUserRequest true "update user dto" +// @Tags auth +// @Accept json +// @Produce json +// @Success 201 {object} dto.User +// @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" +// @Failure 500 {object} dto.ResponseInternalErr "Internal service error" +// @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" +// @Router /v1/users [put] func (h *Handler) Update(c *router.FiberCtx) { usrId := c.UserID() - usrDto := dto.UpdateUserRequest{} + request := &dto.UpdateUserRequest{} - err := c.Bind(&usrDto) + err := c.Bind(request) if err != nil { - c.JSON(http.StatusBadRequest, err) + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + err.Error(), + Data: nil, + }) + return + } + + if err := h.validate.Validate(request); err != nil { + var errorMessage []string + for _, reqErr := range err { + errorMessage = append(errorMessage, reqErr.Message) + } + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + }) return } - user, errRes := h.service.Update(usrId, &usrDto) + user, errRes := h.service.Update(usrId, request) if errRes != nil { c.JSON(errRes.StatusCode, errRes) return } - c.JSON(http.StatusOK, user) + c.JSON(http.StatusOK, dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userconst.UpdateUserSuccessMessage, + Data: user, + }) return } diff --git a/src/constant/user/user.constant.go b/src/constant/user/user.constant.go new file mode 100644 index 0000000..7d84a6a --- /dev/null +++ b/src/constant/user/user.constant.go @@ -0,0 +1,5 @@ +package user + +const FindOneUserSuccessMessage = "find one user success" +const UpdateUserSuccessMessage = "update user success" +const DeleteUserSuccessMessage = "delete user success" From 746e744d090b9db8180dca751789cc5dbe5b0bff Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 08:48:38 +0700 Subject: [PATCH 065/134] feat: add context Role() --- src/app/router/context.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/router/context.go b/src/app/router/context.go index 4a1b00f..244c11d 100644 --- a/src/app/router/context.go +++ b/src/app/router/context.go @@ -32,6 +32,10 @@ func (c *FiberCtx) UserID() string { return c.Ctx.Locals("UserId").(string) } +func (c *FiberCtx) Role() string { + return c.Ctx.Locals("Role").(string) +} + func (c *FiberCtx) Bind(v interface{}) error { return c.Ctx.BodyParser(v) } From 915c17b0190f3e87d72630df50f4a7571a67b4a1 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 08:56:12 +0700 Subject: [PATCH 066/134] chore: gen mock --- src/app/router/context.go | 1 + src/mocks/router/context.mock.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/app/router/context.go b/src/app/router/context.go index 244c11d..4d55e9d 100644 --- a/src/app/router/context.go +++ b/src/app/router/context.go @@ -9,6 +9,7 @@ import ( type IContext interface { UserID() string + Role() string Bind(interface{}) error JSON(int, interface{}) ID() (string, error) diff --git a/src/mocks/router/context.mock.go b/src/mocks/router/context.mock.go index f2238b6..df02a3c 100644 --- a/src/mocks/router/context.mock.go +++ b/src/mocks/router/context.mock.go @@ -131,6 +131,20 @@ func (mr *MockIContextMockRecorder) Path() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Path", reflect.TypeOf((*MockIContext)(nil).Path)) } +// Role mocks base method. +func (m *MockIContext) Role() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Role") + ret0, _ := ret[0].(string) + return ret0 +} + +// Role indicates an expected call of Role. +func (mr *MockIContextMockRecorder) Role() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Role", reflect.TypeOf((*MockIContext)(nil).Role)) +} + // StoreValue mocks base method. func (m *MockIContext) StoreValue(arg0, arg1 string) { m.ctrl.T.Helper() From 8f8f8bd674d15b4f655e95a7bbb83b9833bb5d7d Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 08:56:22 +0700 Subject: [PATCH 067/134] feat: role const --- src/constant/user/user.constant.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/constant/user/user.constant.go b/src/constant/user/user.constant.go index 7d84a6a..cf1991e 100644 --- a/src/constant/user/user.constant.go +++ b/src/constant/user/user.constant.go @@ -3,3 +3,10 @@ package user const FindOneUserSuccessMessage = "find one user success" const UpdateUserSuccessMessage = "update user success" const DeleteUserSuccessMessage = "delete user success" + +type Role string + +const ( + USER Role = "user" + ADMIN Role = "admin" +) From 35e22425127bdc48547463dbe037aca85c916646 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 09:52:09 +0700 Subject: [PATCH 068/134] feat: add admin path --- src/app/middleware/auth/auth.middleware.go | 17 +++++++++++++++-- src/constant/auth/auth.constant.go | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/app/middleware/auth/auth.middleware.go b/src/app/middleware/auth/auth.middleware.go index 70db9b5..0d2430d 100644 --- a/src/app/middleware/auth/auth.middleware.go +++ b/src/app/middleware/auth/auth.middleware.go @@ -1,26 +1,30 @@ package auth import ( + "net/http" + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/utils" "github.com/isd-sgcu/johnjud-gateway/src/app/utils/auth" "github.com/isd-sgcu/johnjud-gateway/src/config" + "github.com/isd-sgcu/johnjud-gateway/src/constant/user" authPkg "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/auth" - "net/http" ) type Guard struct { service authPkg.Service excludes map[string]struct{} + adminpath map[string]struct{} conf config.App versionList map[string]struct{} } -func NewAuthGuard(s authPkg.Service, e map[string]struct{}, conf config.App, versionList map[string]struct{}) Guard { +func NewAuthGuard(s authPkg.Service, e map[string]struct{}, a map[string]struct{}, conf config.App, versionList map[string]struct{}) Guard { return Guard{ service: s, excludes: e, + adminpath: a, conf: conf, versionList: versionList, } @@ -53,5 +57,14 @@ func (m *Guard) Use(ctx router.IContext) error { ctx.StoreValue("UserId", payload.UserId) ctx.StoreValue("Role", payload.Role) + if utils.IsExisted(m.adminpath, path) && payload.Role != string(user.ADMIN) { + ctx.JSON(http.StatusUnauthorized, dto.ResponseErr{ + StatusCode: http.StatusUnauthorized, + Message: "Unauthorized", + Data: nil, + }) + return nil + } + return ctx.Next() } diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index 2273fbe..663e711 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -8,6 +8,8 @@ var ExcludePath = map[string]struct{}{ "GET /adopt/": {}, } +var AdminPath = map[string]struct{}{} + var VersionList = map[string]struct{}{ "v1": {}, } From e31bf92c990bbf283e7e5bd326b03b02a6c3f7d6 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Mon, 8 Jan 2024 10:02:35 +0700 Subject: [PATCH 069/134] feat: user handler delete --- src/app/handler/user/user.handler.go | 42 ++++++++++++++++++++++++++-- src/app/router/user.router.go | 11 ++++++-- src/main.go | 3 +- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index db905cd..0c3c208 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -33,7 +33,7 @@ func NewHandler(service user.Service, validate validator.IDtoValidator) *Handler // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" // @Router /v1/users/{id} [get] -func (h *Handler) FindOne(c *router.FiberCtx) { +func (h *Handler) FindOne(c router.IContext) { id, err := c.ID() if err != nil { c.JSON(http.StatusBadRequest, dto.ResponseErr{ @@ -70,7 +70,7 @@ func (h *Handler) FindOne(c *router.FiberCtx) { // @Failure 500 {object} dto.ResponseInternalErr "Internal service error" // @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" // @Router /v1/users [put] -func (h *Handler) Update(c *router.FiberCtx) { +func (h *Handler) Update(c router.IContext) { usrId := c.UserID() request := &dto.UpdateUserRequest{} @@ -111,3 +111,41 @@ func (h *Handler) Update(c *router.FiberCtx) { }) return } + +// Delete is a function that deletes user in database +// @Summary deletes user +// @Description Returns successful status if user is successfully deleted +// @Param id path string true "user id" +// @Tags user +// @Accept json +// @Produce json +// @Success 201 {object} bool +// @Success 201 {object} dto.DeleteUserResponse +// @Failure 400 {object} dto.ResponseBadRequestErr "Invalid request body" +// @Failure 500 {object} dto.ResponseInternalErr "Internal service error" +// @Failure 503 {object} dto.ResponseServiceDownErr "Service is down" +// @Router /v1/users/{id} [delete] +func (h *Handler) Delete(c router.IContext) { + id, err := c.ID() + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: err.Error(), + Data: nil, + }) + return + } + + res, errRes := h.service.Delete(id) + if errRes != nil { + c.JSON(errRes.StatusCode, errRes) + return + } + + c.JSON(http.StatusOK, dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userconst.DeleteUserSuccessMessage, + Data: res, + }) + return +} diff --git a/src/app/router/user.router.go b/src/app/router/user.router.go index f506484..f2da894 100644 --- a/src/app/router/user.router.go +++ b/src/app/router/user.router.go @@ -2,16 +2,23 @@ package router import "github.com/gofiber/fiber/v2" -func (r *FiberRouter) GetUser(path string, h func(ctx *FiberCtx)) { +func (r *FiberRouter) GetUser(path string, h func(ctx IContext)) { r.user.Get(path, func(c *fiber.Ctx) error { h(NewFiberCtx(c)) return nil }) } -func (r *FiberRouter) PutUser(path string, h func(ctx *FiberCtx)) { +func (r *FiberRouter) PutUser(path string, h func(ctx IContext)) { r.user.Put(path, func(c *fiber.Ctx) error { h(NewFiberCtx(c)) return nil }) } + +func (r *FiberRouter) DeleteUser(path string, h func(ctx IContext)) { + r.user.Delete(path, func(c *fiber.Ctx) error { + h(NewFiberCtx(c)) + return nil + }) +} diff --git a/src/main.go b/src/main.go index 2d354c7..c5cc95e 100644 --- a/src/main.go +++ b/src/main.go @@ -103,7 +103,7 @@ func main() { authService := authSvc.NewService(authClient) authHandler := authHdr.NewHandler(authService, userService, v) - authGuard := guard.NewAuthGuard(authService, auth.ExcludePath, conf.App, auth.VersionList) + authGuard := guard.NewAuthGuard(authService, auth.ExcludePath, auth.AdminPath, conf.App, auth.VersionList) imageClient := imageProto.NewImageServiceClient(fileConn) imageService := imageSvc.NewService(imageClient) @@ -120,6 +120,7 @@ func main() { r.GetUser("/:id", userHandler.FindOne) r.PutUser("/", userHandler.Update) + r.DeleteUser("/:id", userHandler.Delete) r.PostAuth("/signup", authHandler.Signup) r.PostAuth("/signin", authHandler.SignIn) From 81b350163c8125a079ebc552f2079e0b814bca4d Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 16:28:47 +0700 Subject: [PATCH 070/134] fix: handler pass by ref --- src/app/handler/user/user.handler.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index 0c3c208..f281c60 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -36,7 +36,7 @@ func NewHandler(service user.Service, validate validator.IDtoValidator) *Handler func (h *Handler) FindOne(c router.IContext) { id, err := c.ID() if err != nil { - c.JSON(http.StatusBadRequest, dto.ResponseErr{ + c.JSON(http.StatusBadRequest, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, Message: err.Error(), Data: nil, @@ -50,7 +50,7 @@ func (h *Handler) FindOne(c router.IContext) { return } - c.JSON(http.StatusCreated, dto.ResponseSuccess{ + c.JSON(http.StatusOK, &dto.ResponseSuccess{ StatusCode: http.StatusOK, Message: userconst.FindOneUserSuccessMessage, Data: user, @@ -77,7 +77,7 @@ func (h *Handler) Update(c router.IContext) { err := c.Bind(request) if err != nil { - c.JSON(http.StatusBadRequest, dto.ResponseErr{ + c.JSON(http.StatusBadRequest, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, Message: constant.BindingRequestErrorMessage + err.Error(), Data: nil, @@ -90,7 +90,7 @@ func (h *Handler) Update(c router.IContext) { for _, reqErr := range err { errorMessage = append(errorMessage, reqErr.Message) } - c.JSON(http.StatusBadRequest, dto.ResponseErr{ + c.JSON(http.StatusBadRequest, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), Data: nil, @@ -104,7 +104,7 @@ func (h *Handler) Update(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ + c.JSON(http.StatusOK, &dto.ResponseSuccess{ StatusCode: http.StatusOK, Message: userconst.UpdateUserSuccessMessage, Data: user, @@ -128,7 +128,7 @@ func (h *Handler) Update(c router.IContext) { func (h *Handler) Delete(c router.IContext) { id, err := c.ID() if err != nil { - c.JSON(http.StatusBadRequest, dto.ResponseErr{ + c.JSON(http.StatusBadRequest, &dto.ResponseErr{ StatusCode: http.StatusBadRequest, Message: err.Error(), Data: nil, @@ -142,7 +142,7 @@ func (h *Handler) Delete(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ + c.JSON(http.StatusOK, &dto.ResponseSuccess{ StatusCode: http.StatusOK, Message: userconst.DeleteUserSuccessMessage, Data: res, From fb02398bb3a7b1c3ee6739c9468cd7adf05be948 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 17:22:49 +0700 Subject: [PATCH 071/134] feat: user handler test --- src/app/handler/user/user.handler_test.go | 378 ++++++++++++++++++++++ 1 file changed, 378 insertions(+) create mode 100644 src/app/handler/user/user.handler_test.go diff --git a/src/app/handler/user/user.handler_test.go b/src/app/handler/user/user.handler_test.go new file mode 100644 index 0000000..e219baa --- /dev/null +++ b/src/app/handler/user/user.handler_test.go @@ -0,0 +1,378 @@ +package user + +import ( + "errors" + "net/http" + "strings" + "testing" + + "github.com/go-faker/faker/v4" + "github.com/golang/mock/gomock" + "github.com/isd-sgcu/johnjud-gateway/src/app/constant" + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + routerMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/router" + userMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/user" + validatorMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" + + errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" + userConst "github.com/isd-sgcu/johnjud-gateway/src/constant/user" + proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" + + "github.com/stretchr/testify/suite" +) + +type UserHandlerTest struct { + suite.Suite + User *proto.User + UserDto *dto.User + UpdateUserRequest *dto.UpdateUserRequest + BindErr *dto.ResponseErr + NotFoundErr *dto.ResponseErr + InvalidIDErr *dto.ResponseErr + ServiceDownErr *dto.ResponseErr + DuplicateEmailErr *dto.ResponseErr + InternalErr *dto.ResponseErr +} + +func TestUserHandler(t *testing.T) { + suite.Run(t, new(UserHandlerTest)) +} + +func (t *UserHandlerTest) SetupTest() { + t.User = &proto.User{ + Id: faker.UUIDDigit(), + Email: faker.Email(), + Password: faker.Password(), + Firstname: faker.FirstName(), + Lastname: faker.LastName(), + Role: "user", + } + t.UserDto = &dto.User{ + Id: t.User.Id, + Firstname: t.User.Firstname, + Lastname: t.User.Lastname, + Email: t.User.Email, + } + + t.UpdateUserRequest = &dto.UpdateUserRequest{} + + t.ServiceDownErr = &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: "Service is down", + Data: nil, + } + + t.NotFoundErr = &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: errConst.UserNotFoundMessage, + Data: nil, + } + + t.InvalidIDErr = &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: errConst.InvalidIDMessage, + Data: nil, + } + + t.BindErr = &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: errConst.InvalidIDMessage, + } + + t.DuplicateEmailErr = &dto.ResponseErr{ + StatusCode: http.StatusConflict, + Message: errConst.DuplicateEmailMessage, + Data: nil, + } + + t.InternalErr = &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: errConst.InternalErrorMessage, + Data: nil, + } +} + +func (t *UserHandlerTest) TestFindOneSuccess() { + svcResp := t.UserDto + expectedResp := &dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userConst.FindOneUserSuccessMessage, + Data: t.UserDto, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().FindOne(t.User.Id).Return(svcResp, nil) + context.EXPECT().JSON(http.StatusOK, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.FindOne(context) +} + +func (t *UserHandlerTest) TestFindOneNotFoundErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().FindOne(t.User.Id).Return(nil, t.NotFoundErr) + context.EXPECT().JSON(http.StatusNotFound, t.NotFoundErr) + + handler := NewHandler(userSvc, validator) + handler.FindOne(context) +} + +func (t *UserHandlerTest) TestFindOneInvalidIDErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return("", errors.New("Invalid ID")) + context.EXPECT().JSON(http.StatusBadRequest, t.InvalidIDErr) + + handler := NewHandler(userSvc, validator) + handler.FindOne(context) +} + +func (t *UserHandlerTest) TestFindOneInternalErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().FindOne(t.User.Id).Return(nil, t.InternalErr) + context.EXPECT().JSON(http.StatusInternalServerError, t.InternalErr) + + handler := NewHandler(userSvc, validator) + handler.FindOne(context) +} + +func (t *UserHandlerTest) TestFindOneGrpcErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().FindOne(t.User.Id).Return(nil, t.ServiceDownErr) + context.EXPECT().JSON(http.StatusServiceUnavailable, t.ServiceDownErr) + + handler := NewHandler(userSvc, validator) + handler.FindOne(context) +} + +func (t *UserHandlerTest) TestUpdateSuccess() { + svcResp := t.UserDto + expectedResp := &dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userConst.UpdateUserSuccessMessage, + Data: t.UserDto, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(nil) + validator.EXPECT().Validate(t.UpdateUserRequest).Return(nil) + userSvc.EXPECT().Update(t.User.Id, t.UpdateUserRequest).Return(svcResp, nil) + context.EXPECT().JSON(http.StatusOK, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestUpdateBindErr() { + bindErr := errors.New("Bind err") + expectedResp := &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + bindErr.Error(), + Data: nil, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(bindErr) + context.EXPECT().JSON(http.StatusBadRequest, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestUpdateValidateErr() { + errorMessage := []string{"First name is required", "Last name is required"} + validateErr := []*dto.BadReqErrResponse{ + { + Message: errorMessage[0], + FailedField: "firstname", + }, + { + Message: errorMessage[1], + FailedField: "lastname", + }, + } + expectedResp := &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(nil) + validator.EXPECT().Validate(t.UpdateUserRequest).Return(validateErr) + context.EXPECT().JSON(http.StatusBadRequest, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestUpdateDuplicateEmailErr() { + expectedResp := &dto.ResponseErr{ + StatusCode: http.StatusConflict, + Message: constant.DuplicateEmailMessage, + Data: nil, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(nil) + validator.EXPECT().Validate(t.UpdateUserRequest).Return(nil) + userSvc.EXPECT().Update(t.User.Id, t.UpdateUserRequest).Return(nil, t.DuplicateEmailErr) + context.EXPECT().JSON(http.StatusConflict, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestUpdateInternalErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(nil) + validator.EXPECT().Validate(t.UpdateUserRequest).Return(nil) + userSvc.EXPECT().Update(t.User.Id, t.UpdateUserRequest).Return(nil, t.InternalErr) + context.EXPECT().JSON(http.StatusInternalServerError, t.InternalErr) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestUpdateGrpcErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().UserID().Return(t.User.Id) + context.EXPECT().Bind(t.UpdateUserRequest).Return(nil) + validator.EXPECT().Validate(t.UpdateUserRequest).Return(nil) + userSvc.EXPECT().Update(t.User.Id, t.UpdateUserRequest).Return(nil, t.ServiceDownErr) + context.EXPECT().JSON(http.StatusServiceUnavailable, t.ServiceDownErr) + + handler := NewHandler(userSvc, validator) + handler.Update(context) +} + +func (t *UserHandlerTest) TestDeleteSuccess() { + deleteResp := &dto.DeleteUserResponse{ + Success: true, + } + expectedResp := &dto.ResponseSuccess{ + StatusCode: http.StatusOK, + Message: userConst.DeleteUserSuccessMessage, + Data: deleteResp, + } + + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().Delete(t.User.Id).Return(deleteResp, nil) + context.EXPECT().JSON(http.StatusOK, expectedResp) + + handler := NewHandler(userSvc, validator) + handler.Delete(context) +} + +func (t *UserHandlerTest) TestDeleteInvalidIDErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return("", errors.New("Invalid ID")) + context.EXPECT().JSON(http.StatusBadRequest, t.InvalidIDErr) + + handler := NewHandler(userSvc, validator) + handler.Delete(context) +} + +func (t *UserHandlerTest) TestDeleteInternalErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().Delete(t.User.Id).Return(nil, t.InternalErr) + context.EXPECT().JSON(http.StatusInternalServerError, t.InternalErr) + + handler := NewHandler(userSvc, validator) + handler.Delete(context) +} + +func (t *UserHandlerTest) TestDeleteGrpcErr() { + controller := gomock.NewController(t.T()) + + userSvc := userMock.NewMockService(controller) + validator := validatorMock.NewMockIDtoValidator(controller) + context := routerMock.NewMockIContext(controller) + + context.EXPECT().ID().Return(t.User.Id, nil) + userSvc.EXPECT().Delete(t.User.Id).Return(nil, t.ServiceDownErr) + context.EXPECT().JSON(http.StatusServiceUnavailable, t.ServiceDownErr) + + handler := NewHandler(userSvc, validator) + handler.Delete(context) +} From 0c82d9b9c784678c74af7eb73e34e03a0832456e Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 22:29:24 +0700 Subject: [PATCH 072/134] fix: remove validate in resp --- src/app/dto/user.dto.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/dto/user.dto.go b/src/app/dto/user.dto.go index c96fcab..8fc8b3a 100644 --- a/src/app/dto/user.dto.go +++ b/src/app/dto/user.dto.go @@ -15,5 +15,5 @@ type UpdateUserRequest struct { } type DeleteUserResponse struct { - Success bool `json:"success" validate:"required"` + Success bool `json:"success"` } From 974c192539ed4224d0b7e2f044bdf7a46c03c23e Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 22:47:14 +0700 Subject: [PATCH 073/134] fix: user handler lighter sucess respo --- src/app/handler/user/user.handler.go | 19 +++---------------- src/app/handler/user/user.handler_test.go | 19 +++---------------- 2 files changed, 6 insertions(+), 32 deletions(-) diff --git a/src/app/handler/user/user.handler.go b/src/app/handler/user/user.handler.go index f281c60..4277361 100644 --- a/src/app/handler/user/user.handler.go +++ b/src/app/handler/user/user.handler.go @@ -8,7 +8,6 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" - userconst "github.com/isd-sgcu/johnjud-gateway/src/constant/user" "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/user" ) @@ -50,11 +49,7 @@ func (h *Handler) FindOne(c router.IContext) { return } - c.JSON(http.StatusOK, &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userconst.FindOneUserSuccessMessage, - Data: user, - }) + c.JSON(http.StatusOK, user) return } @@ -104,11 +99,7 @@ func (h *Handler) Update(c router.IContext) { return } - c.JSON(http.StatusOK, &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userconst.UpdateUserSuccessMessage, - Data: user, - }) + c.JSON(http.StatusOK, user) return } @@ -142,10 +133,6 @@ func (h *Handler) Delete(c router.IContext) { return } - c.JSON(http.StatusOK, &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userconst.DeleteUserSuccessMessage, - Data: res, - }) + c.JSON(http.StatusOK, res) return } diff --git a/src/app/handler/user/user.handler_test.go b/src/app/handler/user/user.handler_test.go index e219baa..8757d2f 100644 --- a/src/app/handler/user/user.handler_test.go +++ b/src/app/handler/user/user.handler_test.go @@ -15,7 +15,6 @@ import ( validatorMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" - userConst "github.com/isd-sgcu/johnjud-gateway/src/constant/user" proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/user/v1" "github.com/stretchr/testify/suite" @@ -94,11 +93,7 @@ func (t *UserHandlerTest) SetupTest() { func (t *UserHandlerTest) TestFindOneSuccess() { svcResp := t.UserDto - expectedResp := &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userConst.FindOneUserSuccessMessage, - Data: t.UserDto, - } + expectedResp := t.UserDto controller := gomock.NewController(t.T()) @@ -175,11 +170,7 @@ func (t *UserHandlerTest) TestFindOneGrpcErr() { func (t *UserHandlerTest) TestUpdateSuccess() { svcResp := t.UserDto - expectedResp := &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userConst.UpdateUserSuccessMessage, - Data: t.UserDto, - } + expectedResp := t.UserDto controller := gomock.NewController(t.T()) @@ -313,11 +304,7 @@ func (t *UserHandlerTest) TestDeleteSuccess() { deleteResp := &dto.DeleteUserResponse{ Success: true, } - expectedResp := &dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: userConst.DeleteUserSuccessMessage, - Data: deleteResp, - } + expectedResp := deleteResp controller := gomock.NewController(t.T()) From 71c317591f9a5706269a88dcbb94b62131f8a684 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 22:47:23 +0700 Subject: [PATCH 074/134] fix: pet handler lighter sucess resp --- src/app/handler/pet/pet.handler.go | 43 ++++--------------------- src/app/handler/pet/pet.handler_test.go | 43 ++++--------------------- 2 files changed, 14 insertions(+), 72 deletions(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 7dae48c..b249905 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -8,7 +8,6 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" - petconst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" imageSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/image" petSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/pet" ) @@ -40,11 +39,7 @@ func (h *Handler) FindAll(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.FindAllPetSuccessMessage, - Data: response, - }) + c.JSON(http.StatusOK, response) return } @@ -77,11 +72,7 @@ func (h *Handler) FindOne(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.FindOnePetSuccessMessage, - Data: response, - }) + c.JSON(http.StatusOK, response) return } @@ -128,11 +119,7 @@ func (h *Handler) Create(c router.IContext) { return } - c.JSON(http.StatusCreated, dto.ResponseSuccess{ - StatusCode: http.StatusCreated, - Message: petconst.CreatePetSuccessMessage, - Data: response, - }) + c.JSON(http.StatusCreated, response) return } @@ -191,11 +178,7 @@ func (h *Handler) Update(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.UpdatePetSuccessMessage, - Data: pet, - }) + c.JSON(http.StatusOK, pet) return } @@ -254,11 +237,7 @@ func (h *Handler) ChangeView(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.ChangeViewPetSuccessMessage, - Data: res, - }) + c.JSON(http.StatusOK, res) return } @@ -291,11 +270,7 @@ func (h *Handler) Delete(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.DeletePetSuccessMessage, - Data: res, - }) + c.JSON(http.StatusOK, res) return } @@ -354,10 +329,6 @@ func (h *Handler) Adopt(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petconst.AdoptPetSuccessMessage, - Data: res, - }) + c.JSON(http.StatusOK, res) return } diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 659e221..fc96046 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -16,7 +16,6 @@ import ( errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/pet" - petConst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" petProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1" imgProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" @@ -131,11 +130,7 @@ func (t *PetHandlerTest) SetupTest() { func (t *PetHandlerTest) TestFindAllSuccess() { findAllResponse := utils.ProtoToDtoList(t.Pets, t.ImagesList) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.FindAllPetSuccessMessage, - Data: findAllResponse, - } + expectedResponse := findAllResponse controller := gomock.NewController(t.T()) @@ -153,11 +148,7 @@ func (t *PetHandlerTest) TestFindAllSuccess() { func (t *PetHandlerTest) TestFindOneSuccess() { findOneResponse := utils.ProtoToDto(t.Pet, t.Images) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.FindOnePetSuccessMessage, - Data: findOneResponse, - } + expectedResponse := findOneResponse controller := gomock.NewController(t.T()) @@ -212,11 +203,7 @@ func (t *PetHandlerTest) TestFindOneGrpcErr() { func (t *PetHandlerTest) TestCreateSuccess() { createResponse := utils.ProtoToDto(t.Pet, t.Images) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusCreated, - Message: petConst.CreatePetSuccessMessage, - Data: createResponse, - } + expectedResponse := createResponse controller := gomock.NewController(t.T()) @@ -255,11 +242,7 @@ func (t *PetHandlerTest) TestCreateGrpcErr() { func (t *PetHandlerTest) TestUpdateSuccess() { updateResponse := utils.ProtoToDto(t.Pet, t.Images) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.UpdatePetSuccessMessage, - Data: updateResponse, - } + expectedResponse := updateResponse controller := gomock.NewController(t.T()) @@ -322,11 +305,7 @@ func (t *PetHandlerTest) TestDeleteSuccess() { deleteResponse := &dto.DeleteResponse{ Success: true, } - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.DeletePetSuccessMessage, - Data: deleteResponse, - } + expectedResponse := deleteResponse controller := gomock.NewController(t.T()) @@ -386,11 +365,7 @@ func (t *PetHandlerTest) TestChangeViewSuccess() { changeViewResponse := &dto.ChangeViewPetResponse{ Success: true, } - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.ChangeViewPetSuccessMessage, - Data: changeViewResponse, - } + expectedResponse := changeViewResponse controller := gomock.NewController(t.T()) @@ -457,11 +432,7 @@ func (t *PetHandlerTest) TestAdoptSuccess() { adoptByResponse := &dto.AdoptByResponse{ Success: true, } - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: petConst.AdoptPetSuccessMessage, - Data: adoptByResponse, - } + expectedResponse := adoptByResponse controller := gomock.NewController(t.T()) From 797e5a473056c26a50fbcec33a1a49a6671a73ef Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 22:51:22 +0700 Subject: [PATCH 075/134] fix: like handler use lighter success resp --- src/app/dto/common.dto.go | 6 ------ src/app/handler/like/like.handler.go | 19 +++---------------- src/app/handler/like/like.handler_test.go | 19 +++---------------- 3 files changed, 6 insertions(+), 38 deletions(-) diff --git a/src/app/dto/common.dto.go b/src/app/dto/common.dto.go index ba64d2d..611c90e 100644 --- a/src/app/dto/common.dto.go +++ b/src/app/dto/common.dto.go @@ -67,9 +67,3 @@ type ResponseGatewayTimeoutErr struct { Message string `json:"message" example:"Connection timeout"` Data interface{} `json:"data"` } - -type ResponseSuccess struct { - StatusCode int `json:"status_code" example:"200"` - Message string `json:"message" example:"success"` - Data interface{} `json:"data"` -} diff --git a/src/app/handler/like/like.handler.go b/src/app/handler/like/like.handler.go index ab57fd8..accafc0 100644 --- a/src/app/handler/like/like.handler.go +++ b/src/app/handler/like/like.handler.go @@ -8,7 +8,6 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/app/dto" "github.com/isd-sgcu/johnjud-gateway/src/app/router" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" - likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" likeSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/like" ) @@ -38,11 +37,7 @@ func (h *Handler) FindByUserId(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: likeConst.FindLikeSuccessMessage, - Data: response, - }) + c.JSON(http.StatusOK, response) return } @@ -77,11 +72,7 @@ func (h *Handler) Create(c router.IContext) { return } - c.JSON(http.StatusCreated, dto.ResponseSuccess{ - StatusCode: http.StatusCreated, - Message: likeConst.CreateLikeSuccessMessage, - Data: response, - }) + c.JSON(http.StatusCreated, response) return } @@ -102,10 +93,6 @@ func (h *Handler) Delete(c router.IContext) { return } - c.JSON(http.StatusOK, dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: likeConst.DelteLikeSuccessMessage, - Data: res, - }) + c.JSON(http.StatusOK, res) return } diff --git a/src/app/handler/like/like.handler_test.go b/src/app/handler/like/like.handler_test.go index db72655..ed7debe 100644 --- a/src/app/handler/like/like.handler_test.go +++ b/src/app/handler/like/like.handler_test.go @@ -9,7 +9,6 @@ import ( errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/like" - likeConst "github.com/isd-sgcu/johnjud-gateway/src/constant/like" routerMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/router" likeMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/service/like" validatorMock "github.com/isd-sgcu/johnjud-gateway/src/mocks/validator" @@ -74,11 +73,7 @@ func (t *LikeHandlerTest) SetupTest() { func (t *LikeHandlerTest) TestFindLikesSuccess() { findLikeResponse := utils.ProtoToDtoList(t.Likes) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: likeConst.FindLikeSuccessMessage, - Data: findLikeResponse, - } + expectedResponse := findLikeResponse controller := gomock.NewController(t.T()) @@ -147,11 +142,7 @@ func (t *LikeHandlerTest) TestFindLikeInternalError() { func (t *LikeHandlerTest) TestCreateSuccess() { createLikeResponse := utils.ProtoToDto(t.Like) - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusCreated, - Message: likeConst.CreateLikeSuccessMessage, - Data: createLikeResponse, - } + expectedResponse := createLikeResponse controller := gomock.NewController(t.T()) @@ -208,11 +199,7 @@ func (t *LikeHandlerTest) TestDeleteSuccess() { deleteResponse := &dto.DeleteLikeResponse{ Success: true, } - expectedResponse := dto.ResponseSuccess{ - StatusCode: http.StatusOK, - Message: likeConst.DelteLikeSuccessMessage, - Data: deleteResponse, - } + expectedResponse := deleteResponse controller := gomock.NewController(t.T()) From 88d4f6d1dea20d6cf72ad5b350e3ecaeeca9684a Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 23:22:51 +0700 Subject: [PATCH 076/134] fix: pet create url --- src/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.go b/src/main.go index c5cc95e..d5d3306 100644 --- a/src/main.go +++ b/src/main.go @@ -132,7 +132,7 @@ func main() { r.GetPet("/", petHandler.FindAll) r.GetPet("/:id", petHandler.FindOne) - r.PostPet("/create", petHandler.Create) + r.PostPet("/", petHandler.Create) r.PutPet("/:id", petHandler.Update) r.PutPet("/:id/adopt", petHandler.Adopt) r.PutPet("/:id/visible", petHandler.ChangeView) From b625e8d33dc384b749cda2face6b1c0e067ad648 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 23:24:30 +0700 Subject: [PATCH 077/134] feat: add admin paths --- src/constant/auth/auth.constant.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index 663e711..aef786f 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -4,11 +4,18 @@ var ExcludePath = map[string]struct{}{ "POST /auth/signup": {}, "POST /auth/signin": {}, "POST /auth/verify": {}, - "GET /pet/": {}, + "GET /pets/": {}, "GET /adopt/": {}, } -var AdminPath = map[string]struct{}{} +var AdminPath = map[string]struct{}{ + "DELETE /users/:id": {}, + "POST /pets/": {}, + "PUT /pets/:id": {}, + "PUT /pets/:id/visible": {}, + "DELETE /pets/:id": {}, + //need to add image upload, delete, assignpet +} var VersionList = map[string]struct{}{ "v1": {}, From 4e497d0e5cd50164a4ba11959adcc2f7ee817211 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Tue, 9 Jan 2024 23:39:24 +0700 Subject: [PATCH 078/134] fix: auth config --- config/config.example.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/config/config.example.yaml b/config/config.example.yaml index f5e400a..1a12b6b 100644 --- a/config/config.example.yaml +++ b/config/config.example.yaml @@ -3,6 +3,10 @@ app: debug: true service: - auth: auth:3002 - backend: backend:3003 - file: file:3004 \ No newline at end of file + auth: localhost:3002 + backend: localhost:3003 + file: localhost:3004 + # Production, when gateway in a container in same network + # auth: auth:3002 + # backend: backend:3003 + # file: file:3004 \ No newline at end of file From 4de877ffea1bc9b3ea2a103d0ba9be4ed69b2331 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 00:13:32 +0700 Subject: [PATCH 079/134] fix: url endpoints not ending in / --- src/main.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.go b/src/main.go index d5d3306..f180270 100644 --- a/src/main.go +++ b/src/main.go @@ -119,7 +119,7 @@ func main() { r := router.NewFiberRouter(&authGuard, conf.App) r.GetUser("/:id", userHandler.FindOne) - r.PutUser("/", userHandler.Update) + r.PutUser("", userHandler.Update) r.DeleteUser("/:id", userHandler.Delete) r.PostAuth("/signup", authHandler.Signup) @@ -128,18 +128,18 @@ func main() { //r.PostAuth("/me", authHandler.Validate) r.PostAuth("/refreshToken", authHandler.RefreshToken) - r.GetHealthCheck("/", hc.HealthCheck) + r.GetHealthCheck("", hc.HealthCheck) - r.GetPet("/", petHandler.FindAll) + r.GetPet("", petHandler.FindAll) r.GetPet("/:id", petHandler.FindOne) - r.PostPet("/", petHandler.Create) + r.PostPet("", petHandler.Create) r.PutPet("/:id", petHandler.Update) r.PutPet("/:id/adopt", petHandler.Adopt) r.PutPet("/:id/visible", petHandler.ChangeView) r.DeletePet("/:id", petHandler.Delete) r.GetLike("/:id", likeHandler.FindByUserId) - r.PostLike("/", likeHandler.Create) + r.PostLike("", likeHandler.Create) r.DeleteLike("/:id", likeHandler.Delete) v1 := router.NewAPIv1(r, conf.App) From 44cd89ffb732250aa20dc6d0be771af6442a4f5e Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 00:13:55 +0700 Subject: [PATCH 080/134] fix: auth middleware detect :id --- src/app/middleware/auth/auth.middleware.go | 4 +- src/app/utils/auth/auth.utils.go | 59 +++++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/app/middleware/auth/auth.middleware.go b/src/app/middleware/auth/auth.middleware.go index 0d2430d..8fe46ed 100644 --- a/src/app/middleware/auth/auth.middleware.go +++ b/src/app/middleware/auth/auth.middleware.go @@ -33,8 +33,10 @@ func NewAuthGuard(s authPkg.Service, e map[string]struct{}, a map[string]struct{ func (m *Guard) Use(ctx router.IContext) error { method := ctx.Method() path := ctx.Path() + path = utils.TrimInList(path, "/", m.versionList) - path = auth.FormatPath(method, path) + ids := auth.FindIDFromPath(path) + path = auth.FormatPath(method, path, ids) if utils.IsExisted(m.excludes, path) { return ctx.Next() } diff --git a/src/app/utils/auth/auth.utils.go b/src/app/utils/auth/auth.utils.go index 18de087..5a05f51 100644 --- a/src/app/utils/auth/auth.utils.go +++ b/src/app/utils/auth/auth.utils.go @@ -2,8 +2,65 @@ package auth import ( "fmt" + "strconv" + "strings" + + "github.com/google/uuid" ) -func FormatPath(method string, path string) string { +func IsExisted(e map[string]struct{}, key string) bool { + _, ok := e[key] + if ok { + return true + } + return false +} + +func FormatPath(method string, path string, keys []string) string { + for _, key := range keys { + path = strings.Replace(path, key, ":id", 1) + } + return fmt.Sprintf("%v %v", method, path) } + +func FindIntFromStr(s string, sep string) []string { + spliteds := strings.Split(s, sep) + + var result []string + + for _, splited := range spliteds { + _, err := strconv.Atoi(splited) + if err == nil { + result = append(result, splited) + } + } + + return result +} + +func FindUUIDFromStr(s string, sep string) []string { + spliteds := strings.Split(s, sep) + + var result []string + + for _, splited := range spliteds { + _, err := uuid.Parse(splited) + if err == nil { + result = append(result, splited) + } + } + + return result +} + +func MergeStringSlice(s1 []string, s2 []string) []string { + return append(s1, s2...) +} + +func FindIDFromPath(path string) []string { + uuids := FindUUIDFromStr(path, "/") + ids := FindIntFromStr(path, "/") + + return MergeStringSlice(ids, uuids) +} From 6fb9623ba50bb52182a293d923bf0384b811104e Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 00:14:06 +0700 Subject: [PATCH 081/134] fix: paths --- src/constant/auth/auth.constant.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index aef786f..3cf5931 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -4,13 +4,14 @@ var ExcludePath = map[string]struct{}{ "POST /auth/signup": {}, "POST /auth/signin": {}, "POST /auth/verify": {}, - "GET /pets/": {}, - "GET /adopt/": {}, + "GET /user/:id": {}, + "GET /pets": {}, + "GET /adopt": {}, } var AdminPath = map[string]struct{}{ "DELETE /users/:id": {}, - "POST /pets/": {}, + "POST /pets": {}, "PUT /pets/:id": {}, "PUT /pets/:id/visible": {}, "DELETE /pets/:id": {}, From 46f26d82a1e14394035036a34cb81087ceb1b982 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 00:45:59 +0700 Subject: [PATCH 082/134] fix: auth cache --- config/auth/config.example.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/auth/config.example.yaml b/config/auth/config.example.yaml index 6db63c4..50d989a 100644 --- a/config/auth/config.example.yaml +++ b/config/auth/config.example.yaml @@ -17,7 +17,7 @@ jwt: issuer: redis: - host: localhost + host: local-cache port: 6379 password: "" dbnum: 0 \ No newline at end of file From f9a2f07ce217879597c68b54ad452377a61c9f7a Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 00:53:31 +0700 Subject: [PATCH 083/134] fix: pet dto --- go.mod | 2 +- go.sum | 2 ++ src/app/dto/pet.dto.go | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index c0a6d31..ea78af7 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/gofiber/fiber/v2 v2.52.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.5.0 - github.com/isd-sgcu/johnjud-go-proto v0.2.2 + github.com/isd-sgcu/johnjud-go-proto v0.3.1 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/spf13/viper v1.18.2 diff --git a/go.sum b/go.sum index d5858c6..13ffa07 100644 --- a/go.sum +++ b/go.sum @@ -68,6 +68,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/isd-sgcu/johnjud-go-proto v0.2.2 h1:TOAmbwy/I+8/J5LPZH0ZN7lSLczBiZe1fs88gH8XrhY= github.com/isd-sgcu/johnjud-go-proto v0.2.2/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= +github.com/isd-sgcu/johnjud-go-proto v0.3.1 h1:WyWfzl+5nWOw3AmINtcTfojg4CJh8ZRNbZC6qA//OXU= +github.com/isd-sgcu/johnjud-go-proto v0.3.1/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index d6b7ce3..6d4532e 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -36,6 +36,8 @@ type CreatePetRequest struct { Name string `json:"name" validate:"required"` Birthdate string `json:"birthdate" validate:"required"` Gender pet.Gender `json:"gender" validate:"required" example:"1"` + Color string `json:"color" validate:"required"` + Pattern string `json:"pattern" validate:"required"` Habit string `json:"habit" validate:"required"` Caption string `json:"caption"` Status pet.Status `json:"status" validate:"required" example:"1"` @@ -43,7 +45,7 @@ type CreatePetRequest struct { IsVaccinated *bool `json:"is_vaccinated" validate:"required"` IsVisible *bool `json:"is_visible" validate:"required"` IsClubPet *bool `json:"is_club_pet" validate:"required"` - Background string `json:"background"` + Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` AdoptBy string `json:"adopt_by"` From a3370027ca4e585030afeaf573b9a50c1c1daafb Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 01:03:42 +0700 Subject: [PATCH 084/134] feat: new pet type --- src/app/dto/pet.dto.go | 14 ++++++---- src/app/utils/pet/pet.utils.go | 46 +++++++++++++++++++------------- src/constant/pet/pet.constant.go | 22 +++++++-------- 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 6d4532e..717717d 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -16,6 +16,8 @@ type PetResponse struct { Name string `json:"name"` Birthdate string `json:"birthdate"` Gender pet.Gender `json:"gender"` + Color string `json:"color"` + Pattern string `json:"pattern"` Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` @@ -23,7 +25,7 @@ type PetResponse struct { IsVaccinated *bool `json:"is_vaccinated"` IsVisible *bool `json:"is_visible"` IsClubPet *bool `json:"is_club_pet"` - Background string `json:"background"` + Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` AdoptBy string `json:"adopt_by"` @@ -35,17 +37,17 @@ type CreatePetRequest struct { Species string `json:"species" validate:"required"` Name string `json:"name" validate:"required"` Birthdate string `json:"birthdate" validate:"required"` - Gender pet.Gender `json:"gender" validate:"required" example:"1"` + Gender pet.Gender `json:"gender" validate:"required" example:"male"` Color string `json:"color" validate:"required"` Pattern string `json:"pattern" validate:"required"` Habit string `json:"habit" validate:"required"` Caption string `json:"caption"` - Status pet.Status `json:"status" validate:"required" example:"1"` + Status pet.Status `json:"status" validate:"required" example:"findhome"` IsSterile *bool `json:"is_sterile" validate:"required"` IsVaccinated *bool `json:"is_vaccinated" validate:"required"` IsVisible *bool `json:"is_visible" validate:"required"` IsClubPet *bool `json:"is_club_pet" validate:"required"` - Origin string `json:"origin"` + Origin string `json:"origin" validate:"required"` Address string `json:"address"` Contact string `json:"contact"` AdoptBy string `json:"adopt_by"` @@ -75,6 +77,8 @@ type UpdatePetRequest struct { Name string `json:"name"` Birthdate string `json:"birthdate"` Gender pet.Gender `json:"gender"` + Color string `json:"color"` + Pattern string `json:"pattern"` Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` @@ -82,7 +86,7 @@ type UpdatePetRequest struct { IsVaccinated *bool `json:"is_vaccinated"` IsVisible *bool `json:"is_visible"` IsClubPet *bool `json:"is_club_pet"` - Background string `json:"background"` + Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` AdoptBy string `json:"adopt_by"` diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index 1f68987..434f820 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -35,6 +35,8 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { Name: in.Name, Birthdate: in.Birthdate, Gender: pet.Gender(in.Gender), + Color: in.Color, + Pattern: in.Pattern, Habit: in.Habit, Caption: in.Caption, Status: pet.Status(in.Status), @@ -42,7 +44,7 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { IsVaccinated: &in.IsVaccinated, IsVisible: &in.IsVisible, IsClubPet: &in.IsClubPet, - Background: in.Background, + Origin: in.Origin, Address: in.Address, Contact: in.Contact, AdoptBy: in.AdoptBy, @@ -58,16 +60,18 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { Species: in.Species, Name: in.Name, Birthdate: in.Birthdate, - Gender: petproto.Gender(in.Gender), + Gender: string(in.Gender), + Color: in.Color, + Pattern: in.Pattern, Habit: in.Habit, Caption: in.Caption, Images: []*imgproto.Image{}, - Status: petproto.PetStatus(in.Status), + Status: string(in.Status), IsSterile: *in.IsSterile, IsVaccinated: *in.IsVaccinated, IsVisible: *in.IsVisible, IsClubPet: *in.IsClubPet, - Background: in.Background, + Origin: in.Origin, Address: in.Address, Contact: in.Contact, AdoptBy: in.AdoptBy, @@ -78,20 +82,22 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { func UpdateDtoToProto(id string, in *dto.UpdatePetRequest) *petproto.UpdatePetRequest { req := &petproto.UpdatePetRequest{ Pet: &petproto.Pet{ - Id: id, - Type: in.Type, - Species: in.Species, - Name: in.Name, - Birthdate: in.Birthdate, - Gender: petproto.Gender(in.Gender), - Habit: in.Habit, - Caption: in.Caption, - Images: []*imgproto.Image{}, - Status: petproto.PetStatus(in.Status), - Background: in.Background, - Address: in.Address, - Contact: in.Contact, - AdoptBy: in.AdoptBy, + Id: id, + Type: in.Type, + Species: in.Species, + Name: in.Name, + Birthdate: in.Birthdate, + Gender: string(in.Gender), + Color: in.Color, + Pattern: in.Pattern, + Habit: in.Habit, + Caption: in.Caption, + Images: []*imgproto.Image{}, + Status: string(in.Status), + Origin: in.Origin, + Address: in.Address, + Contact: in.Contact, + AdoptBy: in.AdoptBy, }, } @@ -132,6 +138,8 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P Name: p.Name, Birthdate: p.Birthdate, Gender: pet.Gender(p.Gender), + Color: p.Color, + Pattern: p.Pattern, Habit: p.Habit, Caption: p.Caption, Status: pet.Status(p.Status), @@ -139,7 +147,7 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P IsVaccinated: &p.IsVaccinated, IsVisible: &p.IsVisible, IsClubPet: &p.IsClubPet, - Background: p.Background, + Origin: p.Origin, Address: p.Address, Contact: p.Contact, AdoptBy: p.AdoptBy, diff --git a/src/constant/pet/pet.constant.go b/src/constant/pet/pet.constant.go index 4ff078c..d2428f6 100644 --- a/src/constant/pet/pet.constant.go +++ b/src/constant/pet/pet.constant.go @@ -6,18 +6,18 @@ import ( "strings" ) -type Gender int +type Gender string const ( - MALE = 1 - FEMALE = 2 + MALE Gender = "male" + FEMALE Gender = "female" ) -type Status int +type Status string const ( - ADOPTED = 1 - FINDHOME = 2 + ADOPTED Status = "adopted" + FINDHOME Status = "findhome" ) func (g *Gender) UnmarshalJSON(data []byte) error { @@ -28,10 +28,10 @@ func (g *Gender) UnmarshalJSON(data []byte) error { s = strings.ToUpper(s) switch s { case "MALE": - *g = Gender(1) + *g = MALE return nil case "FEMALE": - *g = Gender(2) + *g = FEMALE return nil default: @@ -47,14 +47,14 @@ func (st *Status) UnmarshalJSON(data []byte) error { s = strings.ToUpper(s) switch s { case "ADOPTED": - *st = Status(1) + *st = ADOPTED return nil case "FINDHOME": - *st = Status(2) + *st = FINDHOME return nil default: - return errors.New("invalid gender") + return errors.New("invalid status") } } From 66522a52bfc1eedebd0f47a2246ec8e0513eae83 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 01:03:51 +0700 Subject: [PATCH 085/134] fix: auth client mock --- src/mocks/client/auth/auth.mock.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/mocks/client/auth/auth.mock.go b/src/mocks/client/auth/auth.mock.go index 873ce2e..7474f16 100644 --- a/src/mocks/client/auth/auth.mock.go +++ b/src/mocks/client/auth/auth.mock.go @@ -2,6 +2,7 @@ package auth import ( "context" + authProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/auth/auth/v1" "github.com/stretchr/testify/mock" "google.golang.org/grpc" @@ -45,3 +46,17 @@ func (m *AuthClientMock) SignOut(_ context.Context, in *authProto.SignOutRequest err, _ := args.Get(1).(error) return resp, err } + +func (m *AuthClientMock) ForgotPassword(_ context.Context, in *authProto.ForgotPasswordRequest, _ ...grpc.CallOption) (*authProto.ForgotPasswordResponse, error) { + args := m.Called(in) + resp, _ := args.Get(0).(*authProto.ForgotPasswordResponse) + err, _ := args.Get(1).(error) + return resp, err +} + +func (m *AuthClientMock) ResetPassword(_ context.Context, in *authProto.ResetPasswordRequest, _ ...grpc.CallOption) (*authProto.ResetPasswordResponse, error) { + args := m.Called(in) + resp, _ := args.Get(0).(*authProto.ResetPasswordResponse) + err, _ := args.Get(1).(error) + return resp, err +} From 73d4a048aee8b70d50fe224b3c1a2cb09f02f801 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 01:03:58 +0700 Subject: [PATCH 086/134] fix: pet tests --- src/app/handler/pet/pet.handler_test.go | 15 +++++++++++---- src/app/service/pet/pet.service_test.go | 22 ++++++++++++++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 659e221..d720170 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -49,6 +49,9 @@ func (t *PetHandlerTest) SetupTest() { t.ImagesList = imagesList t.Images = imagesList[0] var pets []*petProto.Pet + genders := []petConst.Gender{petConst.MALE, petConst.FEMALE} + statuses := []petConst.Status{petConst.ADOPTED, petConst.FINDHOME} + for i := 0; i <= 3; i++ { pet := &petProto.Pet{ Id: faker.UUIDDigit(), @@ -56,16 +59,18 @@ func (t *PetHandlerTest) SetupTest() { Species: faker.Word(), Name: faker.Name(), Birthdate: faker.Word(), - Gender: petProto.Gender(rand.Intn(1) + 1), + Gender: string(genders[rand.Intn(2)]), + Color: faker.Word(), + Pattern: faker.Word(), Habit: faker.Paragraph(), Caption: faker.Paragraph(), Images: []*imgProto.Image{}, - Status: petProto.PetStatus(rand.Intn(1) + 1), + Status: string(statuses[rand.Intn(2)]), IsSterile: true, IsVaccinated: true, IsVisible: true, IsClubPet: true, - Background: faker.Paragraph(), + Origin: faker.Paragraph(), Address: faker.Paragraph(), Contact: faker.Paragraph(), AdoptBy: "", @@ -84,6 +89,8 @@ func (t *PetHandlerTest) SetupTest() { Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), + Color: t.Pet.Color, + Pattern: t.Pet.Pattern, Habit: t.Pet.Habit, Caption: t.Pet.Caption, Status: pet.Status(t.Pet.Status), @@ -91,7 +98,7 @@ func (t *PetHandlerTest) SetupTest() { IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, IsClubPet: &t.Pet.IsClubPet, - Background: t.Pet.Background, + Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, AdoptBy: t.Pet.AdoptBy, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index 5705c12..f32efac 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -51,6 +51,8 @@ func (t *PetServiceTest) SetupTest() { imagesList := utils.MockImageList(3) t.ImagesList = imagesList t.Images = imagesList[0] + genders := []pet.Gender{pet.MALE, pet.FEMALE} + statuses := []pet.Status{pet.ADOPTED, pet.FINDHOME} var pets []*petproto.Pet for i := 0; i <= 3; i++ { @@ -60,16 +62,18 @@ func (t *PetServiceTest) SetupTest() { Species: faker.Word(), Name: faker.Name(), Birthdate: faker.Word(), - Gender: petproto.Gender(rand.Intn(1) + 1), + Gender: string(genders[rand.Intn(2)]), + Color: faker.Word(), + Pattern: faker.Word(), Habit: faker.Paragraph(), Caption: faker.Paragraph(), Images: imagesList[i], - Status: petproto.PetStatus(rand.Intn(1) + 1), + Status: string(statuses[rand.Intn(2)]), IsSterile: true, IsVaccinated: true, IsVisible: true, IsClubPet: true, - Background: faker.Paragraph(), + Origin: faker.Paragraph(), Address: faker.Paragraph(), Contact: faker.Paragraph(), AdoptBy: faker.UUIDDigit(), @@ -88,6 +92,8 @@ func (t *PetServiceTest) SetupTest() { Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: t.Pet.Gender, + Color: t.Pet.Color, + Pattern: t.Pet.Pattern, Habit: t.Pet.Habit, Caption: t.Pet.Caption, Images: t.Pet.Images, @@ -96,7 +102,7 @@ func (t *PetServiceTest) SetupTest() { IsVaccinated: t.Pet.IsVaccinated, IsVisible: false, IsClubPet: t.Pet.IsClubPet, - Background: t.Pet.Background, + Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, AdoptBy: t.Pet.AdoptBy, @@ -110,6 +116,8 @@ func (t *PetServiceTest) SetupTest() { Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), + Color: t.Pet.Color, + Pattern: t.Pet.Pattern, Habit: t.Pet.Habit, Caption: t.Pet.Caption, Images: []string{}, @@ -118,7 +126,7 @@ func (t *PetServiceTest) SetupTest() { IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, IsClubPet: &t.Pet.IsClubPet, - Background: t.Pet.Background, + Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, AdoptBy: t.Pet.AdoptBy, @@ -130,6 +138,8 @@ func (t *PetServiceTest) SetupTest() { Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), + Color: t.Pet.Color, + Pattern: t.Pet.Pattern, Habit: t.Pet.Habit, Caption: t.Pet.Caption, Images: []string{}, @@ -138,7 +148,7 @@ func (t *PetServiceTest) SetupTest() { IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, IsClubPet: &t.Pet.IsClubPet, - Background: t.Pet.Background, + Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, AdoptBy: t.Pet.AdoptBy, From d0a1854a4a4d829a04c039a6bf6a02987a78df01 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Wed, 10 Jan 2024 01:21:39 +0700 Subject: [PATCH 087/134] fix: admin paths --- src/app/middleware/auth/auth.middleware.go | 2 +- src/constant/auth/auth.constant.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/middleware/auth/auth.middleware.go b/src/app/middleware/auth/auth.middleware.go index 8fe46ed..3660164 100644 --- a/src/app/middleware/auth/auth.middleware.go +++ b/src/app/middleware/auth/auth.middleware.go @@ -62,7 +62,7 @@ func (m *Guard) Use(ctx router.IContext) error { if utils.IsExisted(m.adminpath, path) && payload.Role != string(user.ADMIN) { ctx.JSON(http.StatusUnauthorized, dto.ResponseErr{ StatusCode: http.StatusUnauthorized, - Message: "Unauthorized", + Message: "Limited access", Data: nil, }) return nil diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index 3cf5931..e25d157 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -10,7 +10,7 @@ var ExcludePath = map[string]struct{}{ } var AdminPath = map[string]struct{}{ - "DELETE /users/:id": {}, + "DELETE /user/:id": {}, "POST /pets": {}, "PUT /pets/:id": {}, "PUT /pets/:id/visible": {}, From 8fa42dc2077bc3ad299d07e045a1b9a369b7c333 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 16:53:03 +0700 Subject: [PATCH 088/134] chore --- src/app/handler/pet/pet.handler_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 1039e89..26318e6 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -16,6 +16,7 @@ import ( errConst "github.com/isd-sgcu/johnjud-gateway/src/app/constant" utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/pet" + petConst "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" petProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1" imgProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" From 0571338ee27debd14e339ab10dff3ef25dd7d18a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:03:41 +0700 Subject: [PATCH 089/134] chore --- src/app/constant/error.constant.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/constant/error.constant.go b/src/app/constant/error.constant.go index 6b9a24a..5e378d3 100644 --- a/src/app/constant/error.constant.go +++ b/src/app/constant/error.constant.go @@ -13,3 +13,4 @@ const InvalidArgumentMessage = "Invalid Argument" const PetNotFoundMessage = "Pet not found" const UserNotFoundMessage = "User not found" +const ImageNotFoundMessage = "Image not found" From 65c4ce21186ab5f736299cfd7ce127fd81b1e78c Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:03:45 +0700 Subject: [PATCH 090/134] fix: image dto --- src/app/dto/image.dto.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/dto/image.dto.go b/src/app/dto/image.dto.go index f30947a..154a926 100644 --- a/src/app/dto/image.dto.go +++ b/src/app/dto/image.dto.go @@ -1,7 +1,11 @@ package dto -type ImageDto struct { +type UploadImageRequest struct { Filename string `json:"filename" validate:"required"` Data []byte `json:"data" validate:"required"` PetId string `json:"pet_id" validate:"required"` } + +type DeleteImageResponse struct { + Success bool `json:"success"` +} From 94a7e3bf68debbbaa50dcc53100c98d26a1fb27a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:03:53 +0700 Subject: [PATCH 091/134] fix: image response dto --- src/app/dto/pet.dto.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 24c9fd0..29b7367 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -5,8 +5,9 @@ import ( ) type ImageResponse struct { - Id string `json:"id"` - Url string `json:"url"` + Id string `json:"id"` + Url string `json:"url"` + ObjectKey string `json:"object_key"` } type PetResponse struct { From 4b3f1ee69434f10690c5f0161f2e24aacfcc79d7 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:31 +0700 Subject: [PATCH 092/134] chore --- src/app/dto/image.dto.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app/dto/image.dto.go b/src/app/dto/image.dto.go index 154a926..458e218 100644 --- a/src/app/dto/image.dto.go +++ b/src/app/dto/image.dto.go @@ -1,5 +1,11 @@ package dto +type ImageResponse struct { + Id string `json:"id"` + Url string `json:"url"` + ObjectKey string `json:"object_key"` +} + type UploadImageRequest struct { Filename string `json:"filename" validate:"required"` Data []byte `json:"data" validate:"required"` From 555e4e6185bb97729e01b5ec90ce094002a988bb Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:32 +0700 Subject: [PATCH 093/134] chore --- src/app/dto/pet.dto.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 29b7367..39a77ff 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -4,12 +4,6 @@ import ( "github.com/isd-sgcu/johnjud-gateway/src/constant/pet" ) -type ImageResponse struct { - Id string `json:"id"` - Url string `json:"url"` - ObjectKey string `json:"object_key"` -} - type PetResponse struct { Id string `json:"id"` Type string `json:"type"` From e9f88a6fcb0782b510959c6917ed89a7ea5d1fba Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:45 +0700 Subject: [PATCH 094/134] feat: image handler --- src/app/handler/image/image.handler.go | 76 +++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/src/app/handler/image/image.handler.go b/src/app/handler/image/image.handler.go index 7e496cb..4e0336a 100644 --- a/src/app/handler/image/image.handler.go +++ b/src/app/handler/image/image.handler.go @@ -1,6 +1,12 @@ package auth import ( + "fmt" + "net/http" + "strings" + + "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" "github.com/isd-sgcu/johnjud-gateway/src/app/validator" imageSvc "github.com/isd-sgcu/johnjud-gateway/src/pkg/service/image" @@ -8,21 +14,87 @@ import ( type Handler struct { service imageSvc.Service - validate *validator.DtoValidator + validate validator.IDtoValidator } -func NewHandler(service imageSvc.Service, validate *validator.DtoValidator) *Handler { +func NewHandler(service imageSvc.Service, validate validator.IDtoValidator) *Handler { return &Handler{service, validate} } func (h *Handler) FindByPetId(c *router.FiberCtx) { + id, err := c.ID() + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InvalidIDMessage, + Data: nil, + }) + return + } + + response, respErr := h.service.FindByPetId(id) + if respErr != nil { + c.JSON(respErr.StatusCode, respErr) + return + } + c.JSON(http.StatusOK, response) + return } func (h *Handler) Upload(c *router.FiberCtx) { + request := &dto.UploadImageRequest{} + err := c.Bind(request) + fmt.Println("request: ", request) + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + err.Error(), + Data: nil, + }) + return + } + + if err := h.validate.Validate(request); err != nil { + var errorMessage []string + for _, reqErr := range err { + errorMessage = append(errorMessage, reqErr.Message) + } + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + }) + return + } + response, respErr := h.service.Upload(request) + if respErr != nil { + c.JSON(respErr.StatusCode, respErr) + return + } + + c.JSON(http.StatusCreated, response) + return } func (h *Handler) Delete(c *router.FiberCtx) { + id, err := c.ID() + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: err.Error(), + Data: nil, + }) + return + } + + res, errRes := h.service.Delete(id) + if errRes != nil { + c.JSON(errRes.StatusCode, errRes) + return + } + c.JSON(http.StatusOK, res.Success) + return } From 4cfea264bc547da87e16c8b9f30b5fa6b1ddada8 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:48 +0700 Subject: [PATCH 095/134] feat: image service --- src/app/service/image/image.service.go | 122 +++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 6 deletions(-) diff --git a/src/app/service/image/image.service.go b/src/app/service/image/image.service.go index 6ff8668..05c1bc4 100644 --- a/src/app/service/image/image.service.go +++ b/src/app/service/image/image.service.go @@ -1,8 +1,17 @@ package image import ( + "context" + "net/http" + "time" + + "github.com/isd-sgcu/johnjud-gateway/src/app/constant" "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + utils "github.com/isd-sgcu/johnjud-gateway/src/app/utils/image" proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" + "github.com/rs/zerolog/log" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) type Service struct { @@ -15,14 +24,115 @@ func NewService(client proto.ImageServiceClient) *Service { } } -func (s *Service) FindByPetId(string) ([]*proto.Image, *dto.ResponseErr) { - return nil, nil +func (s *Service) FindByPetId(petId string) ([]*dto.ImageResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + res, errRes := s.client.FindByPetId(ctx, &proto.FindImageByPetIdRequest{PetId: petId}) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Str("service", "image"). + Str("module", "find by pet id"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.PetNotFoundMessage, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return utils.ProtoToDtoList(res.Images), nil } -func (s *Service) Upload(in *dto.ImageDto) (*proto.Image, *dto.ResponseErr) { - return nil, nil +func (s *Service) Upload(in *dto.UploadImageRequest) (*dto.ImageResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + request := utils.CreateDtoToProto(in) + res, errRes := s.client.Upload(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "image"). + Str("module", "upload"). + Msg(st.Message()) + switch st.Code() { + case codes.InvalidArgument: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidArgumentMessage, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return utils.ProtoToDto(res.Image), nil } -func (s *Service) Delete(id string) (bool, *dto.ResponseErr) { - return false, nil +func (s *Service) Delete(id string) (*dto.DeleteImageResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + request := &proto.DeleteImageRequest{ + Id: id, + } + + res, errRes := s.client.Delete(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "image"). + Str("module", "delete"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.ImageNotFoundMessage, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return &dto.DeleteImageResponse{ + Success: res.Success, + }, nil } From 7b586b095d9ce65f1d6146da9ae50c1cd4488062 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:04:53 +0700 Subject: [PATCH 096/134] feat: image utils --- src/app/utils/image/image.utils.go | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/app/utils/image/image.utils.go diff --git a/src/app/utils/image/image.utils.go b/src/app/utils/image/image.utils.go new file mode 100644 index 0000000..705c34f --- /dev/null +++ b/src/app/utils/image/image.utils.go @@ -0,0 +1,54 @@ +package image + +import ( + "fmt" + + "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + imageProto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" +) + +func ProtoToDto(in *imageProto.Image) *dto.ImageResponse { + return &dto.ImageResponse{ + Id: in.Id, + Url: in.ImageUrl, + ObjectKey: in.ObjectKey, + } +} + +func ProtoToDtoList(in []*imageProto.Image) []*dto.ImageResponse { + var res []*dto.ImageResponse + for _, i := range in { + res = append(res, &dto.ImageResponse{ + Id: i.Id, + Url: i.ImageUrl, + ObjectKey: i.ObjectKey, + }) + } + return res +} + +func CreateDtoToProto(in *dto.UploadImageRequest) *imageProto.UploadImageRequest { + return &imageProto.UploadImageRequest{ + Filename: in.Filename, + Data: in.Data, + PetId: in.PetId, + } +} + +func MockImageList(n int) [][]*imageProto.Image { + var imagesList [][]*imageProto.Image + for i := 0; i <= n; i++ { + var images []*imageProto.Image + for j := 0; j <= 3; j++ { + images = append(images, &imageProto.Image{ + Id: fmt.Sprintf("%v%v", i, j), + PetId: fmt.Sprintf("%v%v", i, j), + ImageUrl: fmt.Sprintf("%v%v", i, j), + ObjectKey: fmt.Sprintf("%v%v", i, j), + }) + } + imagesList = append(imagesList, images) + } + + return imagesList +} From 652b4629f87d608da1b11c872f0dbb590aba9c32 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:05:01 +0700 Subject: [PATCH 097/134] gen mock --- src/mocks/service/image/image.mock.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/mocks/service/image/image.mock.go b/src/mocks/service/image/image.mock.go index c09925a..d629982 100644 --- a/src/mocks/service/image/image.mock.go +++ b/src/mocks/service/image/image.mock.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./src/pkg/service/image/image.service.go +// +// Generated by this command: +// +// mockgen -source ./src/pkg/service/image/image.service.go -destination ./src/mocks/service/image/image.mock.go +// // Package mock_image is a generated GoMock package. package mock_image @@ -7,9 +12,8 @@ package mock_image import ( reflect "reflect" - gomock "github.com/golang/mock/gomock" dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - v1 "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" + gomock "github.com/golang/mock/gomock" ) // MockService is a mock of Service interface. @@ -36,46 +40,46 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { } // Delete mocks base method. -func (m *MockService) Delete(arg0 string) (bool, *dto.ResponseErr) { +func (m *MockService) Delete(arg0 string) (*dto.DeleteImageResponse, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Delete", arg0) - ret0, _ := ret[0].(bool) + ret0, _ := ret[0].(*dto.DeleteImageResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // Delete indicates an expected call of Delete. -func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Delete(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) } // FindByPetId mocks base method. -func (m *MockService) FindByPetId(arg0 string) ([]*v1.Image, *dto.ResponseErr) { +func (m *MockService) FindByPetId(arg0 string) ([]*dto.ImageResponse, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FindByPetId", arg0) - ret0, _ := ret[0].([]*v1.Image) + ret0, _ := ret[0].([]*dto.ImageResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // FindByPetId indicates an expected call of FindByPetId. -func (mr *MockServiceMockRecorder) FindByPetId(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) FindByPetId(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindByPetId", reflect.TypeOf((*MockService)(nil).FindByPetId), arg0) } // Upload mocks base method. -func (m *MockService) Upload(arg0 *dto.ImageDto) (*v1.Image, *dto.ResponseErr) { +func (m *MockService) Upload(arg0 *dto.UploadImageRequest) (*dto.ImageResponse, *dto.ResponseErr) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Upload", arg0) - ret0, _ := ret[0].(*v1.Image) + ret0, _ := ret[0].(*dto.ImageResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // Upload indicates an expected call of Upload. -func (mr *MockServiceMockRecorder) Upload(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Upload(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Upload", reflect.TypeOf((*MockService)(nil).Upload), arg0) } From fe8684323cf2058c5f86d3848c4f7fea9b571bc7 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:05:07 +0700 Subject: [PATCH 098/134] fix: image service interface --- src/pkg/service/image/image.service.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/pkg/service/image/image.service.go b/src/pkg/service/image/image.service.go index 4b68d29..836ae59 100644 --- a/src/pkg/service/image/image.service.go +++ b/src/pkg/service/image/image.service.go @@ -2,11 +2,10 @@ package image import ( "github.com/isd-sgcu/johnjud-gateway/src/app/dto" - proto "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" ) type Service interface { - FindByPetId(string) ([]*proto.Image, *dto.ResponseErr) - Upload(*dto.ImageDto) (*proto.Image, *dto.ResponseErr) - Delete(string) (bool, *dto.ResponseErr) + FindByPetId(string) ([]*dto.ImageResponse, *dto.ResponseErr) + Upload(*dto.UploadImageRequest) (*dto.ImageResponse, *dto.ResponseErr) + Delete(string) (*dto.DeleteImageResponse, *dto.ResponseErr) } From 30deead463430440754639b563136f182d815aa1 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:31:57 +0700 Subject: [PATCH 099/134] chore --- src/app/dto/pet.dto.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 39a77ff..ab4304a 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -16,10 +16,10 @@ type PetResponse struct { Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` - IsSterile *bool `json:"is_sterile"` - IsVaccinated *bool `json:"is_vaccinated"` - IsVisible *bool `json:"is_visible"` - IsClubPet *bool `json:"is_club_pet"` + IsSterile bool `json:"is_sterile"` + IsVaccinated bool `json:"is_vaccinated"` + IsVisible bool `json:"is_visible"` + IsClubPet bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` @@ -38,10 +38,10 @@ type CreatePetRequest struct { Habit string `json:"habit" validate:"required"` Caption string `json:"caption"` Status pet.Status `json:"status" validate:"required" example:"findhome"` - IsSterile *bool `json:"is_sterile" validate:"required"` - IsVaccinated *bool `json:"is_vaccinated" validate:"required"` - IsVisible *bool `json:"is_visible" validate:"required"` - IsClubPet *bool `json:"is_club_pet" validate:"required"` + IsSterile bool `json:"is_sterile" validate:"required"` + IsVaccinated bool `json:"is_vaccinated" validate:"required"` + IsVisible bool `json:"is_visible" validate:"required"` + IsClubPet bool `json:"is_club_pet" validate:"required"` Origin string `json:"origin" validate:"required"` Address string `json:"address"` Contact string `json:"contact"` @@ -77,10 +77,10 @@ type UpdatePetRequest struct { Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` - IsSterile *bool `json:"is_sterile"` - IsVaccinated *bool `json:"is_vaccinated"` - IsVisible *bool `json:"is_visible"` - IsClubPet *bool `json:"is_club_pet"` + IsSterile bool `json:"is_sterile"` + IsVaccinated bool `json:"is_vaccinated"` + IsVisible bool `json:"is_visible"` + IsClubPet bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` From 81078627b5eafb99ac8c1a0babc784c47e4f7136 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:32:04 +0700 Subject: [PATCH 100/134] chore --- src/app/handler/pet/pet.handler_test.go | 8 ++++---- src/app/service/pet/pet.service_test.go | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 26318e6..87e1e12 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -94,10 +94,10 @@ func (t *PetHandlerTest) SetupTest() { Habit: t.Pet.Habit, Caption: t.Pet.Caption, Status: pet.Status(t.Pet.Status), - IsSterile: &t.Pet.IsSterile, - IsVaccinated: &t.Pet.IsVaccinated, - IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, + IsSterile: t.Pet.IsSterile, + IsVaccinated: t.Pet.IsVaccinated, + IsVisible: t.Pet.IsVisible, + IsClubPet: t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index a627d53..8048395 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -122,10 +122,10 @@ func (t *PetServiceTest) SetupTest() { Caption: t.Pet.Caption, Images: []string{}, Status: pet.Status(t.Pet.Status), - IsSterile: &t.Pet.IsSterile, - IsVaccinated: &t.Pet.IsVaccinated, - IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, + IsSterile: t.Pet.IsSterile, + IsVaccinated: t.Pet.IsVaccinated, + IsVisible: t.Pet.IsVisible, + IsClubPet: t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, @@ -144,10 +144,10 @@ func (t *PetServiceTest) SetupTest() { Caption: t.Pet.Caption, Images: []string{}, Status: pet.Status(t.Pet.Status), - IsSterile: &t.Pet.IsSterile, - IsVaccinated: &t.Pet.IsVaccinated, - IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, + IsSterile: t.Pet.IsSterile, + IsVaccinated: t.Pet.IsVaccinated, + IsVisible: t.Pet.IsVisible, + IsClubPet: t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, From d0af5f2e5deddda9e5a0fe1968531630ddd468a6 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:32:07 +0700 Subject: [PATCH 101/134] chore --- src/app/utils/pet/pet.utils.go | 48 +++++++++------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index 434f820..f47c9a2 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -40,10 +40,10 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { Habit: in.Habit, Caption: in.Caption, Status: pet.Status(in.Status), - IsSterile: &in.IsSterile, - IsVaccinated: &in.IsVaccinated, - IsVisible: &in.IsVisible, - IsClubPet: &in.IsClubPet, + IsSterile: in.IsSterile, + IsVaccinated: in.IsVaccinated, + IsVisible: in.IsVisible, + IsClubPet: in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -67,10 +67,10 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { Caption: in.Caption, Images: []*imgproto.Image{}, Status: string(in.Status), - IsSterile: *in.IsSterile, - IsVaccinated: *in.IsVaccinated, - IsVisible: *in.IsVisible, - IsClubPet: *in.IsClubPet, + IsSterile: in.IsSterile, + IsVaccinated: in.IsVaccinated, + IsVisible: in.IsVisible, + IsClubPet: in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -101,30 +101,6 @@ func UpdateDtoToProto(id string, in *dto.UpdatePetRequest) *petproto.UpdatePetRe }, } - if in.IsClubPet == nil { - req.Pet.IsClubPet = false - } else { - req.Pet.IsClubPet = *in.IsClubPet - } - - if in.IsSterile == nil { - req.Pet.IsSterile = false - } else { - req.Pet.IsSterile = *in.IsSterile - } - - if in.IsVaccinated == nil { - req.Pet.IsVaccinated = false - } else { - req.Pet.IsVaccinated = *in.IsVaccinated - } - - if in.IsVisible == nil { - req.Pet.IsVisible = false - } else { - req.Pet.IsVisible = *in.IsVisible - } - return req } @@ -143,10 +119,10 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P Habit: p.Habit, Caption: p.Caption, Status: pet.Status(p.Status), - IsSterile: &p.IsSterile, - IsVaccinated: &p.IsVaccinated, - IsVisible: &p.IsVisible, - IsClubPet: &p.IsClubPet, + IsSterile: p.IsSterile, + IsVaccinated: p.IsVaccinated, + IsVisible: p.IsVisible, + IsClubPet: p.IsClubPet, Origin: p.Origin, Address: p.Address, Contact: p.Contact, From fa33d73e97532fb7a671a7b673885b704f591d91 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:57:17 +0700 Subject: [PATCH 102/134] chore --- src/app/dto/pet.dto.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index ab4304a..39a77ff 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -16,10 +16,10 @@ type PetResponse struct { Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` - IsSterile bool `json:"is_sterile"` - IsVaccinated bool `json:"is_vaccinated"` - IsVisible bool `json:"is_visible"` - IsClubPet bool `json:"is_club_pet"` + IsSterile *bool `json:"is_sterile"` + IsVaccinated *bool `json:"is_vaccinated"` + IsVisible *bool `json:"is_visible"` + IsClubPet *bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` @@ -38,10 +38,10 @@ type CreatePetRequest struct { Habit string `json:"habit" validate:"required"` Caption string `json:"caption"` Status pet.Status `json:"status" validate:"required" example:"findhome"` - IsSterile bool `json:"is_sterile" validate:"required"` - IsVaccinated bool `json:"is_vaccinated" validate:"required"` - IsVisible bool `json:"is_visible" validate:"required"` - IsClubPet bool `json:"is_club_pet" validate:"required"` + IsSterile *bool `json:"is_sterile" validate:"required"` + IsVaccinated *bool `json:"is_vaccinated" validate:"required"` + IsVisible *bool `json:"is_visible" validate:"required"` + IsClubPet *bool `json:"is_club_pet" validate:"required"` Origin string `json:"origin" validate:"required"` Address string `json:"address"` Contact string `json:"contact"` @@ -77,10 +77,10 @@ type UpdatePetRequest struct { Habit string `json:"habit"` Caption string `json:"caption"` Status pet.Status `json:"status"` - IsSterile bool `json:"is_sterile"` - IsVaccinated bool `json:"is_vaccinated"` - IsVisible bool `json:"is_visible"` - IsClubPet bool `json:"is_club_pet"` + IsSterile *bool `json:"is_sterile"` + IsVaccinated *bool `json:"is_vaccinated"` + IsVisible *bool `json:"is_visible"` + IsClubPet *bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` From 68426debdd680a117171e5caff7c6583f650e3fa Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:57:27 +0700 Subject: [PATCH 103/134] chore --- src/app/handler/pet/pet.handler_test.go | 8 ++++---- src/app/service/pet/pet.service_test.go | 16 ++++++++-------- src/app/utils/pet/pet.utils.go | 24 ++++++++++++------------ 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 87e1e12..26318e6 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -94,10 +94,10 @@ func (t *PetHandlerTest) SetupTest() { Habit: t.Pet.Habit, Caption: t.Pet.Caption, Status: pet.Status(t.Pet.Status), - IsSterile: t.Pet.IsSterile, - IsVaccinated: t.Pet.IsVaccinated, - IsVisible: t.Pet.IsVisible, - IsClubPet: t.Pet.IsClubPet, + IsSterile: &t.Pet.IsSterile, + IsVaccinated: &t.Pet.IsVaccinated, + IsVisible: &t.Pet.IsVisible, + IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index 8048395..a627d53 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -122,10 +122,10 @@ func (t *PetServiceTest) SetupTest() { Caption: t.Pet.Caption, Images: []string{}, Status: pet.Status(t.Pet.Status), - IsSterile: t.Pet.IsSterile, - IsVaccinated: t.Pet.IsVaccinated, - IsVisible: t.Pet.IsVisible, - IsClubPet: t.Pet.IsClubPet, + IsSterile: &t.Pet.IsSterile, + IsVaccinated: &t.Pet.IsVaccinated, + IsVisible: &t.Pet.IsVisible, + IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, @@ -144,10 +144,10 @@ func (t *PetServiceTest) SetupTest() { Caption: t.Pet.Caption, Images: []string{}, Status: pet.Status(t.Pet.Status), - IsSterile: t.Pet.IsSterile, - IsVaccinated: t.Pet.IsVaccinated, - IsVisible: t.Pet.IsVisible, - IsClubPet: t.Pet.IsClubPet, + IsSterile: &t.Pet.IsSterile, + IsVaccinated: &t.Pet.IsVaccinated, + IsVisible: &t.Pet.IsVisible, + IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index f47c9a2..56829bc 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -40,10 +40,10 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { Habit: in.Habit, Caption: in.Caption, Status: pet.Status(in.Status), - IsSterile: in.IsSterile, - IsVaccinated: in.IsVaccinated, - IsVisible: in.IsVisible, - IsClubPet: in.IsClubPet, + IsSterile: &in.IsSterile, + IsVaccinated: &in.IsVaccinated, + IsVisible: &in.IsVisible, + IsClubPet: &in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -67,10 +67,10 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { Caption: in.Caption, Images: []*imgproto.Image{}, Status: string(in.Status), - IsSterile: in.IsSterile, - IsVaccinated: in.IsVaccinated, - IsVisible: in.IsVisible, - IsClubPet: in.IsClubPet, + IsSterile: *in.IsSterile, + IsVaccinated: *in.IsVaccinated, + IsVisible: *in.IsVisible, + IsClubPet: *in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -119,10 +119,10 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P Habit: p.Habit, Caption: p.Caption, Status: pet.Status(p.Status), - IsSterile: p.IsSterile, - IsVaccinated: p.IsVaccinated, - IsVisible: p.IsVisible, - IsClubPet: p.IsClubPet, + IsSterile: &p.IsSterile, + IsVaccinated: &p.IsVaccinated, + IsVisible: &p.IsVisible, + IsClubPet: &p.IsClubPet, Origin: p.Origin, Address: p.Address, Contact: p.Contact, From 5ac8f92640f444b680a6b271715971cf5f339b9b Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:04:55 +0700 Subject: [PATCH 104/134] chore --- src/app/handler/image/image.handler.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/handler/image/image.handler.go b/src/app/handler/image/image.handler.go index 4e0336a..c42e700 100644 --- a/src/app/handler/image/image.handler.go +++ b/src/app/handler/image/image.handler.go @@ -1,7 +1,6 @@ -package auth +package image import ( - "fmt" "net/http" "strings" @@ -45,7 +44,6 @@ func (h *Handler) FindByPetId(c *router.FiberCtx) { func (h *Handler) Upload(c *router.FiberCtx) { request := &dto.UploadImageRequest{} err := c.Bind(request) - fmt.Println("request: ", request) if err != nil { c.JSON(http.StatusBadRequest, dto.ResponseErr{ StatusCode: http.StatusBadRequest, From d969b96263ca8a5b35b6511c88c9196f05b72983 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:05:01 +0700 Subject: [PATCH 105/134] feat: get image path --- src/app/router/image.router.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/router/image.router.go b/src/app/router/image.router.go index e696190..bebbc0c 100644 --- a/src/app/router/image.router.go +++ b/src/app/router/image.router.go @@ -15,3 +15,10 @@ func (r *FiberRouter) DeleteImage(path string, h func(ctx *FiberCtx)) { return nil }) } + +func (r *FiberRouter) GetImage(path string, h func(ctx *FiberCtx)) { + r.image.Delete(path, func(c *fiber.Ctx) error { + h(NewFiberCtx(c)) + return nil + }) +} From 865c66cd9a9f4ba58e6a48750a42bbf99271f6f9 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:05:07 +0700 Subject: [PATCH 106/134] chore --- src/app/router/router.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/router/router.go b/src/app/router/router.go index 2a2bb91..0f55c33 100644 --- a/src/app/router/router.go +++ b/src/app/router/router.go @@ -51,7 +51,7 @@ func NewFiberRouter(authGuard IGuard, conf config.App) *FiberRouter { user := GroupWithAuthMiddleware(r, "/user", authGuard.Use) pet := GroupWithAuthMiddleware(r, "/pets", authGuard.Use) - image := GroupWithAuthMiddleware(r, "/image", authGuard.Use) + image := GroupWithAuthMiddleware(r, "/images", authGuard.Use) like := GroupWithAuthMiddleware(r, "/likes", authGuard.Use) return &FiberRouter{r, auth, user, pet, image, like} From a2d2a7a6d79444f54086aab47ea884332a32d3a3 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:05:22 +0700 Subject: [PATCH 107/134] feat: image handler --- src/main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main.go b/src/main.go index f180270..74a5765 100644 --- a/src/main.go +++ b/src/main.go @@ -12,6 +12,7 @@ import ( authHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/auth" healthcheck "github.com/isd-sgcu/johnjud-gateway/src/app/handler/healthcheck" + imageHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/image" likeHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/like" petHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/pet" userHdr "github.com/isd-sgcu/johnjud-gateway/src/app/handler/user" @@ -107,6 +108,7 @@ func main() { imageClient := imageProto.NewImageServiceClient(fileConn) imageService := imageSvc.NewService(imageClient) + imageHandler := imageHdr.NewHandler(imageService, v) petClient := petProto.NewPetServiceClient(backendConn) petService := petSvc.NewService(petClient) @@ -142,6 +144,10 @@ func main() { r.PostLike("", likeHandler.Create) r.DeleteLike("/:id", likeHandler.Delete) + r.GetImage("/", imageHandler.FindByPetId) + r.PostImage("/", imageHandler.Upload) + r.DeleteImage("/:id", imageHandler.Delete) + v1 := router.NewAPIv1(r, conf.App) go func() { From 30d9e2864944c89681c3c3684cfb2bdf205a7c9d Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:08:29 +0700 Subject: [PATCH 108/134] chore --- src/app/service/image/image.service.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/service/image/image.service.go b/src/app/service/image/image.service.go index 05c1bc4..331bda6 100644 --- a/src/app/service/image/image.service.go +++ b/src/app/service/image/image.service.go @@ -99,6 +99,7 @@ func (s *Service) Upload(in *dto.UploadImageRequest) (*dto.ImageResponse, *dto.R func (s *Service) Delete(id string) (*dto.DeleteImageResponse, *dto.ResponseErr) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() + request := &proto.DeleteImageRequest{ Id: id, } From 54568df7ec94187870d1df994f3417a1ed492269 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:47:45 +0700 Subject: [PATCH 109/134] feat: dto --- src/app/dto/image.dto.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/app/dto/image.dto.go b/src/app/dto/image.dto.go index 458e218..a04a4fb 100644 --- a/src/app/dto/image.dto.go +++ b/src/app/dto/image.dto.go @@ -15,3 +15,12 @@ type UploadImageRequest struct { type DeleteImageResponse struct { Success bool `json:"success"` } + +type AssignPetRequest struct { + Ids []string `json:"ids"` + PetId string `json:"pet_id"` +} + +type AssignPetResponse struct { + Success bool `json:"success"` +} From 22344f0655c7c4c35f36639f65798b7392921fed Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:47:53 +0700 Subject: [PATCH 110/134] feat: assign pet handler --- src/app/handler/image/image.handler.go | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/app/handler/image/image.handler.go b/src/app/handler/image/image.handler.go index c42e700..ea3b11b 100644 --- a/src/app/handler/image/image.handler.go +++ b/src/app/handler/image/image.handler.go @@ -96,3 +96,38 @@ func (h *Handler) Delete(c *router.FiberCtx) { c.JSON(http.StatusOK, res.Success) return } + +func (h *Handler) AssignPet(c *router.FiberCtx) { + request := &dto.AssignPetRequest{} + err := c.Bind(request) + if err != nil { + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.BindingRequestErrorMessage + err.Error(), + Data: nil, + }) + return + } + + if err := h.validate.Validate(request); err != nil { + var errorMessage []string + for _, reqErr := range err { + errorMessage = append(errorMessage, reqErr.Message) + } + c.JSON(http.StatusBadRequest, dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidRequestBodyMessage + strings.Join(errorMessage, ", "), + Data: nil, + }) + return + } + + response, respErr := h.service.AssignPet(request) + if respErr != nil { + c.JSON(respErr.StatusCode, respErr) + return + } + + c.JSON(http.StatusCreated, response) + return +} From d290e891a547adfe95ca67586044987c5965c59c Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:47:58 +0700 Subject: [PATCH 111/134] feat: assign pet service --- src/app/service/image/image.service.go | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/app/service/image/image.service.go b/src/app/service/image/image.service.go index 331bda6..a46b992 100644 --- a/src/app/service/image/image.service.go +++ b/src/app/service/image/image.service.go @@ -137,3 +137,46 @@ func (s *Service) Delete(id string) (*dto.DeleteImageResponse, *dto.ResponseErr) Success: res.Success, }, nil } + +func (s *Service) AssignPet(in *dto.AssignPetRequest) (*dto.AssignPetResponse, *dto.ResponseErr) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + request := &proto.AssignPetRequest{ + Ids: in.Ids, + PetId: in.PetId, + } + + res, errRes := s.client.AssignPet(ctx, request) + if errRes != nil { + st, _ := status.FromError(errRes) + log.Error(). + Err(errRes). + Str("service", "image"). + Str("module", "assign pet"). + Msg(st.Message()) + switch st.Code() { + case codes.NotFound: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusNotFound, + Message: constant.PetNotFoundMessage, + Data: nil, + } + case codes.Unavailable: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusServiceUnavailable, + Message: constant.UnavailableServiceMessage, + Data: nil, + } + default: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusInternalServerError, + Message: constant.InternalErrorMessage, + Data: nil, + } + } + } + return &dto.AssignPetResponse{ + Success: res.Success, + }, nil +} From 896e248b5fd19f9aee56e79661cafb95dd2c50eb Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:48:27 +0700 Subject: [PATCH 112/134] feat: admin path --- src/constant/auth/auth.constant.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index e25d157..a10e52d 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -16,6 +16,10 @@ var AdminPath = map[string]struct{}{ "PUT /pets/:id/visible": {}, "DELETE /pets/:id": {}, //need to add image upload, delete, assignpet + "POST /images/assign/:pet_id": {}, + "DELETE /images/:id": {}, + "POST /images/": {}, + "GET /images/:id": {}, } var VersionList = map[string]struct{}{ From 60d433c8bdfac2081214cc9889247a1cc8fb37eb Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:48:36 +0700 Subject: [PATCH 113/134] mock gen --- src/mocks/service/image/image.mock.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/mocks/service/image/image.mock.go b/src/mocks/service/image/image.mock.go index d629982..6e7fb6b 100644 --- a/src/mocks/service/image/image.mock.go +++ b/src/mocks/service/image/image.mock.go @@ -39,6 +39,21 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder { return m.recorder } +// AssignPet mocks base method. +func (m *MockService) AssignPet(arg0 *dto.AssignPetRequest) (*dto.AssignPetResponse, *dto.ResponseErr) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AssignPet", arg0) + ret0, _ := ret[0].(*dto.AssignPetResponse) + ret1, _ := ret[1].(*dto.ResponseErr) + return ret0, ret1 +} + +// AssignPet indicates an expected call of AssignPet. +func (mr *MockServiceMockRecorder) AssignPet(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignPet", reflect.TypeOf((*MockService)(nil).AssignPet), arg0) +} + // Delete mocks base method. func (m *MockService) Delete(arg0 string) (*dto.DeleteImageResponse, *dto.ResponseErr) { m.ctrl.T.Helper() From a49b478fb6e9a07f60142baa126248041bc76c23 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Wed, 10 Jan 2024 23:48:44 +0700 Subject: [PATCH 114/134] feat: image service interface --- src/pkg/service/image/image.service.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pkg/service/image/image.service.go b/src/pkg/service/image/image.service.go index 836ae59..e7ff7a1 100644 --- a/src/pkg/service/image/image.service.go +++ b/src/pkg/service/image/image.service.go @@ -8,4 +8,5 @@ type Service interface { FindByPetId(string) ([]*dto.ImageResponse, *dto.ResponseErr) Upload(*dto.UploadImageRequest) (*dto.ImageResponse, *dto.ResponseErr) Delete(string) (*dto.DeleteImageResponse, *dto.ResponseErr) + AssignPet(*dto.AssignPetRequest) (*dto.AssignPetResponse, *dto.ResponseErr) } From 31ccce79a5f520676741fc3e726eb73c0776e9c0 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:58:48 +0700 Subject: [PATCH 115/134] chore --- src/app/handler/image/image.handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/handler/image/image.handler.go b/src/app/handler/image/image.handler.go index ea3b11b..143fc9e 100644 --- a/src/app/handler/image/image.handler.go +++ b/src/app/handler/image/image.handler.go @@ -128,6 +128,6 @@ func (h *Handler) AssignPet(c *router.FiberCtx) { return } - c.JSON(http.StatusCreated, response) + c.JSON(http.StatusOK, response) return } From d7505da383e875bd8068569013ee0bcfbba08297 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:59:03 +0700 Subject: [PATCH 116/134] feat: assign pet --- src/app/router/image.router.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/router/image.router.go b/src/app/router/image.router.go index bebbc0c..d348d21 100644 --- a/src/app/router/image.router.go +++ b/src/app/router/image.router.go @@ -22,3 +22,10 @@ func (r *FiberRouter) GetImage(path string, h func(ctx *FiberCtx)) { return nil }) } + +func (r *FiberRouter) AssignPet(path string, h func(ctx *FiberCtx)) { + r.image.Post(path, func(c *fiber.Ctx) error { + h(NewFiberCtx(c)) + return nil + }) +} From 5b5d0c22da8349752f324fcb2e2f72f40a65a2a0 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:59:18 +0700 Subject: [PATCH 117/134] fix: invalidArgument error --- src/app/service/image/image.service.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app/service/image/image.service.go b/src/app/service/image/image.service.go index a46b992..ec00042 100644 --- a/src/app/service/image/image.service.go +++ b/src/app/service/image/image.service.go @@ -156,6 +156,12 @@ func (s *Service) AssignPet(in *dto.AssignPetRequest) (*dto.AssignPetResponse, * Str("module", "assign pet"). Msg(st.Message()) switch st.Code() { + case codes.InvalidArgument: + return nil, &dto.ResponseErr{ + StatusCode: http.StatusBadRequest, + Message: constant.InvalidArgumentMessage, + Data: nil, + } case codes.NotFound: return nil, &dto.ResponseErr{ StatusCode: http.StatusNotFound, From d58594df2ff6e22170201628a632e2226264b222 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 10:00:03 +0700 Subject: [PATCH 118/134] feat: assign pet path I think no need to use `/assign/:pet_id` because they're already in body request --- src/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.go b/src/main.go index 74a5765..34b2719 100644 --- a/src/main.go +++ b/src/main.go @@ -147,6 +147,7 @@ func main() { r.GetImage("/", imageHandler.FindByPetId) r.PostImage("/", imageHandler.Upload) r.DeleteImage("/:id", imageHandler.Delete) + r.AssignPet("/assign", imageHandler.AssignPet) v1 := router.NewAPIv1(r, conf.App) From e6cc73e5033619de495bd3f8fcd7923f75872c13 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 10:00:12 +0700 Subject: [PATCH 119/134] chore --- src/constant/auth/auth.constant.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/constant/auth/auth.constant.go b/src/constant/auth/auth.constant.go index a10e52d..281fc8c 100644 --- a/src/constant/auth/auth.constant.go +++ b/src/constant/auth/auth.constant.go @@ -10,12 +10,11 @@ var ExcludePath = map[string]struct{}{ } var AdminPath = map[string]struct{}{ - "DELETE /user/:id": {}, - "POST /pets": {}, - "PUT /pets/:id": {}, - "PUT /pets/:id/visible": {}, - "DELETE /pets/:id": {}, - //need to add image upload, delete, assignpet + "DELETE /user/:id": {}, + "POST /pets": {}, + "PUT /pets/:id": {}, + "PUT /pets/:id/visible": {}, + "DELETE /pets/:id": {}, "POST /images/assign/:pet_id": {}, "DELETE /images/:id": {}, "POST /images/": {}, From 2644a3c20157ede5fb29c73b448f103596c7d463 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 10:01:50 +0700 Subject: [PATCH 120/134] chore --- src/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.go b/src/main.go index 34b2719..63ff2da 100644 --- a/src/main.go +++ b/src/main.go @@ -144,7 +144,6 @@ func main() { r.PostLike("", likeHandler.Create) r.DeleteLike("/:id", likeHandler.Delete) - r.GetImage("/", imageHandler.FindByPetId) r.PostImage("/", imageHandler.Upload) r.DeleteImage("/:id", imageHandler.Delete) r.AssignPet("/assign", imageHandler.AssignPet) From ade717fae72a71d880d5d5e15c9ba0c6966cd363 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Thu, 11 Jan 2024 14:00:35 +0700 Subject: [PATCH 121/134] chore --- src/app/dto/image.dto.go | 4 ++-- src/app/router/image.router.go | 7 ------- src/main.go | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/app/dto/image.dto.go b/src/app/dto/image.dto.go index a04a4fb..98414f1 100644 --- a/src/app/dto/image.dto.go +++ b/src/app/dto/image.dto.go @@ -17,8 +17,8 @@ type DeleteImageResponse struct { } type AssignPetRequest struct { - Ids []string `json:"ids"` - PetId string `json:"pet_id"` + Ids []string `json:"ids" validate:"required"` + PetId string `json:"pet_id" validate:"required"` } type AssignPetResponse struct { diff --git a/src/app/router/image.router.go b/src/app/router/image.router.go index d348d21..bebbc0c 100644 --- a/src/app/router/image.router.go +++ b/src/app/router/image.router.go @@ -22,10 +22,3 @@ func (r *FiberRouter) GetImage(path string, h func(ctx *FiberCtx)) { return nil }) } - -func (r *FiberRouter) AssignPet(path string, h func(ctx *FiberCtx)) { - r.image.Post(path, func(c *fiber.Ctx) error { - h(NewFiberCtx(c)) - return nil - }) -} diff --git a/src/main.go b/src/main.go index 63ff2da..8e785da 100644 --- a/src/main.go +++ b/src/main.go @@ -146,7 +146,7 @@ func main() { r.PostImage("/", imageHandler.Upload) r.DeleteImage("/:id", imageHandler.Delete) - r.AssignPet("/assign", imageHandler.AssignPet) + r.PostImage("/assign", imageHandler.AssignPet) v1 := router.NewAPIv1(r, conf.App) From 289c80eaf6cb1f1b6a3a81cc2a8a841cec537e05 Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sat, 13 Jan 2024 14:12:52 +0700 Subject: [PATCH 122/134] chore: update proto --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ea78af7..c57ecda 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/gofiber/fiber/v2 v2.52.0 github.com/golang/mock v1.6.0 github.com/google/uuid v1.5.0 - github.com/isd-sgcu/johnjud-go-proto v0.3.1 + github.com/isd-sgcu/johnjud-go-proto v0.5.0 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/spf13/viper v1.18.2 diff --git a/go.sum b/go.sum index 13ffa07..67bd7d5 100644 --- a/go.sum +++ b/go.sum @@ -70,6 +70,8 @@ github.com/isd-sgcu/johnjud-go-proto v0.2.2 h1:TOAmbwy/I+8/J5LPZH0ZN7lSLczBiZe1f github.com/isd-sgcu/johnjud-go-proto v0.2.2/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= github.com/isd-sgcu/johnjud-go-proto v0.3.1 h1:WyWfzl+5nWOw3AmINtcTfojg4CJh8ZRNbZC6qA//OXU= github.com/isd-sgcu/johnjud-go-proto v0.3.1/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= +github.com/isd-sgcu/johnjud-go-proto v0.5.0 h1:GgqRzWjya5p1yhfU/kpX8i4WL42+qT2TkyXZmssH6B4= +github.com/isd-sgcu/johnjud-go-proto v0.5.0/go.mod h1:1OK6aiCgtXQiLhxp0r6iLEejYIRpckWQZDrCZ9Trbo4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= From 1b7953928f93348828e6458101ab3bf9481cdb4b Mon Sep 17 00:00:00 2001 From: Idhibhat Pankam Date: Sat, 13 Jan 2024 14:13:04 +0700 Subject: [PATCH 123/134] feat: remove species, isclubpet --- src/app/dto/pet.dto.go | 6 ------ src/app/handler/pet/pet.handler_test.go | 4 ---- src/app/service/pet/pet.service_test.go | 8 -------- src/app/utils/pet/pet.utils.go | 7 ------- 4 files changed, 25 deletions(-) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 39a77ff..2e0df1e 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -7,7 +7,6 @@ import ( type PetResponse struct { Id string `json:"id"` Type string `json:"type"` - Species string `json:"species"` Name string `json:"name"` Birthdate string `json:"birthdate"` Gender pet.Gender `json:"gender"` @@ -19,7 +18,6 @@ type PetResponse struct { IsSterile *bool `json:"is_sterile"` IsVaccinated *bool `json:"is_vaccinated"` IsVisible *bool `json:"is_visible"` - IsClubPet *bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` @@ -29,7 +27,6 @@ type PetResponse struct { type CreatePetRequest struct { Type string `json:"type" validate:"required"` - Species string `json:"species" validate:"required"` Name string `json:"name" validate:"required"` Birthdate string `json:"birthdate" validate:"required"` Gender pet.Gender `json:"gender" validate:"required" example:"male"` @@ -41,7 +38,6 @@ type CreatePetRequest struct { IsSterile *bool `json:"is_sterile" validate:"required"` IsVaccinated *bool `json:"is_vaccinated" validate:"required"` IsVisible *bool `json:"is_visible" validate:"required"` - IsClubPet *bool `json:"is_club_pet" validate:"required"` Origin string `json:"origin" validate:"required"` Address string `json:"address"` Contact string `json:"contact"` @@ -68,7 +64,6 @@ type AdoptByResponse struct { type UpdatePetRequest struct { Type string `json:"type"` - Species string `json:"species"` Name string `json:"name"` Birthdate string `json:"birthdate"` Gender pet.Gender `json:"gender"` @@ -80,7 +75,6 @@ type UpdatePetRequest struct { IsSterile *bool `json:"is_sterile"` IsVaccinated *bool `json:"is_vaccinated"` IsVisible *bool `json:"is_visible"` - IsClubPet *bool `json:"is_club_pet"` Origin string `json:"origin"` Address string `json:"address"` Contact string `json:"contact"` diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 26318e6..6cff0fc 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -56,7 +56,6 @@ func (t *PetHandlerTest) SetupTest() { pet := &petProto.Pet{ Id: faker.UUIDDigit(), Type: faker.Word(), - Species: faker.Word(), Name: faker.Name(), Birthdate: faker.Word(), Gender: string(genders[rand.Intn(2)]), @@ -69,7 +68,6 @@ func (t *PetHandlerTest) SetupTest() { IsSterile: true, IsVaccinated: true, IsVisible: true, - IsClubPet: true, Origin: faker.Paragraph(), Address: faker.Paragraph(), Contact: faker.Paragraph(), @@ -85,7 +83,6 @@ func (t *PetHandlerTest) SetupTest() { t.PetDto = &dto.PetResponse{ Id: t.Pet.Id, Type: t.Pet.Type, - Species: t.Pet.Species, Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), @@ -97,7 +94,6 @@ func (t *PetHandlerTest) SetupTest() { IsSterile: &t.Pet.IsSterile, IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index a627d53..ce29072 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -59,7 +59,6 @@ func (t *PetServiceTest) SetupTest() { pet := &petproto.Pet{ Id: faker.UUIDDigit(), Type: faker.Word(), - Species: faker.Word(), Name: faker.Name(), Birthdate: faker.Word(), Gender: string(genders[rand.Intn(2)]), @@ -72,7 +71,6 @@ func (t *PetServiceTest) SetupTest() { IsSterile: true, IsVaccinated: true, IsVisible: true, - IsClubPet: true, Origin: faker.Paragraph(), Address: faker.Paragraph(), Contact: faker.Paragraph(), @@ -88,7 +86,6 @@ func (t *PetServiceTest) SetupTest() { t.PetNotVisible = &petproto.Pet{ Id: t.Pet.Id, Type: t.Pet.Type, - Species: t.Pet.Species, Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: t.Pet.Gender, @@ -101,7 +98,6 @@ func (t *PetServiceTest) SetupTest() { IsSterile: t.Pet.IsSterile, IsVaccinated: t.Pet.IsVaccinated, IsVisible: false, - IsClubPet: t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, @@ -112,7 +108,6 @@ func (t *PetServiceTest) SetupTest() { t.CreatePetDto = &dto.CreatePetRequest{ Type: t.Pet.Type, - Species: t.Pet.Species, Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), @@ -125,7 +120,6 @@ func (t *PetServiceTest) SetupTest() { IsSterile: &t.Pet.IsSterile, IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, @@ -134,7 +128,6 @@ func (t *PetServiceTest) SetupTest() { t.UpdatePetDto = &dto.UpdatePetRequest{ Type: t.Pet.Type, - Species: t.Pet.Species, Name: t.Pet.Name, Birthdate: t.Pet.Birthdate, Gender: pet.Gender(t.Pet.Gender), @@ -147,7 +140,6 @@ func (t *PetServiceTest) SetupTest() { IsSterile: &t.Pet.IsSterile, IsVaccinated: &t.Pet.IsVaccinated, IsVisible: &t.Pet.IsVisible, - IsClubPet: &t.Pet.IsClubPet, Origin: t.Pet.Origin, Address: t.Pet.Address, Contact: t.Pet.Contact, diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index 56829bc..b57c6a7 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -31,7 +31,6 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { pet := &dto.PetResponse{ Id: in.Id, Type: in.Type, - Species: in.Species, Name: in.Name, Birthdate: in.Birthdate, Gender: pet.Gender(in.Gender), @@ -43,7 +42,6 @@ func ProtoToDto(in *petproto.Pet, images []*imgproto.Image) *dto.PetResponse { IsSterile: &in.IsSterile, IsVaccinated: &in.IsVaccinated, IsVisible: &in.IsVisible, - IsClubPet: &in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -57,7 +55,6 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { return &petproto.CreatePetRequest{ Pet: &petproto.Pet{ Type: in.Type, - Species: in.Species, Name: in.Name, Birthdate: in.Birthdate, Gender: string(in.Gender), @@ -70,7 +67,6 @@ func CreateDtoToProto(in *dto.CreatePetRequest) *petproto.CreatePetRequest { IsSterile: *in.IsSterile, IsVaccinated: *in.IsVaccinated, IsVisible: *in.IsVisible, - IsClubPet: *in.IsClubPet, Origin: in.Origin, Address: in.Address, Contact: in.Contact, @@ -84,7 +80,6 @@ func UpdateDtoToProto(id string, in *dto.UpdatePetRequest) *petproto.UpdatePetRe Pet: &petproto.Pet{ Id: id, Type: in.Type, - Species: in.Species, Name: in.Name, Birthdate: in.Birthdate, Gender: string(in.Gender), @@ -110,7 +105,6 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P pet := &dto.PetResponse{ Id: p.Id, Type: p.Type, - Species: p.Species, Name: p.Name, Birthdate: p.Birthdate, Gender: pet.Gender(p.Gender), @@ -122,7 +116,6 @@ func ProtoToDtoList(in []*petproto.Pet, imagesList [][]*imgproto.Image) []*dto.P IsSterile: &p.IsSterile, IsVaccinated: &p.IsVaccinated, IsVisible: &p.IsVisible, - IsClubPet: &p.IsClubPet, Origin: p.Origin, Address: p.Address, Contact: p.Contact, From 4cc5f51ba734ec44759d982ca9d52d56d12700c8 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:51:03 +0700 Subject: [PATCH 124/134] feat: Query context --- src/app/router/context.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app/router/context.go b/src/app/router/context.go index 4d55e9d..ae66b0f 100644 --- a/src/app/router/context.go +++ b/src/app/router/context.go @@ -91,6 +91,14 @@ func (c *FiberCtx) StoreValue(k string, v string) { c.Locals(k, v) } +func (c *FiberCtx) Queries() map[string]string { + return c.Queries() +} + +func (c *FiberCtx) Query(q string) string { + return c.Query(q) +} + //func (c *FiberCtx) Next() { // err := c.Ctx.Next() // fmt.Println(c.Route().Path) From da342e3a17a1404d95223d60d606dc8b52ae728b Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:40:36 +0700 Subject: [PATCH 125/134] feat: findAllPet Dto --- src/app/dto/pet.dto.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/app/dto/pet.dto.go b/src/app/dto/pet.dto.go index 2e0df1e..6455129 100644 --- a/src/app/dto/pet.dto.go +++ b/src/app/dto/pet.dto.go @@ -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"` From 9b1d44a7a7c243f7d9f1566ab2f65905b0defc4a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:41:11 +0700 Subject: [PATCH 126/134] feat: findAll with pagination and filtering and returning metadata --- src/app/handler/pet/pet.handler.go | 9 ++++++- src/app/handler/pet/pet.handler_test.go | 33 +++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/app/handler/pet/pet.handler.go b/src/app/handler/pet/pet.handler.go index 7be8fdd..b9689c8 100644 --- a/src/app/handler/pet/pet.handler.go +++ b/src/app/handler/pet/pet.handler.go @@ -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" @@ -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 diff --git a/src/app/handler/pet/pet.handler_test.go b/src/app/handler/pet/pet.handler_test.go index 6cff0fc..e42dfbb 100644 --- a/src/app/handler/pet/pet.handler_test.go +++ b/src/app/handler/pet/pet.handler_test.go @@ -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 @@ -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, @@ -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{} @@ -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()) @@ -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) From 1d0f2816efac4fc3618520549466a78e1001562f Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:41:37 +0700 Subject: [PATCH 127/134] feat: queries context --- src/app/router/context.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/router/context.go b/src/app/router/context.go index ae66b0f..460ec71 100644 --- a/src/app/router/context.go +++ b/src/app/router/context.go @@ -19,6 +19,7 @@ type IContext interface { Path() string StoreValue(string, string) Next() error + Queries() map[string]string } type FiberCtx struct { @@ -92,7 +93,7 @@ func (c *FiberCtx) StoreValue(k string, v string) { } func (c *FiberCtx) Queries() map[string]string { - return c.Queries() + return c.Ctx.Queries() } func (c *FiberCtx) Query(q string) string { From b23a6dc2ec6ac3b91518774bac5530c3d3a70899 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:41:42 +0700 Subject: [PATCH 128/134] chore --- src/app/router/context.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/app/router/context.go b/src/app/router/context.go index 460ec71..55e4b1d 100644 --- a/src/app/router/context.go +++ b/src/app/router/context.go @@ -96,10 +96,6 @@ func (c *FiberCtx) Queries() map[string]string { return c.Ctx.Queries() } -func (c *FiberCtx) Query(q string) string { - return c.Query(q) -} - //func (c *FiberCtx) Next() { // err := c.Ctx.Next() // fmt.Println(c.Route().Path) From 8de4144000aff64bcf9cac1de1bd51b673fd3d68 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:42:26 +0700 Subject: [PATCH 129/134] feat: utils for find all pets --- src/app/utils/pet/pet.utils.go | 72 ++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/app/utils/pet/pet.utils.go b/src/app/utils/pet/pet.utils.go index b57c6a7..c768f29 100644 --- a/src/app/utils/pet/pet.utils.go +++ b/src/app/utils/pet/pet.utils.go @@ -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" @@ -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 +} From 491c595ef7c497c4de86d9e3e368d1cc074d5095 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:42:31 +0700 Subject: [PATCH 130/134] fix: test --- src/app/service/pet/pet.service_test.go | 53 ++++++++++++++++++++----- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/src/app/service/pet/pet.service_test.go b/src/app/service/pet/pet.service_test.go index ce29072..909b39d 100644 --- a/src/app/service/pet/pet.service_test.go +++ b/src/app/service/pet/pet.service_test.go @@ -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 @@ -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] @@ -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, @@ -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) @@ -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) From bd3ee89dfab436f975db3a8156d639fc3433cb4a Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:42:54 +0700 Subject: [PATCH 131/134] fix: find all pets with pagination, filtering and metadata --- src/app/service/pet/pet.service.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/app/service/pet/pet.service.go b/src/app/service/pet/pet.service.go index 47a7c98..a18a682 100644 --- a/src/app/service/pet/pet.service.go +++ b/src/app/service/pet/pet.service.go @@ -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(). @@ -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) { From 9f2ec64a7f6f2e991c2318f1afd21c4f1116f026 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:43:00 +0700 Subject: [PATCH 132/134] chore: mock context --- src/mocks/router/context.mock.go | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/mocks/router/context.mock.go b/src/mocks/router/context.mock.go index df02a3c..9db2501 100644 --- a/src/mocks/router/context.mock.go +++ b/src/mocks/router/context.mock.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./src/app/router/context.go +// +// Generated by this command: +// +// mockgen -source ./src/app/router/context.go -destination ./src/mocks/router/context.mock.go +// // Package mock_router is a generated GoMock package. package mock_router @@ -34,7 +39,7 @@ func (m *MockIContext) EXPECT() *MockIContextMockRecorder { } // Bind mocks base method. -func (m *MockIContext) Bind(arg0 interface{}) error { +func (m *MockIContext) Bind(arg0 any) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Bind", arg0) ret0, _ := ret[0].(error) @@ -42,7 +47,7 @@ func (m *MockIContext) Bind(arg0 interface{}) error { } // Bind indicates an expected call of Bind. -func (mr *MockIContextMockRecorder) Bind(arg0 interface{}) *gomock.Call { +func (mr *MockIContextMockRecorder) Bind(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Bind", reflect.TypeOf((*MockIContext)(nil).Bind), arg0) } @@ -63,13 +68,13 @@ func (mr *MockIContextMockRecorder) ID() *gomock.Call { } // JSON mocks base method. -func (m *MockIContext) JSON(arg0 int, arg1 interface{}) { +func (m *MockIContext) JSON(arg0 int, arg1 any) { m.ctrl.T.Helper() m.ctrl.Call(m, "JSON", arg0, arg1) } // JSON indicates an expected call of JSON. -func (mr *MockIContextMockRecorder) JSON(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockIContextMockRecorder) JSON(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "JSON", reflect.TypeOf((*MockIContext)(nil).JSON), arg0, arg1) } @@ -112,7 +117,7 @@ func (m *MockIContext) Param(arg0 string) (string, error) { } // Param indicates an expected call of Param. -func (mr *MockIContextMockRecorder) Param(arg0 interface{}) *gomock.Call { +func (mr *MockIContextMockRecorder) Param(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Param", reflect.TypeOf((*MockIContext)(nil).Param), arg0) } @@ -131,6 +136,20 @@ func (mr *MockIContextMockRecorder) Path() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Path", reflect.TypeOf((*MockIContext)(nil).Path)) } +// Queries mocks base method. +func (m *MockIContext) Queries() map[string]string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Queries") + ret0, _ := ret[0].(map[string]string) + return ret0 +} + +// Queries indicates an expected call of Queries. +func (mr *MockIContextMockRecorder) Queries() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Queries", reflect.TypeOf((*MockIContext)(nil).Queries)) +} + // Role mocks base method. func (m *MockIContext) Role() string { m.ctrl.T.Helper() @@ -152,7 +171,7 @@ func (m *MockIContext) StoreValue(arg0, arg1 string) { } // StoreValue indicates an expected call of StoreValue. -func (mr *MockIContextMockRecorder) StoreValue(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockIContextMockRecorder) StoreValue(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreValue", reflect.TypeOf((*MockIContext)(nil).StoreValue), arg0, arg1) } From 3b7c25afc0aaaebf8c3e3648982c3db7b6bd299b Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:43:07 +0700 Subject: [PATCH 133/134] chore: mock pet --- src/mocks/service/pet/pet.mock.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/mocks/service/pet/pet.mock.go b/src/mocks/service/pet/pet.mock.go index d1689f4..35b82b0 100644 --- a/src/mocks/service/pet/pet.mock.go +++ b/src/mocks/service/pet/pet.mock.go @@ -1,5 +1,10 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./src/pkg/service/pet/pet.service.go +// +// Generated by this command: +// +// mockgen -source ./src/pkg/service/pet/pet.service.go -destination ./src/mocks/service/pet/pet.mock.go +// // Package mock_pet is a generated GoMock package. package mock_pet @@ -7,8 +12,8 @@ package mock_pet import ( reflect "reflect" - gomock "github.com/golang/mock/gomock" dto "github.com/isd-sgcu/johnjud-gateway/src/app/dto" + gomock "github.com/golang/mock/gomock" ) // MockService is a mock of Service interface. @@ -44,7 +49,7 @@ func (m *MockService) Adopt(arg0 string, arg1 *dto.AdoptByRequest) (*dto.AdoptBy } // Adopt indicates an expected call of Adopt. -func (mr *MockServiceMockRecorder) Adopt(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Adopt(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Adopt", reflect.TypeOf((*MockService)(nil).Adopt), arg0, arg1) } @@ -59,7 +64,7 @@ func (m *MockService) ChangeView(arg0 string, arg1 *dto.ChangeViewPetRequest) (* } // ChangeView indicates an expected call of ChangeView. -func (mr *MockServiceMockRecorder) ChangeView(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) ChangeView(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChangeView", reflect.TypeOf((*MockService)(nil).ChangeView), arg0, arg1) } @@ -74,7 +79,7 @@ func (m *MockService) Create(arg0 *dto.CreatePetRequest) (*dto.PetResponse, *dto } // Create indicates an expected call of Create. -func (mr *MockServiceMockRecorder) Create(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Create(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockService)(nil).Create), arg0) } @@ -89,24 +94,24 @@ func (m *MockService) Delete(arg0 string) (*dto.DeleteResponse, *dto.ResponseErr } // Delete indicates an expected call of Delete. -func (mr *MockServiceMockRecorder) Delete(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Delete(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockService)(nil).Delete), arg0) } // FindAll mocks base method. -func (m *MockService) FindAll() ([]*dto.PetResponse, *dto.ResponseErr) { +func (m *MockService) FindAll(arg0 *dto.FindAllPetRequest) (*dto.FindAllPetResponse, *dto.ResponseErr) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FindAll") - ret0, _ := ret[0].([]*dto.PetResponse) + ret := m.ctrl.Call(m, "FindAll", arg0) + ret0, _ := ret[0].(*dto.FindAllPetResponse) ret1, _ := ret[1].(*dto.ResponseErr) return ret0, ret1 } // FindAll indicates an expected call of FindAll. -func (mr *MockServiceMockRecorder) FindAll() *gomock.Call { +func (mr *MockServiceMockRecorder) FindAll(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindAll", reflect.TypeOf((*MockService)(nil).FindAll)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindAll", reflect.TypeOf((*MockService)(nil).FindAll), arg0) } // FindOne mocks base method. @@ -119,7 +124,7 @@ func (m *MockService) FindOne(arg0 string) (*dto.PetResponse, *dto.ResponseErr) } // FindOne indicates an expected call of FindOne. -func (mr *MockServiceMockRecorder) FindOne(arg0 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) FindOne(arg0 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindOne", reflect.TypeOf((*MockService)(nil).FindOne), arg0) } @@ -134,7 +139,7 @@ func (m *MockService) Update(arg0 string, arg1 *dto.UpdatePetRequest) (*dto.PetR } // Update indicates an expected call of Update. -func (mr *MockServiceMockRecorder) Update(arg0, arg1 interface{}) *gomock.Call { +func (mr *MockServiceMockRecorder) Update(arg0, arg1 any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockService)(nil).Update), arg0, arg1) } From ee68bf46aa974d13f12e040d8ab9011075f75145 Mon Sep 17 00:00:00 2001 From: Gear <84141000+macgeargear@users.noreply.github.com> Date: Sat, 13 Jan 2024 22:43:15 +0700 Subject: [PATCH 134/134] fix: pet service interface --- src/pkg/service/pet/pet.service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pkg/service/pet/pet.service.go b/src/pkg/service/pet/pet.service.go index 9862eee..fbbe5bc 100644 --- a/src/pkg/service/pet/pet.service.go +++ b/src/pkg/service/pet/pet.service.go @@ -5,7 +5,7 @@ import ( ) type Service interface { - FindAll() ([]*dto.PetResponse, *dto.ResponseErr) + FindAll(*dto.FindAllPetRequest) (*dto.FindAllPetResponse, *dto.ResponseErr) FindOne(string) (*dto.PetResponse, *dto.ResponseErr) Create(*dto.CreatePetRequest) (*dto.PetResponse, *dto.ResponseErr) Update(string, *dto.UpdatePetRequest) (*dto.PetResponse, *dto.ResponseErr)