diff --git a/internal/logic/admin/user/deleteUserDeviceLogic.go b/internal/logic/admin/user/deleteUserDeviceLogic.go index c92f79e..264ecc0 100644 --- a/internal/logic/admin/user/deleteUserDeviceLogic.go +++ b/internal/logic/admin/user/deleteUserDeviceLogic.go @@ -1,14 +1,18 @@ package user import ( - "context" + "context" + "fmt" + "time" - "github.com/perfect-panel/server/pkg/xerr" - "github.com/pkg/errors" + "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" + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/internal/types" + "github.com/perfect-panel/server/internal/config" + "github.com/perfect-panel/server/pkg/logger" + "gorm.io/gorm" ) type DeleteUserDeviceLogic struct { @@ -27,9 +31,32 @@ func NewDeleteUserDeviceLogic(ctx context.Context, svcCtx *svc.ServiceContext) * } func (l *DeleteUserDeviceLogic) DeleteUserDevice(req *types.DeleteUserDeivceRequest) error { - err := l.svcCtx.UserModel.DeleteDevice(l.ctx, req.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "delete user error: %v", err.Error()) - } - return nil + device, findErr := l.svcCtx.UserModel.FindOneDevice(l.ctx, req.Id) + if findErr != nil { + if errors.Is(findErr, gorm.ErrRecordNotFound) { + return nil + } + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "get Device error: %v", findErr.Error()) + } + + // 尝试踢下线在线设备 + l.svcCtx.DeviceManager.KickDevice(device.UserId, device.Identifier) + + // 清理与设备相关的缓存会话 + ctx, cancel := context.WithTimeout(l.ctx, 2*time.Second) + defer cancel() + deviceCacheKey := fmt.Sprintf("%v:%v", config.DeviceCacheKeyKey, device.Identifier) + if sessionId, rerr := l.svcCtx.Redis.Get(ctx, deviceCacheKey).Result(); rerr == nil && sessionId != "" { + _ = l.svcCtx.Redis.Del(ctx, deviceCacheKey).Err() + sessionIdCacheKey := fmt.Sprintf("%v:%v", config.SessionIdKey, sessionId) + _ = l.svcCtx.Redis.Del(ctx, sessionIdCacheKey).Err() + sessionsKey := fmt.Sprintf("%s%v", config.UserSessionsKeyPrefix, device.UserId) + _ = l.svcCtx.Redis.ZRem(ctx, sessionsKey, sessionId).Err() + } + + // 最后删除数据库记录 + if err := l.svcCtx.UserModel.DeleteDevice(l.ctx, req.Id); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "delete user error: %v", err.Error()) + } + return nil }