package user import ( "context" "fmt" "time" "github.com/google/uuid" "github.com/perfect-panel/server/internal/model/user" "github.com/perfect-panel/server/internal/svc" "github.com/perfect-panel/server/internal/types" "github.com/perfect-panel/server/pkg/logger" "github.com/perfect-panel/server/pkg/uuidx" "github.com/perfect-panel/server/pkg/xerr" "github.com/pkg/errors" ) type CreateUserSubscribeLogic struct { logger.Logger ctx context.Context svcCtx *svc.ServiceContext } // Create user subcribe func NewCreateUserSubscribeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateUserSubscribeLogic { return &CreateUserSubscribeLogic{ Logger: logger.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *CreateUserSubscribeLogic) CreateUserSubscribe(req *types.CreateUserSubscribeRequest) error { // validate user userInfo, err := l.svcCtx.UserModel.FindOne(l.ctx, req.UserId) if err != nil { l.Errorw("FindOne error", logger.Field("error", err.Error()), logger.Field("userId", req.UserId)) return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "FindOne error: %v", err.Error()) } subs, err := l.svcCtx.UserModel.QueryUserSubscribe(l.ctx, req.UserId) if err != nil { l.Errorw("QueryUserSubscribe error", logger.Field("error", err.Error()), logger.Field("userId", req.UserId)) return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "QueryUserSubscribe error: %v", err.Error()) } if len(subs) >= 1 && l.svcCtx.Config.Subscribe.SingleModel { return errors.Wrapf(xerr.NewErrCode(xerr.SingleSubscribeModeExceedsLimit), "Single subscribe mode exceeds limit") } sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, req.SubscribeId) if err != nil { l.Errorw("FindOne error", logger.Field("error", err.Error()), logger.Field("subscribeId", req.SubscribeId)) return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "FindOne error: %v", err.Error()) } if req.Traffic == 0 { req.Traffic = sub.Traffic } userSub := user.Subscribe{ UserId: req.UserId, SubscribeId: req.SubscribeId, StartTime: time.Now(), ExpireTime: time.UnixMilli(req.ExpiredAt), Traffic: req.Traffic, Download: 0, Upload: 0, Token: uuidx.SubscribeToken(fmt.Sprintf("adminCreate:%d", time.Now().UnixMilli())), UUID: uuid.New().String(), Status: 1, } if err = l.svcCtx.UserModel.InsertSubscribe(l.ctx, &userSub); err != nil { l.Errorw("InsertSubscribe error", logger.Field("error", err.Error())) return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "InsertSubscribe error: %v", err.Error()) } err = l.svcCtx.UserModel.UpdateUserCache(l.ctx, userInfo) if err != nil { l.Errorw("UpdateUserCache error", logger.Field("error", err.Error())) return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "UpdateUserCache error: %v", err.Error()) } err = l.svcCtx.SubscribeModel.ClearCache(l.ctx, userSub.SubscribeId) if err != nil { logger.Errorw("ClearSubscribe error", logger.Field("error", err.Error())) } return nil }