codeword/internal/controller/client/client_promocode/promocode_controller.go
2025-01-04 17:01:27 +03:00

92 lines
2.9 KiB
Go

package client_promocode
import (
"errors"
"fmt"
"gitea.pena/PenaSide/codeword/internal/models"
"gitea.pena/PenaSide/codeword/internal/repository"
"gitea.pena/PenaSide/codeword/internal/services"
"gitea.pena/PenaSide/codeword/internal/utils/middleware"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw"
)
type Deps struct {
Logger *zap.Logger
PromoCodeService *services.PromoCodeService
}
type PromoCodeController struct {
logger *zap.Logger
promoCodeService *services.PromoCodeService
}
func NewPromoCodeController(deps Deps) *PromoCodeController {
return &PromoCodeController{
logger: deps.Logger,
promoCodeService: deps.PromoCodeService,
}
}
func (p *PromoCodeController) Activate(c *fiber.Ctx) error {
userID := middleware.ExtractUserID(c)
hlogger := log_mw.ExtractLogger(c)
fmt.Println("SKER1", userID)
if userID == "" {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "failed to get jwt payload"})
}
var req models.ActivateReq
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
}
if req.Codeword == "" && req.FastLink == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "codeword or fastlink is required"})
}
fmt.Println("SKER2", req)
promocode, err := p.promoCodeService.ActivatePromo(c.Context(), &req, userID)
fmt.Println("SKER3", err)
if err != nil {
p.logger.Error("Failed to activate promocode", zap.Error(err))
switch {
case errors.Is(err, repository.ErrPromoCodeNotFound):
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "PromoCode not found"})
case errors.Is(err, repository.ErrPromoCodeAlreadyActivated):
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{"error": "PromoCode already activated"})
case errors.Is(err, repository.ErrPromoCodeExpired):
hlogger.Emit(models.InfoPromocodeDeadlined{
CtxID: promocode.ID.String(),
})
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": err.Error()})
case errors.Is(err, repository.ErrPromoCodeExhausted):
hlogger.Emit(models.InfoPromocodeExhausted{
CtxID: promocode.ID.String(),
})
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "PromoCode exhausted"})
default:
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Internal Server Error"})
}
}
if req.Codeword != "" {
hlogger.Emit(models.InfoPromocodeActivated{
CtxID: promocode.ID.String(),
CtxUserID: userID,
CtxCode: req.Codeword,
})
} else if req.FastLink != "" {
hlogger.Emit(models.InfoFastlinkActivated{
CtxID: promocode.ID.String(),
CtxUserID: userID,
CtxPromocodeID: req.FastLink,
})
}
return c.Status(fiber.StatusOK).JSON(models.ActivateResp{Greetings: promocode.Greetings})
}