@@ -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