diff --git a/apis/admin/subscribe.api b/apis/admin/subscribe.api index 1d08b65..bea205d 100644 --- a/apis/admin/subscribe.api +++ b/apis/admin/subscribe.api @@ -102,6 +102,9 @@ type ( BatchDeleteSubscribeRequest { Ids []int64 `json:"ids" validate:"required"` } + ResetAllSubscribeTokenResponse { + Success bool `json:"success"` + } ) @server ( @@ -157,5 +160,9 @@ service ppanel { @doc "Subscribe sort" @handler SubscribeSort post /sort (SubscribeSortRequest) + + @doc "Reset all subscribe tokens" + @handler ResetAllSubscribeToken + post /reset_all_token returns (ResetAllSubscribeTokenResponse) } diff --git a/internal/handler/admin/subscribe/resetAllSubscribeTokenHandler.go b/internal/handler/admin/subscribe/resetAllSubscribeTokenHandler.go new file mode 100644 index 0000000..408975a --- /dev/null +++ b/internal/handler/admin/subscribe/resetAllSubscribeTokenHandler.go @@ -0,0 +1,18 @@ +package subscribe + +import ( + "github.com/gin-gonic/gin" + "github.com/perfect-panel/server/internal/logic/admin/subscribe" + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/pkg/result" +) + +// Reset all subscribe tokens +func ResetAllSubscribeTokenHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) { + return func(c *gin.Context) { + + l := subscribe.NewResetAllSubscribeTokenLogic(c.Request.Context(), svcCtx) + resp, err := l.ResetAllSubscribeToken() + result.HttpResult(c, resp, err) + } +} diff --git a/internal/handler/routes.go b/internal/handler/routes.go index 5e0364b..542d66c 100644 --- a/internal/handler/routes.go +++ b/internal/handler/routes.go @@ -385,6 +385,9 @@ func RegisterHandlers(router *gin.Engine, serverCtx *svc.ServiceContext) { // Get subscribe list adminSubscribeGroupRouter.GET("/list", adminSubscribe.GetSubscribeListHandler(serverCtx)) + // Reset all subscribe tokens + adminSubscribeGroupRouter.POST("/reset_all_token", adminSubscribe.ResetAllSubscribeTokenHandler(serverCtx)) + // Subscribe sort adminSubscribeGroupRouter.POST("/sort", adminSubscribe.SubscribeSortHandler(serverCtx)) } diff --git a/internal/logic/admin/subscribe/resetAllSubscribeTokenLogic.go b/internal/logic/admin/subscribe/resetAllSubscribeTokenLogic.go new file mode 100644 index 0000000..e7307a2 --- /dev/null +++ b/internal/logic/admin/subscribe/resetAllSubscribeTokenLogic.go @@ -0,0 +1,61 @@ +package subscribe + +import ( + "context" + "strconv" + "time" + + "github.com/perfect-panel/server/internal/model/user" + "github.com/perfect-panel/server/pkg/uuidx" + "github.com/perfect-panel/server/pkg/xerr" + "github.com/pkg/errors" + + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/internal/types" + "github.com/perfect-panel/server/pkg/logger" +) + +type ResetAllSubscribeTokenLogic struct { + logger.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +// Reset all subscribe tokens +func NewResetAllSubscribeTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ResetAllSubscribeTokenLogic { + return &ResetAllSubscribeTokenLogic{ + Logger: logger.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ResetAllSubscribeTokenLogic) ResetAllSubscribeToken() (resp *types.ResetAllSubscribeTokenResponse, err error) { + var list []*user.Subscribe + tx := l.svcCtx.DB.WithContext(l.ctx).Begin() + // select all active and Finished subscriptions + if err = tx.Model(&user.Subscribe{}).Where("`status` IN ?", []int64{1, 2}).Find(&list).Error; err != nil { + logger.Errorf("[ResetAllSubscribeToken] Failed to fetch subscribe list: %v", err.Error()) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "Failed to fetch subscribe list: %v", err.Error()) + } + + for _, sub := range list { + sub.Token = uuidx.SubscribeToken(strconv.FormatInt(time.Now().UnixMilli(), 10) + strconv.FormatInt(sub.Id, 10)) + sub.UUID = uuidx.NewUUID().String() + if err = tx.Model(&user.Subscribe{}).Where("id = ?", sub.Id).Save(sub).Error; err != nil { + tx.Rollback() + logger.Errorf("[ResetAllSubscribeToken] Failed to update subscribe token for ID %d: %v", sub.Id, err.Error()) + return &types.ResetAllSubscribeTokenResponse{ + Success: false, + }, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "Failed to update subscribe token for ID %d: %v", sub.Id, err.Error()) + } + } + if err = tx.Commit().Error; err != nil { + logger.Errorf("[ResetAllSubscribeToken] Failed to commit transaction: %v", err.Error()) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "Failed to commit transaction: %v", err.Error()) + } + + return &types.ResetAllSubscribeTokenResponse{ + Success: true, + }, nil +} diff --git a/internal/types/types.go b/internal/types/types.go index b8b39ab..20a2b0f 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -1772,6 +1772,10 @@ type RenewalOrderResponse struct { OrderNo string `json:"order_no"` } +type ResetAllSubscribeTokenResponse struct { + Success bool `json:"success"` +} + type ResetPasswordRequest struct { Identifier string `json:"identifier"` Email string `json:"email" validate:"required"`