summaryrefslogtreecommitdiffstats
path: root/app/import.go
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-02-02 15:03:41 +0000
committerHarrison Healey <harrisonmhealey@gmail.com>2017-02-02 10:03:41 -0500
commit28e445c6e08d0aa931fcf0be0098dfd47aa87eb4 (patch)
tree3b995da5fb26e9fad364af2a8872527f8e5fa156 /app/import.go
parente9d6287dc8fefc9ea6fa1c49743364218a188abd (diff)
downloadchat-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.go144
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
}