From f1078f4354a569cc4b0a5c64a3406a1bf6cca666 Mon Sep 17 00:00:00 2001 From: Jason Song Date: Tue, 27 Sep 2022 18:20:05 +0800 Subject: [PATCH] fix: create external user --- models/user/external_login_user.go | 12 +++++++++--- routers/web/auth/auth.go | 2 +- routers/web/auth/oauth.go | 2 +- services/externalaccount/user.go | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/models/user/external_login_user.go b/models/user/external_login_user.go index 422823b89c3ff..5f4938e620c2d 100644 --- a/models/user/external_login_user.go +++ b/models/user/external_login_user.go @@ -149,17 +149,23 @@ func GetUserIDByExternalUserID(provider, userID string) (int64, error) { } // UpdateExternalUserByExternalID updates an external user's information -func UpdateExternalUserByExternalID(external *ExternalLoginUser) error { +func UpdateExternalUserByExternalID(external *ExternalLoginUser, upsert bool) error { has, err := db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID). NoAutoCondition(). Exist(external) if err != nil { return err - } else if !has { + } + + if !has && !upsert { return ErrExternalLoginUserNotExist{external.UserID, external.LoginSourceID} } - _, err = db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external) + if has { + _, err = db.GetEngine(db.DefaultContext).Where("external_id=? AND login_source_id=?", external.ExternalID, external.LoginSourceID).AllCols().Update(external) + } else { + _, err = db.GetEngine(db.DefaultContext).Insert(external) + } return err } diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 8a4c12d57b573..574697a807255 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -618,7 +618,7 @@ func handleUserCreated(ctx *context.Context, u *user_model.User, gothUser *goth. // update external user information if gothUser != nil { - if err := externalaccount.UpdateExternalUser(u, *gothUser); err != nil { + if err := externalaccount.UpdateExternalUser(u, *gothUser, true); err != nil { log.Error("UpdateExternalUser failed: %v", err) } } diff --git a/routers/web/auth/oauth.go b/routers/web/auth/oauth.go index b400fdac8c399..35cc249ca3406 100644 --- a/routers/web/auth/oauth.go +++ b/routers/web/auth/oauth.go @@ -1041,7 +1041,7 @@ func handleOAuth2SignIn(ctx *context.Context, source *auth.Source, u *user_model } // update external user information - if err := externalaccount.UpdateExternalUser(u, gothUser); err != nil { + if err := externalaccount.UpdateExternalUser(u, gothUser, false); err != nil { log.Error("UpdateExternalUser failed: %v", err) } diff --git a/services/externalaccount/user.go b/services/externalaccount/user.go index e5cd443770c08..63ed65a470d82 100644 --- a/services/externalaccount/user.go +++ b/services/externalaccount/user.go @@ -70,11 +70,11 @@ func LinkAccountToUser(user *user_model.User, gothUser goth.User) error { } // UpdateExternalUser updates external user's information -func UpdateExternalUser(user *user_model.User, gothUser goth.User) error { +func UpdateExternalUser(user *user_model.User, gothUser goth.User, upsert bool) error { externalLoginUser, err := toExternalLoginUser(user, gothUser) if err != nil { return err } - return user_model.UpdateExternalUserByExternalID(externalLoginUser) + return user_model.UpdateExternalUserByExternalID(externalLoginUser, upsert) }