fix: 退出登录时删除用户订阅并清理订阅缓存
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m45s
- 事务内删除用户所有订阅记录 - 事务后清理订阅缓存、套餐缓存、节点缓存
This commit is contained in:
parent
d6437f043f
commit
9c197442a6
@ -56,7 +56,10 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic
|
||||
// 2. 事务前收集受影响的家庭成员 ID(事务会改变家庭关系,之后查不到)
|
||||
familyMemberIDs := l.collectFamilyMemberIDs(userInfo.Id)
|
||||
|
||||
// 3. 事务:解绑家庭组 + 解绑非 device 的登录方式
|
||||
// 3. 事务前查出用户订阅,用于事务后清订阅缓存
|
||||
userSubscribes, _ := l.svcCtx.UserModel.QueryUserSubscribe(l.ctx, userInfo.Id)
|
||||
|
||||
// 4. 事务:解绑家庭组 + 解绑非 device 的登录方式 + 删除订阅
|
||||
err := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
||||
// 解绑家庭组(owner 解散整个家庭,member 退出家庭)
|
||||
exitHelper := newFamilyExitHelper(l.ctx, l.svcCtx)
|
||||
@ -70,6 +73,12 @@ 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 {
|
||||
@ -104,7 +113,44 @@ func (l *UnbindDeviceLogic) logoutUnbind(userInfo *user.User, device *user.Devic
|
||||
)
|
||||
}
|
||||
|
||||
// 8. 清理受影响的家庭成员缓存(家庭解散后成员需感知变化)
|
||||
// 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. 清理受影响的家庭成员缓存(家庭解散后成员需感知变化)
|
||||
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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user