Skip to content

Commit a4d1ae3

Browse files
FIX: Users failed to log in when the username changes
1 parent a50649c commit a4d1ae3

1 file changed

Lines changed: 27 additions & 30 deletions

File tree

internal/apps/oauth/utils.go

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,32 @@ func doOAuth(ctx context.Context, code string) (*User, error) {
109109
// 处理用户信息同步逻辑
110110
var user User
111111

112-
txByUsername := db.DB(ctx).Where("username = ?", userInfo.Username).First(&user)
113-
if txByUsername.Error != nil {
114-
txByID := db.DB(ctx).Where("id = ?", userInfo.Id).First(&user)
115-
if txByID.Error == nil {
116-
// ID 存在但 username 不匹配(用户改名)
117-
if err = user.CheckActive(); err != nil {
118-
span.SetStatus(codes.Error, err.Error())
119-
return nil, err
120-
}
121-
user.UpdateFromOAuthInfo(&userInfo)
122-
if err = db.DB(ctx).Save(&user).Error; err != nil {
112+
// 优先通过 ID 查询用户
113+
txByID := db.DB(ctx).Where("id = ?", userInfo.Id).First(&user)
114+
if txByID.Error == nil {
115+
// ID 存在,更新用户信息(包括可能的用户名变更)
116+
if err = user.CheckActive(); err != nil {
117+
span.SetStatus(codes.Error, err.Error())
118+
return nil, err
119+
}
120+
user.UpdateFromOAuthInfo(&userInfo)
121+
if err = db.DB(ctx).Save(&user).Error; err != nil {
122+
span.SetStatus(codes.Error, err.Error())
123+
return nil, err
124+
}
125+
} else if errors.Is(txByID.Error, gorm.ErrRecordNotFound) {
126+
// ID 不存在,检查 username 是否被其他用户占用
127+
var existingUser User
128+
txByUsername := db.DB(ctx).Where("username = ?", userInfo.Username).First(&existingUser)
129+
if txByUsername.Error == nil {
130+
// username 被其他用户占用(账户注销后被新用户占用)
131+
newUser, err := existingUser.MarkAsDeactivatedAndCreateNew(ctx, &userInfo)
132+
if err != nil {
123133
span.SetStatus(codes.Error, err.Error())
124134
return nil, err
125135
}
136+
user = *newUser
137+
user.EnqueueBadgeScoreTask(ctx)
126138
} else if errors.Is(txByUsername.Error, gorm.ErrRecordNotFound) {
127139
user = User{
128140
ID: userInfo.Id,
@@ -139,29 +151,14 @@ func doOAuth(ctx context.Context, code string) (*User, error) {
139151
}
140152
user.EnqueueBadgeScoreTask(ctx)
141153
} else {
142-
// query failed
154+
// username 查询失败
143155
span.SetStatus(codes.Error, txByUsername.Error.Error())
144156
return nil, txByUsername.Error
145157
}
146158
} else {
147-
if user.ID != userInfo.Id {
148-
// username 相同但 ID 不同(账户注销后被新用户占用)
149-
if _, err = user.MarkAsDeactivatedAndCreateNew(ctx, &userInfo); err != nil {
150-
span.SetStatus(codes.Error, err.Error())
151-
return nil, err
152-
}
153-
user.EnqueueBadgeScoreTask(ctx)
154-
} else {
155-
if err = user.CheckActive(); err != nil {
156-
span.SetStatus(codes.Error, err.Error())
157-
return nil, err
158-
}
159-
user.UpdateFromOAuthInfo(&userInfo)
160-
if err = db.DB(ctx).Save(&user).Error; err != nil {
161-
span.SetStatus(codes.Error, err.Error())
162-
return nil, err
163-
}
164-
}
159+
// ID 查询失败
160+
span.SetStatus(codes.Error, txByID.Error.Error())
161+
return nil, txByID.Error
165162
}
166163
return &user, nil
167164
}

0 commit comments

Comments
 (0)