diff --git a/internal/apps/oauth/logics.go b/internal/apps/oauth/logics.go index e527ed0..b2e6030 100644 --- a/internal/apps/oauth/logics.go +++ b/internal/apps/oauth/logics.go @@ -111,14 +111,13 @@ func doOAuth(ctx context.Context, code string, nonce string) (*model.User, error err = db.DB(ctx).Transaction(func(tx *gorm.DB) error { var holder model.User if conflictErr := tx.Where("username = ? AND id != ?", userInfo.Username, userInfo.GetID()).First(&holder).Error; conflictErr == nil { - // 存在冲突 -> 将占用者改名并注销 - newParams := map[string]interface{}{ - "username": fmt.Sprintf("%s已注销: %s", holder.Username, uuid.NewString()), - "is_active": false, - } - if updateErr := tx.Model(&holder).Updates(newParams).Error; updateErr != nil { + // 用户名来自 OAuth 且可能被改名复用;冲突时只释放旧用户名,不禁用原账号。 + newUsername := fmt.Sprintf("__released_username__:%d:%s", holder.ID, uuid.NewString()) + if updateErr := tx.Model(&holder).Update("username", newUsername).Error; updateErr != nil { return updateErr } + } else if !errors.Is(conflictErr, gorm.ErrRecordNotFound) { + return conflictErr } // 根据 ID 处理当前用户的 更新 或 创建 diff --git a/internal/model/users.go b/internal/model/users.go index 1f6470c..bec0daa 100644 --- a/internal/model/users.go +++ b/internal/model/users.go @@ -92,7 +92,7 @@ type LeaderboardUser struct { type User struct { ID uint64 `json:"id" gorm:"primaryKey;index:idx_users_active_bal_id,priority:3"` - Username string `json:"username" gorm:"size:64;uniqueIndex"` + Username string `json:"username" gorm:"size:255;uniqueIndex"` Nickname string `json:"nickname" gorm:"size:255"` AvatarUrl string `json:"avatar_url" gorm:"size:255"` TrustLevel TrustLevel `json:"trust_level" gorm:"index"`