Merge branch 'fix' into 'staging'

add activationLimit

See merge request pena-services/codeword!18
This commit is contained in:
Mikhail 2024-04-08 22:08:08 +00:00
commit 5846da07fc
5 changed files with 35 additions and 20 deletions

@ -433,6 +433,9 @@ components:
type: integer
nullable: true
description: Количество активаций промокода
ActivationLimit:
type: integer
description: Лимит, есть или нет если 0 то нет
Delete:
type: boolean
nullable: true
@ -455,6 +458,9 @@ components:
activationCount:
type: integer
description: Количество активаций промокода
activationLimit:
type: integer
description: Лимит, есть или нет если 0 то нет
bonus:
type: object
description: Бонус

@ -40,6 +40,8 @@ func (p *PromoCodeController) CreatePromoCode(c *fiber.Ctx) error {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "codeword is required"})
}
req.ActivationLimit = req.ActivationCount
createdPromoCode, err := p.promoCodeService.CreatePromoCode(c.Context(), &req)
if err != nil {
p.logger.Error("Failed to create promocode", zap.Error(err))
@ -64,6 +66,8 @@ func (p *PromoCodeController) EditPromoCode(c *fiber.Ctx) error {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "promocode ID is required"})
}
req.ActivationLimit = req.ActivationCount
editedPromoCode, err := p.promoCodeService.EditPromoCode(c.Context(), &req)
if err != nil {
p.logger.Error("Failed to edit promocode", zap.Error(err))

@ -12,6 +12,7 @@ type PromoCode struct {
Greetings string `json:"greetings" bson:"greetings"` // текст, выдаваемый пользователю в ответ на активацию промокода
DueTo int64 `json:"dueTo" bson:"dueTo"` // таймштамп времени окончания работы активации промокода
ActivationCount int64 `json:"activationCount" bson:"activationCount"` // предел количества активаций промокода
ActivationLimit int64 `json:"activationLimit" bson:"activationLimit"` // лимит если 0 то без лимита
Bonus struct {
Privilege struct {
PrivilegeID string `json:"privilegeID" bson:"privilegeID"` // айдишник привилегии, которая будет выдаваться
@ -38,6 +39,7 @@ type ReqEditPromoCode struct {
DueTo *int64 `json:"dueTo,omitempty" bson:"dueTo"` // таймштамп времени окончания работы активации промокода
ActivationCount *int64 `json:"activationCount,omitempty" bson:"activationCount"` // предел количества активаций промокода
ActivationLimit *int64 `json:"activationLimit,omitempty" bson:"activationLimit"` // лимит если 0 то без лимита
Delete *bool `json:"delete,omitempty" bson:"delete"`

@ -95,6 +95,9 @@ func (r *PromoCodeRepository) EditPromoCode(ctx context.Context, req *models.Req
if req.ActivationCount != nil {
updateFields["activationCount"] = *req.ActivationCount
}
if req.ActivationLimit != nil {
updateFields["activationLimit"] = *req.ActivationLimit
}
if req.Delete != nil {
updateFields["delete"] = *req.Delete
}

@ -98,7 +98,7 @@ func (s *PromoCodeService) ActivatePromo(ctx context.Context, req *models.Activa
return "", err
}
//todo такая реализация проверок кажется довольно массивной, думаю как то это стоит сделать параллельно обхаживая все условия
if promoCode.DueTo < time.Now().Unix() && promoCode.DueTo > 0 {
if promoCode.DueTo < time.Now().Unix() && promoCode.DueTo > 0 && promoCode.ActivationLimit != 0 {
err := s.promoCodeRepo.IncreaseActivationCount(ctx, promoCode.ID)
fmt.Println("SKER21", err)
if err != nil {
@ -107,7 +107,7 @@ func (s *PromoCodeService) ActivatePromo(ctx context.Context, req *models.Activa
return "", fmt.Errorf("%w: expired on %s", repository.ErrPromoCodeExpired, time.Unix(promoCode.DueTo, 0).Format(time.RFC3339))
}
if promoCode.DueTo == 0 && promoCode.ActivationCount < 0 {
if promoCode.DueTo == 0 && promoCode.ActivationCount < 0 && promoCode.ActivationLimit != 0 {
err := s.promoCodeRepo.IncreaseActivationCount(ctx, promoCode.ID)
fmt.Println("SKER22", err)
if err != nil {