From db372231ff2d076f4ace6bb20fed6ad5ee305b45 Mon Sep 17 00:00:00 2001 From: Pavel Date: Fri, 12 Jan 2024 12:42:56 +0300 Subject: [PATCH] add update restrictions --- .../promocode/promocode_controller.go | 4 +++ internal/models/bonus.go | 12 +++---- internal/repository/promocode_repository.go | 35 ++++++++++++------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/internal/controller/promocode/promocode_controller.go b/internal/controller/promocode/promocode_controller.go index 7bd0014..8c854cb 100644 --- a/internal/controller/promocode/promocode_controller.go +++ b/internal/controller/promocode/promocode_controller.go @@ -47,6 +47,10 @@ func (p *PromoCodeController) EditPromoCode(c *fiber.Ctx) error { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"}) } + if reqEditPromoCode.ID == "" { + return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "promocode ID is required"}) + } + editedPromoCode, err := p.promoCodeService.EditPromoCode(c.Context(), &reqEditPromoCode) if err != nil { p.logger.Error("Failed to edit promocode", zap.Error(err)) diff --git a/internal/models/bonus.go b/internal/models/bonus.go index ff7cf8e..1f3158d 100644 --- a/internal/models/bonus.go +++ b/internal/models/bonus.go @@ -31,12 +31,12 @@ type PromoCode struct { } type ReqEditPromoCode struct { - ID string `json:"id" bson:"_id"` //айдишник промокода, который обновляем - Description string `json:"description" bson:"description"` // описание, необходимое менеджеру в админке - Greetings string `json:"greetings" bson:"greetings"` // текст, выдаваемый пользователю в ответ на активацию промокода + ID string `json:"id" bson:"_id"` //айдишник промокода, который обновляем + Description *string `json:"description,omitempty" bson:"description"` // описание, необходимое менеджеру в админке + Greetings *string `json:"greetings,omitempty" bson:"greetings"` // текст, выдаваемый пользователю в ответ на активацию промокода - DueTo int64 `json:"dueTo" bson:"dueTo"` // таймштамп времени окончания работы активации промокода - ActivationCount int64 `json:"activationCount" bson:"activationCount"` // предел количества активаций промокода + DueTo *int64 `json:"dueTo,omitempty" bson:"dueTo"` // таймштамп времени окончания работы активации промокода + ActivationCount *int64 `json:"activationCount,omitempty" bson:"activationCount"` // предел количества активаций промокода - Delete bool `json:"delete" bson:"delete"` + Delete *bool `json:"delete,omitempty" bson:"delete"` } diff --git a/internal/repository/promocode_repository.go b/internal/repository/promocode_repository.go index 11a209f..841537b 100644 --- a/internal/repository/promocode_repository.go +++ b/internal/repository/promocode_repository.go @@ -56,24 +56,35 @@ func (r *PromoCodeRepository) CreatePromoCode(ctx context.Context, promoCode *mo return promoCode, nil } -func (r *PromoCodeRepository) EditPromoCode(ctx context.Context, EditPromoCode *models.ReqEditPromoCode) (*models.PromoCode, error) { - promoCodeID, err := primitive.ObjectIDFromHex(EditPromoCode.ID) +func (r *PromoCodeRepository) EditPromoCode(ctx context.Context, editPromoCode *models.ReqEditPromoCode) (*models.PromoCode, error) { + promoCodeID, err := primitive.ObjectIDFromHex(editPromoCode.ID) if err != nil { return nil, err } - filter := bson.M{"_id": promoCodeID} - update := bson.M{ - "$set": bson.M{ - "description": EditPromoCode.Description, - "greetings": EditPromoCode.Greetings, - "dueTo": EditPromoCode.DueTo, - "activationCount": EditPromoCode.ActivationCount, - "delete": EditPromoCode.Delete, - }, + updateFields := bson.M{} + if editPromoCode.Description != nil { + updateFields["description"] = *editPromoCode.Description + } + if editPromoCode.Greetings != nil { + updateFields["greetings"] = *editPromoCode.Greetings + } + if editPromoCode.DueTo != nil { + updateFields["dueTo"] = *editPromoCode.DueTo + } + if editPromoCode.ActivationCount != nil { + updateFields["activationCount"] = *editPromoCode.ActivationCount + } + if editPromoCode.Delete != nil { + updateFields["delete"] = *editPromoCode.Delete } - result, err := r.mdb.UpdateOne(ctx, filter, update) + 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) if err != nil { return nil, err }