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" "gitea.pena/PenaSide/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}) }