diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 3a14988..249c2fe 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -324,6 +324,31 @@ components: delete: type: boolean description: Флаг удаления промокода + bonus: + type: object + properties: + privilege: + type: object + properties: + privilegeID: + type: string + description: Идентификатор привилегии, которую необходимо предоставить + amount: + type: integer + format: uint64 + description: Размер привилегии + discount: + type: object + properties: + layer: + type: integer + factor: + type: number + target: + type: string + threshold: + type: integer + description: Информация о бонусах required: - id GetPromoCodesListReq: @@ -331,7 +356,6 @@ components: required: - page - limit - - filter properties: page: type: integer diff --git a/internal/controller/promocode/promocode_controller.go b/internal/controller/promocode/promocode_controller.go index 783d4ea..dfb23fb 100644 --- a/internal/controller/promocode/promocode_controller.go +++ b/internal/controller/promocode/promocode_controller.go @@ -77,9 +77,8 @@ func (p *PromoCodeController) GetList(c *fiber.Ctx) error { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Internal Server Error"}) } - resp := models.GetPromoCodesListResp{ + return c.Status(fiber.StatusOK).JSON(models.GetPromoCodesListResp{ Count: count, Items: promoCodes, - } - return c.Status(fiber.StatusOK).JSON(resp) + }) } diff --git a/internal/models/bonus.go b/internal/models/bonus.go index 7a4dc9e..f066fa1 100644 --- a/internal/models/bonus.go +++ b/internal/models/bonus.go @@ -31,7 +31,7 @@ type PromoCode struct { } type ReqEditPromoCode struct { - ID string `json:"id" bson:"_id"` //айдишник промокода, который обновляем + ID string `json:"id" bson:"_id"` // айдишник промокода, который обновляем Description *string `json:"description,omitempty" bson:"description"` // описание, необходимое менеджеру в админке Greetings *string `json:"greetings,omitempty" bson:"greetings"` // текст, выдаваемый пользователю в ответ на активацию промокода @@ -39,6 +39,20 @@ type ReqEditPromoCode struct { ActivationCount *int64 `json:"activationCount,omitempty" bson:"activationCount"` // предел количества активаций промокода Delete *bool `json:"delete,omitempty" bson:"delete"` + + Bonus *struct { + Privilege *struct { + PrivilegeID string `json:"privilegeID,omitempty" bson:"privilegeID"` + Amount uint64 `json:"amount,omitempty" bson:"amount"` + } `json:"privilege,omitempty" bson:"privilege"` + + Discount *struct { + Layer int `json:"layer,omitempty" bson:"layer"` + Factor float64 `json:"factor,omitempty" bson:"factor"` + Target string `json:"target,omitempty" bson:"target"` + Threshold int64 `json:"threshold,omitempty" bson:"threshold"` + } `json:"discount,omitempty" bson:"discount"` + } `json:"bonus,omitempty" bson:"bonus"` } type GetPromoCodesListReqFilter struct { diff --git a/internal/repository/promocode_repository.go b/internal/repository/promocode_repository.go index 83944ef..2206d48 100644 --- a/internal/repository/promocode_repository.go +++ b/internal/repository/promocode_repository.go @@ -99,21 +99,49 @@ func (r *PromoCodeRepository) EditPromoCode(ctx context.Context, req *models.Req updateFields["delete"] = *req.Delete } + if req.Bonus != nil { + if req.Bonus.Privilege != nil { + if req.Bonus.Privilege.PrivilegeID != "" { + updateFields["bonus.privilege.privilegeID"] = req.Bonus.Privilege.PrivilegeID + } + if req.Bonus.Privilege.Amount != 0 { + updateFields["bonus.privilege.amount"] = req.Bonus.Privilege.Amount + } + } + if req.Bonus.Discount != nil { + if req.Bonus.Discount.Layer != 0 { + updateFields["bonus.discount.layer"] = req.Bonus.Discount.Layer + } + if req.Bonus.Discount.Factor != 0.0 { + updateFields["bonus.discount.factor"] = req.Bonus.Discount.Factor + } + if req.Bonus.Discount.Target != "" { + updateFields["bonus.discount.target"] = req.Bonus.Discount.Target + } + if req.Bonus.Discount.Threshold != 0 { + updateFields["bonus.discount.threshold"] = req.Bonus.Discount.Threshold + } + } + } + if len(updateFields) == 0 { return r.GetPromoCodeByID(ctx, promoCodeID) } update := bson.M{"$set": updateFields} - result, err := r.mdb.UpdateOne(ctx, bson.M{"_id": promoCodeID}, update) + options := options.FindOneAndUpdate().SetReturnDocument(options.After) + result := r.mdb.FindOneAndUpdate(ctx, bson.M{"_id": promoCodeID}, update, options) + if result.Err() != nil { + return nil, result.Err() + } + + var updatedPromoCode models.PromoCode + err = result.Decode(&updatedPromoCode) if err != nil { return nil, err } - if result.MatchedCount == 0 { - return nil, ErrPromoCodeNotFound - } - - return r.GetPromoCodeByID(ctx, promoCodeID) + return &updatedPromoCode, nil } func (r *PromoCodeRepository) GetPromoCodeByID(ctx context.Context, promoCodeID primitive.ObjectID) (*models.PromoCode, error) { @@ -164,7 +192,7 @@ func (r *PromoCodeRepository) GetPromoCodesList(ctx context.Context, req *models } defer cursor.Close(ctx) - var promoCodes = make([]models.PromoCode, 0) + var promoCodes = make([]models.PromoCode, 0, 10) for cursor.Next(ctx) { var p models.PromoCode if err := cursor.Decode(&p); err != nil {