generated from PenaSide/GolangTemplate
122 lines
3.6 KiB
Go
122 lines
3.6 KiB
Go
package account
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"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"
|
|
)
|
|
|
|
type accountService interface {
|
|
GetAccountByUserID(ctx context.Context, userID string) (*models.Account, errors.Error)
|
|
GetAccountsList(ctx context.Context, pagination *models.Pagination) (*models.PaginationResponse[models.Account], errors.Error)
|
|
CreateAccount(ctx context.Context, account *models.Account) (*models.Account, errors.Error)
|
|
CreateAccountByUserID(ctx context.Context, userID string) (*models.Account, errors.Error)
|
|
RemoveAccount(ctx context.Context, userID string) (*models.Account, errors.Error)
|
|
DeleteAccount(ctx context.Context, userID string) (*models.Account, errors.Error)
|
|
}
|
|
|
|
type Deps struct {
|
|
Logger *zap.Logger
|
|
Service accountService
|
|
}
|
|
|
|
type Controller struct {
|
|
logger *zap.Logger
|
|
service accountService
|
|
}
|
|
|
|
func New(deps *Deps) *Controller {
|
|
return &Controller{
|
|
logger: deps.Logger,
|
|
service: deps.Service,
|
|
}
|
|
}
|
|
|
|
func (receiver *Controller) GetAccount(ctx echo.Context) error {
|
|
userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string)
|
|
if !ok {
|
|
return utils.DetermineEchoErrorResponse(ctx, errors.New(
|
|
fmt.Errorf("failed to convert jwt payload to string: %s", userID),
|
|
errors.ErrInvalidArgs,
|
|
))
|
|
}
|
|
|
|
account, err := receiver.service.GetAccountByUserID(ctx.Request().Context(), userID)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, account)
|
|
}
|
|
|
|
func (receiver *Controller) GetDirectAccount(ctx echo.Context, userID string) error {
|
|
account, err := receiver.service.GetAccountByUserID(ctx.Request().Context(), userID)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, account)
|
|
}
|
|
|
|
func (receiver *Controller) GetAccounts(ctx echo.Context, params swagger.PaginationAccountsParams) error {
|
|
response, err := receiver.service.GetAccountsList(
|
|
ctx.Request().Context(),
|
|
utils.DeterminePagination(params.Page, params.Limit),
|
|
)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, response)
|
|
}
|
|
|
|
func (receiver *Controller) CreateAccount(ctx echo.Context) error {
|
|
userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string)
|
|
if !ok {
|
|
return utils.DetermineEchoErrorResponse(ctx, errors.New(
|
|
fmt.Errorf("failed to convert jwt payload to string: %s", userID),
|
|
errors.ErrInvalidArgs,
|
|
))
|
|
}
|
|
|
|
account, err := receiver.service.CreateAccountByUserID(ctx.Request().Context(), userID)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, account)
|
|
}
|
|
|
|
func (receiver *Controller) RemoveAccount(ctx echo.Context) error {
|
|
userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string)
|
|
if !ok {
|
|
return utils.DetermineEchoErrorResponse(ctx, errors.New(
|
|
fmt.Errorf("failed to convert jwt payload to string: %s", userID),
|
|
errors.ErrInvalidArgs,
|
|
))
|
|
}
|
|
|
|
account, err := receiver.service.RemoveAccount(ctx.Request().Context(), userID)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, account)
|
|
}
|
|
|
|
func (receiver *Controller) RemoveDirectAccount(ctx echo.Context, userID string) error {
|
|
account, err := receiver.service.RemoveAccount(ctx.Request().Context(), userID)
|
|
if err != nil {
|
|
return utils.DetermineEchoErrorResponse(ctx, err)
|
|
}
|
|
|
|
return ctx.JSON(http.StatusOK, account)
|
|
}
|