This commit is contained in:
@@ -45,6 +45,9 @@ func (h *accountMergeHelper) mergeIntoOwner(ownerUserID, deviceUserID int64, sou
|
||||
DeviceUserID: deviceUserID,
|
||||
}
|
||||
|
||||
// Capture device user's auth methods BEFORE the transaction migrates them
|
||||
deviceAuthMethods, _ := h.svcCtx.UserModel.FindUserAuthMethods(h.ctx, deviceUserID)
|
||||
|
||||
err := h.svcCtx.DB.WithContext(h.ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var owner modelUser.User
|
||||
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
|
||||
@@ -114,7 +117,7 @@ func (h *accountMergeHelper) mergeIntoOwner(ownerUserID, deviceUserID int64, sou
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := h.clearCaches(result); err != nil {
|
||||
if err := h.clearCaches(result, deviceAuthMethods); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -129,16 +132,32 @@ func (h *accountMergeHelper) mergeIntoOwner(ownerUserID, deviceUserID int64, sou
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (h *accountMergeHelper) clearCaches(result *accountMergeResult) error {
|
||||
func (h *accountMergeHelper) clearCaches(result *accountMergeResult, deviceAuthMethods []*modelUser.AuthMethods) error {
|
||||
if result == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := h.svcCtx.UserModel.ClearUserCache(h.ctx,
|
||||
&modelUser.User{Id: result.OwnerUserID},
|
||||
&modelUser.User{Id: result.DeviceUserID},
|
||||
); err != nil {
|
||||
return err
|
||||
// Fetch owner user with AuthMethods for proper cache key generation
|
||||
var users []*modelUser.User
|
||||
if u, err := h.svcCtx.UserModel.FindOne(h.ctx, result.OwnerUserID); err == nil {
|
||||
users = append(users, u)
|
||||
}
|
||||
// For device user, FindOne won't have AuthMethods anymore (migrated in tx),
|
||||
// so we build a minimal User with the pre-captured auth methods
|
||||
deviceUser := &modelUser.User{Id: result.DeviceUserID}
|
||||
if len(deviceAuthMethods) > 0 {
|
||||
authMethods := make([]modelUser.AuthMethods, len(deviceAuthMethods))
|
||||
for i, am := range deviceAuthMethods {
|
||||
authMethods[i] = *am
|
||||
}
|
||||
deviceUser.AuthMethods = authMethods
|
||||
}
|
||||
users = append(users, deviceUser)
|
||||
|
||||
if len(users) > 0 {
|
||||
if err := h.svcCtx.UserModel.ClearUserCache(h.ctx, users...); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if len(result.MovedDevices) > 0 {
|
||||
|
||||
Reference in New Issue
Block a user