From f960e19c590d27fe62a3a6241f1ea8b7fadde13a Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 12 Aug 2017 22:18:44 +0800 Subject: [PATCH] Only update needed columns when update user (#2296) * only update needed columns when update user * fix missing update_unix column --- cmd/admin.go | 2 +- models/user.go | 33 +++++++++++++++++++++++++++++---- routers/api/v1/org/org.go | 2 +- routers/user/auth.go | 18 ++++++++++-------- routers/user/auth_openid.go | 3 ++- routers/user/setting.go | 4 ++-- 6 files changed, 45 insertions(+), 17 deletions(-) diff --git a/cmd/admin.go b/cmd/admin.go index aec1b8dad..928bc1ebb 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -103,7 +103,7 @@ func runChangePassword(c *cli.Context) error { return fmt.Errorf("%v", err) } user.EncodePasswd() - if err := models.UpdateUser(user); err != nil { + if err := models.UpdateUserCols(user, "passwd", "salt"); err != nil { return fmt.Errorf("%v", err) } diff --git a/models/user.go b/models/user.go index 7c523f826..bbdec7452 100644 --- a/models/user.go +++ b/models/user.go @@ -157,7 +157,7 @@ func (u *User) SetLastLogin() { // UpdateDiffViewStyle updates the users diff view style func (u *User) UpdateDiffViewStyle(style string) error { u.DiffViewStyle = style - return UpdateUser(u) + return UpdateUserCols(u, "diff_view_style") } // AfterSet is invoked from XORM after setting the value of a field of this object. @@ -860,7 +860,9 @@ func updateUser(e Engine, u *User) error { if len(u.AvatarEmail) == 0 { u.AvatarEmail = u.Email } - u.Avatar = base.HashEmail(u.AvatarEmail) + if len(u.AvatarEmail) > 0 { + u.Avatar = base.HashEmail(u.AvatarEmail) + } } u.LowerName = strings.ToLower(u.Name) @@ -877,6 +879,29 @@ func UpdateUser(u *User) error { return updateUser(x, u) } +// UpdateUserCols update user according special columns +func UpdateUserCols(u *User, cols ...string) error { + // Organization does not need email + u.Email = strings.ToLower(u.Email) + if !u.IsOrganization() { + if len(u.AvatarEmail) == 0 { + u.AvatarEmail = u.Email + } + if len(u.AvatarEmail) > 0 { + u.Avatar = base.HashEmail(u.AvatarEmail) + } + } + + u.LowerName = strings.ToLower(u.Name) + u.Location = base.TruncateString(u.Location, 255) + u.Website = base.TruncateString(u.Website, 255) + u.Description = base.TruncateString(u.Description, 255) + + cols = append(cols, "updated_unix") + _, err := x.Id(u.ID).Cols(cols...).Update(u) + return err +} + // UpdateUserSetting updates user's settings. func UpdateUserSetting(u *User) error { if !u.IsOrganization() { @@ -1418,7 +1443,7 @@ func SyncExternalUsers() { } usr.IsActive = true - err = UpdateUser(usr) + err = UpdateUserCols(usr, "full_name", "email", "is_admin", "is_active") if err != nil { log.Error(4, "SyncExternalUsers[%s]: Error updating user %s: %v", s.Name, usr.Name, err) } @@ -1440,7 +1465,7 @@ func SyncExternalUsers() { log.Trace("SyncExternalUsers[%s]: Deactivating user %s", s.Name, usr.Name) usr.IsActive = false - err = UpdateUser(&usr) + err = UpdateUserCols(&usr, "is_active") if err != nil { log.Error(4, "SyncExternalUsers[%s]: Error deactivating user %s: %v", s.Name, usr.Name, err) } diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index e4a36b95c..ec55b9ebe 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -56,7 +56,7 @@ func Edit(ctx *context.APIContext, form api.EditOrgOption) { org.Description = form.Description org.Website = form.Website org.Location = form.Location - if err := models.UpdateUser(org); err != nil { + if err := models.UpdateUserCols(org, "full_name", "description", "website", "location"); err != nil { ctx.Error(500, "UpdateUser", err) return } diff --git a/routers/user/auth.go b/routers/user/auth.go index f1aa9d26a..b2caba0bb 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -340,8 +340,8 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR // Register last login u.SetLastLogin() - if err := models.UpdateUser(u); err != nil { - ctx.Handle(500, "UpdateUser", err) + if err := models.UpdateUserCols(u, "last_login_unix"); err != nil { + ctx.Handle(500, "UpdateUserCols", err) return } @@ -430,8 +430,8 @@ func handleOAuth2SignIn(u *models.User, gothUser goth.User, ctx *context.Context // Register last login u.SetLastLogin() - if err := models.UpdateUser(u); err != nil { - ctx.Handle(500, "UpdateUser", err) + if err := models.UpdateUserCols(u, "last_login_unix"); err != nil { + ctx.Handle(500, "UpdateUserCols", err) return } @@ -666,7 +666,8 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au if models.CountUsers() == 1 { u.IsAdmin = true u.IsActive = true - if err := models.UpdateUser(u); err != nil { + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { ctx.Handle(500, "UpdateUser", err) return } @@ -781,7 +782,8 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo if models.CountUsers() == 1 { u.IsAdmin = true u.IsActive = true - if err := models.UpdateUser(u); err != nil { + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { ctx.Handle(500, "UpdateUser", err) return } @@ -840,7 +842,7 @@ func Activate(ctx *context.Context) { ctx.Handle(500, "UpdateUser", err) return } - if err := models.UpdateUser(user); err != nil { + if err := models.UpdateUserCols(user, "is_active", "rands"); err != nil { if models.IsErrUserNotExist(err) { ctx.Error(404) } else { @@ -991,7 +993,7 @@ func ResetPasswdPost(ctx *context.Context) { return } u.EncodePasswd() - if err := models.UpdateUser(u); err != nil { + if err := models.UpdateUserCols(u, "passwd", "rands", "salt"); err != nil { ctx.Handle(500, "UpdateUser", err) return } diff --git a/routers/user/auth_openid.go b/routers/user/auth_openid.go index ff03e538f..dcc3fcf0f 100644 --- a/routers/user/auth_openid.go +++ b/routers/user/auth_openid.go @@ -404,7 +404,8 @@ func RegisterOpenIDPost(ctx *context.Context, cpt *captcha.Captcha, form auth.Si if models.CountUsers() == 1 { u.IsAdmin = true u.IsActive = true - if err := models.UpdateUser(u); err != nil { + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { ctx.Handle(500, "UpdateUser", err) return } diff --git a/routers/user/setting.go b/routers/user/setting.go index b6bd4ed5c..93376043e 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -156,7 +156,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm, ctxUser *mo } } - if err := models.UpdateUser(ctxUser); err != nil { + if err := models.UpdateUserCols(ctxUser, "avatar", "avatar_email", "use_custom_avatar"); err != nil { return fmt.Errorf("UpdateUser: %v", err) } @@ -221,7 +221,7 @@ func SettingsPasswordPost(ctx *context.Context, form auth.ChangePasswordForm) { return } ctx.User.EncodePasswd() - if err := models.UpdateUser(ctx.User); err != nil { + if err := models.UpdateUserCols(ctx.User, "salt", "passwd"); err != nil { ctx.Handle(500, "UpdateUser", err) return }