fix: 退出登录不删除用户订阅,保留订阅数据
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m52s

This commit is contained in:
shanshanzhong 2026-03-09 01:48:54 -07:00
parent 9c197442a6
commit b303f16525

View File

@ -56,10 +56,7 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic
// 2. 事务前收集受影响的家庭成员 ID事务会改变家庭关系之后查不到
familyMemberIDs := l.collectFamilyMemberIDs(userInfo.Id)
// 3. 事务前查出用户订阅,用于事务后清订阅缓存
userSubscribes, _ := l.svcCtx.UserModel.QueryUserSubscribe(l.ctx, userInfo.Id)
// 4. 事务:解绑家庭组 + 解绑非 device 的登录方式 + 删除订阅
// 3. 事务:解绑家庭组 + 解绑非 device 的登录方式
err := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
// 解绑家庭组owner 解散整个家庭member 退出家庭)
exitHelper := newFamilyExitHelper(l.ctx, l.svcCtx)
@ -73,12 +70,6 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "delete non-device auth methods failed")
}
// 删除该用户的所有订阅(解绑后不应保留原账号的订阅)
if err := tx.Where("user_id = ?", userInfo.Id).
Delete(&user.Subscribe{}).Error; err != nil {
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "delete user subscribes failed")
}
return nil
})
if err != nil {
@ -113,44 +104,7 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic
)
}
// 8. 清理订阅相关缓存
if len(userSubscribes) > 0 {
subscribeModels := make([]*user.Subscribe, 0, len(userSubscribes)+1)
subscribeModels = append(subscribeModels, &user.Subscribe{UserId: userInfo.Id})
subscribeIDSet := make(map[int64]struct{})
for _, sub := range userSubscribes {
subscribeModels = append(subscribeModels, &user.Subscribe{
Id: sub.Id,
UserId: sub.UserId,
SubscribeId: sub.SubscribeId,
Token: sub.Token,
})
if sub.SubscribeId > 0 {
subscribeIDSet[sub.SubscribeId] = struct{}{}
}
}
if clearErr := l.svcCtx.UserModel.ClearSubscribeCache(l.ctx, subscribeModels...); clearErr != nil {
l.Errorw("clear subscribe cache failed",
logger.Field("user_id", userInfo.Id),
logger.Field("error", clearErr.Error()),
)
}
for subscribeID := range subscribeIDSet {
if clearErr := l.svcCtx.SubscribeModel.ClearCache(l.ctx, subscribeID); clearErr != nil {
l.Errorw("clear subscribe plan cache failed",
logger.Field("subscribe_id", subscribeID),
logger.Field("error", clearErr.Error()),
)
}
}
if clearErr := l.svcCtx.NodeModel.ClearServerAllCache(l.ctx); clearErr != nil {
l.Errorw("clear server cache failed",
logger.Field("error", clearErr.Error()),
)
}
}
// 9. 清理受影响的家庭成员缓存(家庭解散后成员需感知变化)
// 8. 清理受影响的家庭成员缓存(家庭解散后成员需感知变化)
for _, memberID := range familyMemberIDs {
if memberUser, findErr := l.svcCtx.UserModel.FindOne(l.ctx, memberID); findErr == nil {
if clearErr := l.svcCtx.UserModel.ClearUserCache(l.ctx, memberUser); clearErr != nil {