diff --git a/internal/logic/auth/deviceLoginLogic.go b/internal/logic/auth/deviceLoginLogic.go index 44e7775..81594cb 100644 --- a/internal/logic/auth/deviceLoginLogic.go +++ b/internal/logic/auth/deviceLoginLogic.go @@ -6,14 +6,12 @@ import ( "time" "github.com/perfect-panel/server/internal/config" - commonLogic "github.com/perfect-panel/server/internal/logic/common" "github.com/perfect-panel/server/internal/model/log" "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/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" @@ -137,8 +135,6 @@ func (l *DeviceLoginLogic) DeviceLogin(req *types.DeviceLoginRequest) (resp *typ } } - l.tryGrantTrialForDeviceLogin(userInfo, req.Identifier) - // Generate session id sessionId := uuidx.NewUUID().String() @@ -295,127 +291,3 @@ func (l *DeviceLoginLogic) registerUserAndDevice(req *types.DeviceLoginRequest) return userInfo, nil } - -func (l *DeviceLoginLogic) tryGrantTrialForDeviceLogin(userInfo *user.User, identifier string) { - if userInfo == nil || userInfo.Id == 0 { - return - } - if !IsTrialConfigReady(l.svcCtx.Config.Register) { - l.Debugw("skip device trial grant because trial config is not ready", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("enable_trial", l.svcCtx.Config.Register.EnableTrial), - logger.Field("trial_subscribe_id", l.svcCtx.Config.Register.TrialSubscribe), - logger.Field("trial_time", l.svcCtx.Config.Register.TrialTime), - logger.Field("trial_time_unit", l.svcCtx.Config.Register.TrialTimeUnit), - ) - return - } - if userInfo.CreatedAt.IsZero() || time.Since(userInfo.CreatedAt) > 24*time.Hour { - l.Debugw("skip device trial grant because user is outside trial backfill window", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("user_created_at", userInfo.CreatedAt), - ) - return - } - - entitlement, err := commonLogic.ResolveEntitlementUser(l.ctx, l.svcCtx.DB, userInfo.Id) - if err != nil { - l.Errorw("failed to resolve family entitlement before device trial grant", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("error", err.Error()), - ) - return - } - if entitlement != nil && entitlement.EffectiveUserID != userInfo.Id { - l.Debugw("skip device trial grant because device user is a family member", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("effective_user_id", entitlement.EffectiveUserID), - logger.Field("entitlement_source", entitlement.Source), - ) - return - } - - var count int64 - if err := l.svcCtx.DB.WithContext(l.ctx). - Model(&user.Subscribe{}). - Where("user_id = ?", userInfo.Id). - Count(&count).Error; err != nil { - l.Errorw("failed to query existing subscriptions before device trial grant", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("error", err.Error()), - ) - return - } - if count > 0 { - l.Debugw("skip device trial grant because user already has subscriptions", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("subscription_count", count), - ) - return - } - - trialSubscribe, err := l.activeTrial(userInfo.Id) - if err != nil { - l.Errorw("failed to activate trial subscription for device login", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("trial_subscribe_id", l.svcCtx.Config.Register.TrialSubscribe), - logger.Field("error", err.Error()), - ) - return - } - - if clearErr := l.svcCtx.UserModel.ClearSubscribeCache(l.ctx, trialSubscribe); clearErr != nil { - l.Errorw("ClearSubscribeCache failed", - logger.Field("error", clearErr.Error()), - logger.Field("userSubscribeId", trialSubscribe.Id), - ) - } - if clearErr := l.svcCtx.SubscribeModel.ClearCache(l.ctx, trialSubscribe.SubscribeId); clearErr != nil { - l.Errorw("ClearSubscribeCache failed", - logger.Field("error", clearErr.Error()), - logger.Field("subscribeId", trialSubscribe.SubscribeId), - ) - } - if clearErr := l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); clearErr != nil { - l.Errorf("ClearServerAllCache error: %v", clearErr.Error()) - } - l.Infow("device trial subscription granted", - logger.Field("user_id", userInfo.Id), - logger.Field("identifier", identifier), - logger.Field("user_subscribe_id", trialSubscribe.Id), - logger.Field("trial_subscribe_id", trialSubscribe.SubscribeId), - logger.Field("expire_time", trialSubscribe.ExpireTime), - ) -} - -func (l *DeviceLoginLogic) activeTrial(uid int64) (*user.Subscribe, error) { - sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, l.svcCtx.Config.Register.TrialSubscribe) - if err != nil { - return nil, err - } - startTime := time.Now() - userSub := &user.Subscribe{ - UserId: uid, - OrderId: 0, - SubscribeId: sub.Id, - StartTime: startTime, - ExpireTime: tool.AddTime(l.svcCtx.Config.Register.TrialTimeUnit, l.svcCtx.Config.Register.TrialTime, startTime), - Traffic: sub.Traffic, - Download: 0, - Upload: 0, - Token: uuidx.NewUUID().String(), - UUID: uuidx.NewUUID().String(), - Status: 1, - } - if err = l.svcCtx.UserModel.InsertSubscribe(l.ctx, userSub); err != nil { - return nil, err - } - return userSub, nil -} diff --git a/scripts/test_device_trial_registration.go b/scripts/test_device_trial_registration.go index 4c68e1a..9a50ed8 100644 --- a/scripts/test_device_trial_registration.go +++ b/scripts/test_device_trial_registration.go @@ -63,7 +63,7 @@ func main() { *ip = fmt.Sprintf("198.18.%d.%d", now%200+1, now/200%200+1) } - fmt.Println("== device trial registration test ==") + fmt.Println("== device registration no-trial test ==") fmt.Printf("mysql: %s/%s\n", env.cfg.MySQL.Addr, env.cfg.MySQL.Dbname) fmt.Printf("redis: %s db=%d\n", env.cfg.Redis.Host, env.cfg.Redis.DB) fmt.Printf("device.enable=%v\n", env.svcCtx.Config.Device.Enable) @@ -111,11 +111,6 @@ func main() { Find(&subs).Error; err != nil { fail(fmt.Errorf("query user_subscribe failed: %w", err)) } - if len(subs) == 0 { - fail(fmt.Errorf("FAIL: no user_subscribe rows created for user_id=%d", device.UserId)) - } - - var trial *modelUser.Subscribe for i := range subs { sub := &subs[i] fmt.Printf("subscribe: id=%d order_id=%d subscribe_id=%d status=%d start=%s expire=%s token_empty=%v\n", @@ -131,17 +126,11 @@ func main() { sub.SubscribeId == env.svcCtx.Config.Register.TrialSubscribe && (sub.Status == 0 || sub.Status == 1) && sub.ExpireTime.After(time.Now()) { - trial = sub + fail(fmt.Errorf("FAIL: device registration unexpectedly granted trial user_subscribe_id=%d user_id=%d", sub.Id, device.UserId)) } } - if trial == nil { - fail(fmt.Errorf("FAIL: trial subscription was not granted for user_id=%d", device.UserId)) - } - fmt.Printf("PASS: trial granted user_subscribe_id=%d expire_time=%s\n", - trial.Id, - trial.ExpireTime.Format(time.RFC3339), - ) + fmt.Printf("PASS: device registration created no active trial subscription for user_id=%d\n", device.UserId) if *cleanup { if err = cleanupTestRows(ctx, env.db, device.UserId); err != nil {