diff --git a/apis/admin/redemption.api b/apis/admin/redemption.api index d424b61..ca5632c 100644 --- a/apis/admin/redemption.api +++ b/apis/admin/redemption.api @@ -24,6 +24,11 @@ type ( SubscribePlan int64 `json:"subscribe_plan,omitempty"` UnitTime string `json:"unit_time,omitempty" validate:"omitempty,oneof=day month quarter half_year year"` Quantity int64 `json:"quantity,omitempty"` + Status int64 `json:"status,omitempty" validate:"omitempty,oneof=0 1"` + } + ToggleRedemptionCodeStatusRequest { + Id int64 `json:"id" validate:"required"` + Status int64 `json:"status" validate:"oneof=0 1"` } DeleteRedemptionCodeRequest { Id int64 `json:"id" validate:"required"` @@ -68,6 +73,10 @@ service ppanel { @handler UpdateRedemptionCode put /code (UpdateRedemptionCodeRequest) + @doc "Toggle redemption code status" + @handler ToggleRedemptionCodeStatus + put /code/status (ToggleRedemptionCodeStatusRequest) + @doc "Delete redemption code" @handler DeleteRedemptionCode delete /code (DeleteRedemptionCodeRequest) diff --git a/internal/handler/routes.go b/internal/handler/routes.go index 0f24078..47f16a5 100644 --- a/internal/handler/routes.go +++ b/internal/handler/routes.go @@ -319,6 +319,9 @@ func RegisterHandlers(router *gin.Engine, serverCtx *svc.ServiceContext) { // Get redemption code list adminRedemptionGroupRouter.GET("/code/list", adminRedemption.GetRedemptionCodeListHandler(serverCtx)) + // Toggle redemption code status + adminRedemptionGroupRouter.PUT("/code/status", adminRedemption.ToggleRedemptionCodeStatusHandler(serverCtx)) + // Get redemption record list adminRedemptionGroupRouter.GET("/record/list", adminRedemption.GetRedemptionRecordListHandler(serverCtx)) } diff --git a/internal/logic/admin/redemption/createRedemptionCodeLogic.go b/internal/logic/admin/redemption/createRedemptionCodeLogic.go index dfd12e5..4c381a0 100644 --- a/internal/logic/admin/redemption/createRedemptionCodeLogic.go +++ b/internal/logic/admin/redemption/createRedemptionCodeLogic.go @@ -100,6 +100,7 @@ func (l *CreateRedemptionCodeLogic) CreateRedemptionCode(req *types.CreateRedemp SubscribePlan: req.SubscribePlan, UnitTime: req.UnitTime, Quantity: req.Quantity, + Status: 1, // Default to enabled } err = l.svcCtx.RedemptionCodeModel.Insert(l.ctx, redemptionCode) diff --git a/internal/logic/admin/redemption/getRedemptionCodeListLogic.go b/internal/logic/admin/redemption/getRedemptionCodeListLogic.go index 3821e13..88e5c80 100644 --- a/internal/logic/admin/redemption/getRedemptionCodeListLogic.go +++ b/internal/logic/admin/redemption/getRedemptionCodeListLogic.go @@ -49,6 +49,7 @@ func (l *GetRedemptionCodeListLogic) GetRedemptionCodeList(req *types.GetRedempt SubscribePlan: item.SubscribePlan, UnitTime: item.UnitTime, Quantity: item.Quantity, + Status: item.Status, CreatedAt: item.CreatedAt.Unix(), UpdatedAt: item.UpdatedAt.Unix(), }) diff --git a/internal/logic/public/redemption/redeemCodeLogic.go b/internal/logic/public/redemption/redeemCodeLogic.go index ca849d8..a00bcd9 100644 --- a/internal/logic/public/redemption/redeemCodeLogic.go +++ b/internal/logic/public/redemption/redeemCodeLogic.go @@ -54,6 +54,14 @@ func (l *RedeemCodeLogic) RedeemCode(req *types.RedeemCodeRequest) (resp *types. return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find redemption code error: %v", err.Error()) } + // Check if redemption code is enabled + if redemptionCode.Status != 1 { + l.Errorw("[RedeemCode] Redemption code is disabled", + logger.Field("code", req.Code), + logger.Field("status", redemptionCode.Status)) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidParams), "redemption code is disabled") + } + // Check if redemption code has remaining count if redemptionCode.TotalCount > 0 && redemptionCode.UsedCount >= redemptionCode.TotalCount { l.Errorw("[RedeemCode] Redemption code has been fully used",