feat(用户): 添加新用户注册时激活试用订阅功能
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m33s

在创建邮箱用户时,检查配置是否启用试用订阅功能。若启用,则自动为用户激活试用订阅
This commit is contained in:
shanshanzhong 2025-10-28 21:20:57 -07:00
parent 63d90fba72
commit 02e76ebcf1

View File

@ -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
}