diff --git a/internal/logic/public/user/bindEmailWithVerificationLogic.go b/internal/logic/public/user/bindEmailWithVerificationLogic.go index cd3dac7..6785623 100644 --- a/internal/logic/public/user/bindEmailWithVerificationLogic.go +++ b/internal/logic/public/user/bindEmailWithVerificationLogic.go @@ -12,6 +12,7 @@ import ( "github.com/perfect-panel/server/pkg/constant" "github.com/perfect-panel/server/pkg/jwt" "github.com/perfect-panel/server/pkg/logger" + "github.com/perfect-panel/server/pkg/tool" "github.com/perfect-panel/server/pkg/uuidx" "github.com/perfect-panel/server/pkg/xerr" "github.com/pkg/errors" @@ -269,17 +270,9 @@ func (l *BindEmailWithVerificationLogic) transferDeviceToEmailUser(deviceUserId, // generateTokenForUser 为指定用户生成JWT token func (l *BindEmailWithVerificationLogic) generateTokenForUser(userId int64) (string, error) { // 生成JWT token - now := time.Now().Unix() accessExpire := l.svcCtx.Config.JwtAuth.AccessExpire - sessionId := fmt.Sprintf("device_transfer_%d_%d", userId, now) + sessionId := uuidx.NewUUID().String() - // jwtToken, err := jwt.NewJwtToken( - // l.svcCtx.Config.JwtAuth.AccessSecret, - // now, - // accessExpire, - // jwt.WithOption("UserId", userId), - // jwt.WithOption("SessionId", sessionId), - // ) jwtToken, err := jwt.NewJwtToken( l.svcCtx.Config.JwtAuth.AccessSecret, time.Now().Unix(), @@ -357,6 +350,17 @@ func (l *BindEmailWithVerificationLogic) createEmailUser(email string) (int64, e logger.Field("user_id", newUserId), logger.Field("email", email)) + // 4. 检查是否需要激活试用订阅 + if l.svcCtx.Config.Register.EnableTrial { + if err := l.activeTrial(newUserId, tx); err != nil { + l.Errorw("激活试用订阅失败", + logger.Field("error", err.Error()), + logger.Field("user_id", newUserId)) + return err + } + l.Infow("激活试用订阅成功", logger.Field("user_id", newUserId)) + } + return nil }) @@ -388,3 +392,53 @@ func (l *BindEmailWithVerificationLogic) clearDeviceRelatedCache(deviceIdentifie } } } + +// activeTrial 为新用户激活试用订阅 +func (l *BindEmailWithVerificationLogic) activeTrial(userId int64, tx *gorm.DB) error { + // 获取试用订阅模板 + sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, l.svcCtx.Config.Register.TrialSubscribe) + if err != nil { + l.Errorw("获取试用订阅模板失败", + logger.Field("user_id", userId), + logger.Field("trial_subscribe_id", l.svcCtx.Config.Register.TrialSubscribe), + logger.Field("error", err.Error())) + return err + } + + // 计算试用期时间 + startTime := time.Now() + expireTime := tool.AddTime(l.svcCtx.Config.Register.TrialTimeUnit, l.svcCtx.Config.Register.TrialTime, startTime) + subscribeToken := uuidx.SubscribeToken(fmt.Sprintf("Trial-%v", userId)) + subscribeUUID := uuidx.NewUUID().String() + + // 创建用户订阅记录 + userSub := &user.Subscribe{ + UserId: userId, + OrderId: 0, + SubscribeId: sub.Id, + StartTime: startTime, + ExpireTime: expireTime, + Traffic: sub.Traffic, + Download: 0, + Upload: 0, + Token: subscribeToken, + UUID: subscribeUUID, + Status: 1, + } + + // 插入订阅记录 + if err := tx.Create(userSub).Error; err != nil { + l.Errorw("插入试用订阅记录失败", + logger.Field("user_id", userId), + logger.Field("error", err.Error())) + return err + } + + l.Infow("试用订阅激活成功", + logger.Field("user_id", userId), + logger.Field("subscribe_id", sub.Id), + logger.Field("expire_time", expireTime), + logger.Field("traffic", sub.Traffic)) + + return nil +}