修复缓存
Build docker and publish / build (20.15.1) (push) Successful in 7m26s

This commit is contained in:
2026-03-06 21:58:29 -08:00
parent 19932bb9f7
commit 4d913c1728
175 changed files with 437 additions and 12104 deletions
@@ -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 {