package currency 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/pkg/echotools" ) type currencyService interface { GetCurrencies(context.Context) ([]string, errors.Error) PutCurrencies(context.Context, []string) ([]string, errors.Error) } type Deps struct { Logger *zap.Logger CurrencyService currencyService } type Controller struct { logger *zap.Logger currencyService currencyService } func New(deps Deps) *Controller { if deps.Logger == nil { log.Panicln("logger is nil on ") } if deps.CurrencyService == nil { log.Panicln("currency service is nil on ") } return &Controller{ logger: deps.Logger, currencyService: deps.CurrencyService, } } func (receiver *Controller) GetCurrencies(ctx echo.Context) error { currencies, err := receiver.currencyService.GetCurrencies(ctx.Request().Context()) if err != nil { receiver.logger.Error( "failed to get currencies on of ", zap.Error(err), ) return errors.HTTP(ctx, err) } return ctx.JSON(http.StatusOK, currencies) } func (receiver *Controller) PutCurrencies(ctx echo.Context) error { currencies, bindErr := echotools.Bind[[]string](ctx) if bindErr != nil { receiver.logger.Error( "failed to parse body on of ", zap.Error(bindErr), ) return errors.HTTP(ctx, errors.New( fmt.Errorf("failed to parse body: %w", bindErr), errors.ErrInvalidArgs, )) } currenciesCopy := *currencies if len(currenciesCopy) < 1 { currenciesCopy = make([]string, 0) } updatedCurrencies, err := receiver.currencyService.PutCurrencies(ctx.Request().Context(), currenciesCopy) if err != nil { receiver.logger.Error( "failed to put currencies on of ", zap.Error(err), ) return errors.HTTP(ctx, err) } return ctx.JSON(http.StatusOK, updatedCurrencies) }