summaryrefslogtreecommitdiffstats
path: root/app/import.go
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-05-10 14:08:06 +0100
committerChristopher Speller <crspeller@gmail.com>2017-05-10 09:08:06 -0400
commita67898186175d9986b9e8cd8321afbc6fa84c8c6 (patch)
tree09d7be5f70dd2c0732a92ef06c322bd09506cdf3 /app/import.go
parent7a927c03e4cfe8f14d254219ec54f76c2349598e (diff)
downloadchat-a67898186175d9986b9e8cd8321afbc6fa84c8c6.tar.gz
chat-a67898186175d9986b9e8cd8321afbc6fa84c8c6.tar.bz2
chat-a67898186175d9986b9e8cd8321afbc6fa84c8c6.zip
PLT-6488: Reduce database queries in user bulk import. (#6371)
Diffstat (limited to 'app/import.go')
-rw-r--r--app/import.go104
1 files changed, 78 insertions, 26 deletions
diff --git a/app/import.go b/app/import.go
index eb51fd34e..156591c0b 100644
--- a/app/import.go
+++ b/app/import.go
@@ -408,26 +408,44 @@ func ImportUser(data *UserImportData, dryRun bool) *model.AppError {
return nil
}
+ // We want to avoid database writes if nothing has changed.
+ hasUserChanged := false
+ hasUserRolesChanged := false
+ hasUserAuthDataChanged := false
+ hasUserEmailVerifiedChanged := false
+
var user *model.User
if result := <-Srv.Store.User().GetByUsername(*data.Username); result.Err == nil {
user = result.Data.(*model.User)
} else {
user = &model.User{}
+ hasUserChanged = true
}
user.Username = *data.Username
- user.Email = *data.Email
+
+ if user.Email != *data.Email {
+ hasUserChanged = true
+ hasUserEmailVerifiedChanged = true // Changing the email resets email verified to false by default.
+ user.Email = *data.Email
+ }
var password string
var authService string
var authData *string
if data.AuthService != nil {
+ if user.AuthService != *data.AuthService {
+ hasUserAuthDataChanged = true
+ }
authService = *data.AuthService
}
// AuthData and Password are mutually exclusive.
if data.AuthData != nil {
+ if user.AuthData == nil || *user.AuthData != *data.AuthData {
+ hasUserAuthDataChanged = true
+ }
authData = data.AuthData
password = ""
} else if data.Password != nil {
@@ -445,36 +463,63 @@ func ImportUser(data *UserImportData, dryRun bool) *model.AppError {
// Automatically assume all emails are verified.
emailVerified := true
- user.EmailVerified = emailVerified
+ if user.EmailVerified != emailVerified {
+ user.EmailVerified = emailVerified
+ hasUserEmailVerifiedChanged = true
+ }
if data.Nickname != nil {
- user.Nickname = *data.Nickname
+ if user.Nickname != *data.Nickname {
+ user.Nickname = *data.Nickname
+ hasUserChanged = true
+ }
}
if data.FirstName != nil {
- user.FirstName = *data.FirstName
+ if user.FirstName != *data.FirstName {
+ user.FirstName = *data.FirstName
+ hasUserChanged = true
+ }
}
if data.LastName != nil {
- user.LastName = *data.LastName
+ if user.LastName != *data.LastName {
+ user.LastName = *data.LastName
+ hasUserChanged = true
+ }
}
if data.Position != nil {
- user.Position = *data.Position
+ if user.Position != *data.Position {
+ user.Position = *data.Position
+ hasUserChanged = true
+ }
}
if data.Locale != nil {
- user.Locale = *data.Locale
+ if user.Locale != *data.Locale {
+ user.Locale = *data.Locale
+ hasUserChanged = true
+ }
} else {
- user.Locale = *utils.Cfg.LocalizationSettings.DefaultClientLocale
+ if user.Locale != *utils.Cfg.LocalizationSettings.DefaultClientLocale {
+ user.Locale = *utils.Cfg.LocalizationSettings.DefaultClientLocale
+ hasUserChanged = true
+ }
}
var roles string
if data.Roles != nil {
- roles = *data.Roles
+ if user.Roles != *data.Roles {
+ roles = *data.Roles
+ hasUserRolesChanged = true
+ }
} else if len(user.Roles) == 0 {
// Set SYSTEM_USER roles on newly created users by default.
- roles = model.ROLE_SYSTEM_USER.Id
+ if user.Roles != model.ROLE_SYSTEM_USER.Id {
+ roles = model.ROLE_SYSTEM_USER.Id
+ hasUserRolesChanged = true
+ }
}
user.Roles = roles
@@ -483,24 +528,32 @@ func ImportUser(data *UserImportData, dryRun bool) *model.AppError {
return err
}
} else {
- if _, err := UpdateUser(user, false); err != nil {
- return err
+ if hasUserChanged {
+ if _, err := UpdateUser(user, false); err != nil {
+ return err
+ }
}
- if _, err := UpdateUserRoles(user.Id, roles); err != nil {
- return err
+ if hasUserRolesChanged {
+ if _, err := UpdateUserRoles(user.Id, roles); err != nil {
+ return err
+ }
}
if len(password) > 0 {
if err := UpdatePassword(user, password); err != nil {
return err
}
} else {
- if res := <-Srv.Store.User().UpdateAuthData(user.Id, authService, authData, user.Email, false); res.Err != nil {
- return res.Err
+ if hasUserAuthDataChanged {
+ if res := <-Srv.Store.User().UpdateAuthData(user.Id, authService, authData, user.Email, false); res.Err != nil {
+ return res.Err
+ }
}
}
if emailVerified {
- if err := VerifyUserEmail(user.Id); err != nil {
- return err
+ if hasUserEmailVerifiedChanged {
+ if err := VerifyUserEmail(user.Id); err != nil {
+ return err
+ }
}
}
}
@@ -603,13 +656,12 @@ func ImportUserTeams(username string, data *[]UserTeamImportData) *model.AppErro
roles = *tdata.Roles
}
- if _, err := GetTeamMember(team.Id, user.Id); err != nil {
- if _, err := joinUserToTeam(team, user); err != nil {
- return err
- }
+ if _, err := joinUserToTeam(team, user); err != nil {
+ return err
}
- if member, err := GetTeamMember(team.Id, user.Id); err != nil {
+ var member *model.TeamMember
+ if member, err = GetTeamMember(team.Id, user.Id); err != nil {
return err
} else {
if member.Roles != roles {
@@ -619,7 +671,7 @@ func ImportUserTeams(username string, data *[]UserTeamImportData) *model.AppErro
}
}
- if err := ImportUserChannels(user, team, tdata.Channels); err != nil {
+ if err := ImportUserChannels(user, team, member, tdata.Channels); err != nil {
return err
}
}
@@ -627,7 +679,7 @@ func ImportUserTeams(username string, data *[]UserTeamImportData) *model.AppErro
return nil
}
-func ImportUserChannels(user *model.User, team *model.Team, data *[]UserChannelImportData) *model.AppError {
+func ImportUserChannels(user *model.User, team *model.Team, teamMember *model.TeamMember, data *[]UserChannelImportData) *model.AppError {
if data == nil {
return nil
}
@@ -649,7 +701,7 @@ func ImportUserChannels(user *model.User, team *model.Team, data *[]UserChannelI
var member *model.ChannelMember
member, err = GetChannelMember(channel.Id, user.Id)
if err != nil {
- member, err = addUserToChannel(user, channel)
+ member, err = addUserToChannel(user, channel, teamMember)
if err != nil {
return err
}