From ced9d0c8e313fa65748ffa61580a6a8cbaa1b3cb Mon Sep 17 00:00:00 2001 From: Kirill Date: Fri, 19 May 2023 09:57:36 +0300 Subject: [PATCH] feat: init cart controller --- internal/controller/account/account.go | 6 ++ internal/controller/cart/cart.go | 110 +++++++++++++++++++++++ internal/controller/currency/currency.go | 2 +- internal/initialize/api_test.go | 2 - internal/models/cart.go | 5 ++ internal/swagger/api.go | 46 ++++++---- 6 files changed, 151 insertions(+), 20 deletions(-) create mode 100644 internal/controller/cart/cart.go create mode 100644 internal/models/cart.go diff --git a/internal/controller/account/account.go b/internal/controller/account/account.go index c8bad82..a4d6c96 100644 --- a/internal/controller/account/account.go +++ b/internal/controller/account/account.go @@ -56,6 +56,8 @@ func New(deps *Deps) *Controller { func (receiver *Controller) GetAccount(ctx echo.Context) error { userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string) if !ok { + receiver.logger.Error("failed to convert jwt payload to string on of ") + return echotools.ResponseError(ctx, errors.New( fmt.Errorf("failed to convert jwt payload to string: %s", userID), errors.ErrInvalidArgs, @@ -94,6 +96,8 @@ func (receiver *Controller) GetAccounts(ctx echo.Context, params swagger.Paginat func (receiver *Controller) CreateAccount(ctx echo.Context) error { userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string) if !ok { + receiver.logger.Error("failed to convert jwt payload to string on of ") + return echotools.ResponseError(ctx, errors.New( fmt.Errorf("failed to convert jwt payload to string: %s", userID), errors.ErrInvalidArgs, @@ -111,6 +115,8 @@ func (receiver *Controller) CreateAccount(ctx echo.Context) error { func (receiver *Controller) RemoveAccount(ctx echo.Context) error { userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string) if !ok { + receiver.logger.Error("failed to convert jwt payload to string on of ") + return echotools.ResponseError(ctx, errors.New( fmt.Errorf("failed to convert jwt payload to string: %s", userID), errors.ErrInvalidArgs, diff --git a/internal/controller/cart/cart.go b/internal/controller/cart/cart.go new file mode 100644 index 0000000..2eb6444 --- /dev/null +++ b/internal/controller/cart/cart.go @@ -0,0 +1,110 @@ +package cart + +import ( + "context" + "fmt" + "log" + "net/http" + + "github.com/labstack/echo/v4" + "go.uber.org/zap" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/swagger" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils/echotools" +) + +type cartService interface { + Remove(ctx context.Context, userID, tariffID string) ([]string, errors.Error) + Add(ctx context.Context, userID, tariffID string) ([]string, errors.Error) +} + +type Deps struct { + Logger *zap.Logger + CartService cartService +} + +type Controller struct { + logger *zap.Logger + cartService cartService +} + +func New(deps *Deps) *Controller { + if deps == nil { + log.Panicln("deps is nil on ") + } + + if deps.Logger == nil { + log.Panicln("logger is nil on ") + } + + if deps.CartService == nil { + log.Panicln("cart service is nil on ") + } + + return &Controller{ + logger: deps.Logger, + cartService: deps.CartService, + } +} + +func (receiver *Controller) Remove(ctx echo.Context, params swagger.RemoveFromCartParams) error { + userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string) + if !ok { + receiver.logger.Error("failed to convert jwt payload to string on of ") + + return echotools.ResponseError(ctx, errors.New( + fmt.Errorf("failed to convert jwt payload to string: %s", userID), + errors.ErrInvalidArgs, + )) + } + + cartItems, err := receiver.cartService.Remove(ctx.Request().Context(), userID, params.Id) + if err != nil { + receiver.logger.Error( + "failed to remove item from cart on of ", + zap.Error(err.Extract()), + ) + + return echotools.ResponseError(ctx, err) + } + + return ctx.JSON(http.StatusOK, cartItems) +} + +func (receiver *Controller) Add(ctx echo.Context) error { + userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string) + if !ok { + receiver.logger.Error("failed to convert jwt payload to string on of ") + + return echotools.ResponseError(ctx, errors.New( + fmt.Errorf("failed to convert jwt payload to string: %s", userID), + errors.ErrInvalidArgs, + )) + } + + request, bindErr := echotools.Bind[models.AddItemToCart](ctx) + if bindErr != nil { + receiver.logger.Error( + "failed to parse body on of ", + zap.Error(bindErr), + ) + + return echotools.ResponseError(ctx, errors.New( + fmt.Errorf("failed to parse body: %w", bindErr), + errors.ErrInvalidArgs, + )) + } + + cartItems, err := receiver.cartService.Add(ctx.Request().Context(), userID, request.ID) + if err != nil { + receiver.logger.Error( + "failed to add item to cart on of ", + zap.Error(err.Extract()), + ) + + return echotools.ResponseError(ctx, err) + } + + return ctx.JSON(http.StatusOK, cartItems) +} diff --git a/internal/controller/currency/currency.go b/internal/controller/currency/currency.go index 7acb1e9..b756491 100644 --- a/internal/controller/currency/currency.go +++ b/internal/controller/currency/currency.go @@ -68,7 +68,7 @@ func (receiver *Controller) PutCurrencies(ctx echo.Context) error { ) return echotools.ResponseError(ctx, errors.New( fmt.Errorf("failed to parse body: %w", bindErr), - errors.ErrInternalError, + errors.ErrInvalidArgs, )) } diff --git a/internal/initialize/api_test.go b/internal/initialize/api_test.go index f355c9a..140d5b1 100644 --- a/internal/initialize/api_test.go +++ b/internal/initialize/api_test.go @@ -43,8 +43,6 @@ func TestNewAPI(t *testing.T) { api := initialize.NewAPI(controllers) assert.NotNil(t, api) - assert.NotNil(t, api.AccountController) - assert.NotNil(t, api.CurrencyController) }) }) } diff --git a/internal/models/cart.go b/internal/models/cart.go new file mode 100644 index 0000000..1dcec30 --- /dev/null +++ b/internal/models/cart.go @@ -0,0 +1,5 @@ +package models + +type AddItemToCart struct { + ID string `json:"id"` +} diff --git a/internal/swagger/api.go b/internal/swagger/api.go index 56c8ee1..ec5611b 100644 --- a/internal/swagger/api.go +++ b/internal/swagger/api.go @@ -16,7 +16,7 @@ type accountController interface { CreateAccount(ctx echo.Context) error RemoveDirectAccount(ctx echo.Context, userID string) error GetDirectAccount(ctx echo.Context, userID string) error - GetAccounts(ctx echo.Context, params PaginationAccountsParams) error + GetAccounts(echo.Context, PaginationAccountsParams) error } type currencyController interface { @@ -24,14 +24,21 @@ type currencyController interface { PutCurrencies(ctx echo.Context) error } +type cartController interface { + Remove(echo.Context, RemoveFromCartParams) error + Add(echo.Context) error +} + type Deps struct { AccountController accountController CurrencyController currencyController + CartController cartController } type API struct { - AccountController accountController - CurrencyController currencyController + accountController accountController + currencyController currencyController + cartController cartController } func New(deps *Deps) *API { @@ -44,49 +51,54 @@ func New(deps *Deps) *API { } if deps.CurrencyController == nil { - log.Panicln("CurrencyController is nil on ") + log.Panicln("currencyController is nil on ") + } + + if deps.CartController == nil { + log.Panicln("cartController is nil on ") } return &API{ - AccountController: deps.AccountController, - CurrencyController: deps.CurrencyController, + accountController: deps.AccountController, + currencyController: deps.CurrencyController, + cartController: deps.CartController, } } // Account func (receiver *API) DeleteAccount(ctx echo.Context) error { - return receiver.AccountController.RemoveAccount(ctx) + return receiver.accountController.RemoveAccount(ctx) } func (receiver *API) GetAccount(ctx echo.Context) error { - return receiver.AccountController.GetAccount(ctx) + return receiver.accountController.GetAccount(ctx) } func (receiver *API) AddAccount(ctx echo.Context) error { - return receiver.AccountController.CreateAccount(ctx) + return receiver.accountController.CreateAccount(ctx) } func (receiver *API) DeleteDirectAccount(ctx echo.Context, userID string) error { - return receiver.AccountController.RemoveDirectAccount(ctx, userID) + return receiver.accountController.RemoveDirectAccount(ctx, userID) } func (receiver *API) GetDirectAccount(ctx echo.Context, userID string) error { - return receiver.AccountController.GetDirectAccount(ctx, userID) + return receiver.accountController.GetDirectAccount(ctx, userID) } func (receiver *API) PaginationAccounts(ctx echo.Context, params PaginationAccountsParams) error { - return receiver.AccountController.GetAccounts(ctx, params) + return receiver.accountController.GetAccounts(ctx, params) } // Cart -func (receiver *API) RemoveFromCart(ctx echo.Context, _ RemoveFromCartParams) error { - return ctx.String(http.StatusNotImplemented, "method not implemented") +func (receiver *API) RemoveFromCart(ctx echo.Context, params RemoveFromCartParams) error { + return receiver.cartController.Remove(ctx, params) } func (receiver *API) Add2cart(ctx echo.Context) error { - return ctx.String(http.StatusNotImplemented, "method not implemented") + return receiver.cartController.Add(ctx) } func (receiver *API) PayCart(ctx echo.Context) error { @@ -96,11 +108,11 @@ func (receiver *API) PayCart(ctx echo.Context) error { // Currency func (receiver *API) GetCurrencies(ctx echo.Context) error { - return receiver.CurrencyController.GetCurrencies(ctx) + return receiver.currencyController.GetCurrencies(ctx) } func (receiver *API) UpdateCurrencies(ctx echo.Context) error { - return receiver.CurrencyController.PutCurrencies(ctx) + return receiver.currencyController.PutCurrencies(ctx) } // History