diff options
author | George Goldberg <george@gberg.me> | 2017-02-02 15:03:41 +0000 |
---|---|---|
committer | Harrison Healey <harrisonmhealey@gmail.com> | 2017-02-02 10:03:41 -0500 |
commit | 28e445c6e08d0aa931fcf0be0098dfd47aa87eb4 (patch) | |
tree | 3b995da5fb26e9fad364af2a8872527f8e5fa156 /app/import.go | |
parent | e9d6287dc8fefc9ea6fa1c49743364218a188abd (diff) | |
download | chat-28e445c6e08d0aa931fcf0be0098dfd47aa87eb4.tar.gz chat-28e445c6e08d0aa931fcf0be0098dfd47aa87eb4.tar.bz2 chat-28e445c6e08d0aa931fcf0be0098dfd47aa87eb4.zip |
PLT-5407: Bulk importing of User memberships. (#5273)
Diffstat (limited to 'app/import.go')
-rw-r--r-- | app/import.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/app/import.go b/app/import.go index e99dd79dc..4a27bcd7e 100644 --- a/app/import.go +++ b/app/import.go @@ -55,6 +55,19 @@ type UserImportData struct { Position *string `json:"position"` Roles *string `json:"roles"` Locale *string `json:"locale"` + + Teams *[]UserTeamImportData `json:"teams"` +} + +type UserTeamImportData struct { + Name *string `json:"name"` + Roles *string `json:"roles"` + Channels *[]UserChannelImportData `json:"channels"` +} + +type UserChannelImportData struct { + Name *string `json:"name"` + Roles *string `json:"roles"` } // @@ -376,6 +389,91 @@ func ImportUser(data *UserImportData, dryRun bool) *model.AppError { } } + return ImportUserTeams(*data.Username, data.Teams) +} + +func ImportUserTeams(username string, data *[]UserTeamImportData) *model.AppError { + if data == nil { + return nil + } + + user, err := GetUserByUsername(username) + if err != nil { + return err + } + + for _, tdata := range *data { + team, err := GetTeamByName(*tdata.Name) + if err != nil { + return err + } + + var roles string + if tdata.Roles == nil { + roles = model.ROLE_TEAM_USER.Id + } else { + roles = *tdata.Roles + } + + if _, err := GetTeamMember(team.Id, user.Id); err != nil { + if _, err := joinUserToTeam(team, user); err != nil { + return err + } + } + + if member, err := GetTeamMember(team.Id, user.Id); err != nil { + return err + } else { + if member.Roles != roles { + if _, err := UpdateTeamMemberRoles(team.Id, user.Id, roles); err != nil { + return err + } + } + } + + if err := ImportUserChannels(user, team, tdata.Channels); err != nil { + return err + } + } + + return nil +} + +func ImportUserChannels(user *model.User, team *model.Team, data *[]UserChannelImportData) *model.AppError { + if data == nil { + return nil + } + + // Loop through all channels. + for _, cdata := range *data { + channel, err := GetChannelByName(*cdata.Name, team.Id) + if err != nil { + return err + } + + var roles string + if cdata.Roles == nil { + roles = model.ROLE_CHANNEL_USER.Id + } else { + roles = *cdata.Roles + } + + var member *model.ChannelMember + member, err = GetChannelMember(channel.Id, user.Id) + if err != nil { + member, err = addUserToChannel(user, channel) + if err != nil { + return err + } + } + + if member.Roles != roles { + if _, err := UpdateChannelMemberRoles(channel.Id, user.Id, roles); err != nil { + return err + } + } + } + return nil } @@ -421,6 +519,52 @@ func validateUserImportData(data *UserImportData) *model.AppError { return model.NewAppError("BulkImport", "app.import.validate_user_import_data.roles_invalid.error", nil, "", http.StatusBadRequest) } + if data.Teams != nil { + return validateUserTeamsImportData(data.Teams) + } else { + return nil + } +} + +func validateUserTeamsImportData(data *[]UserTeamImportData) *model.AppError { + if data == nil { + return nil + } + + for _, tdata := range *data { + if tdata.Name == nil { + return model.NewAppError("BulkImport", "app.import.validate_user_teams_import_data.team_name_missing.error", nil, "", http.StatusBadRequest) + } + + if tdata.Roles != nil && !model.IsValidUserRoles(*tdata.Roles) { + return model.NewAppError("BulkImport", "app.import.validate_user_teams_import_data.invalid_roles.error", nil, "", http.StatusBadRequest) + } + + if tdata.Channels != nil { + if err := validateUserChannelsImportData(tdata.Channels); err != nil { + return err + } + } + } + + return nil +} + +func validateUserChannelsImportData(data *[]UserChannelImportData) *model.AppError { + if data == nil { + return nil + } + + for _, cdata := range *data { + if cdata.Name == nil { + return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.channel_name_missing.error", nil, "", http.StatusBadRequest) + } + + if cdata.Roles != nil && !model.IsValidUserRoles(*cdata.Roles) { + return model.NewAppError("BulkImport", "app.import.validate_user_channels_import_data.invalid_roles.error", nil, "", http.StatusBadRequest) + } + } + return nil } |