github.com/jlevesy/mattermost-server@v5.3.2-0.20181003190404-7468f35cb0c8+incompatible/cmd/mattermost/commands/team.go (about) 1 // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package commands 5 6 import ( 7 "errors" 8 "fmt" 9 "sort" 10 11 "github.com/mattermost/mattermost-server/app" 12 "github.com/mattermost/mattermost-server/model" 13 "github.com/spf13/cobra" 14 ) 15 16 var TeamCmd = &cobra.Command{ 17 Use: "team", 18 Short: "Management of teams", 19 } 20 21 var TeamCreateCmd = &cobra.Command{ 22 Use: "create", 23 Short: "Create a team", 24 Long: `Create a team.`, 25 Example: ` team create --name mynewteam --display_name "My New Team" 26 team create --name private --display_name "My New Private Team" --private`, 27 RunE: createTeamCmdF, 28 } 29 30 var RemoveUsersCmd = &cobra.Command{ 31 Use: "remove [team] [users]", 32 Short: "Remove users from team", 33 Long: "Remove some users from team", 34 Example: " team remove myteam user@example.com username", 35 RunE: removeUsersCmdF, 36 } 37 38 var AddUsersCmd = &cobra.Command{ 39 Use: "add [team] [users]", 40 Short: "Add users to team", 41 Long: "Add some users to team", 42 Example: " team add myteam user@example.com username", 43 RunE: addUsersCmdF, 44 } 45 46 var DeleteTeamsCmd = &cobra.Command{ 47 Use: "delete [teams]", 48 Short: "Delete teams", 49 Long: `Permanently delete some teams. 50 Permanently deletes a team along with all related information including posts from the database.`, 51 Example: " team delete myteam", 52 RunE: deleteTeamsCmdF, 53 } 54 55 var ListTeamsCmd = &cobra.Command{ 56 Use: "list", 57 Short: "List all teams.", 58 Long: `List all teams on the server.`, 59 Example: " team list", 60 RunE: listTeamsCmdF, 61 } 62 63 var SearchTeamCmd = &cobra.Command{ 64 Use: "search [teams]", 65 Short: "Search for teams", 66 Long: "Search for teams based on name", 67 Example: " team search team1", 68 Args: cobra.MinimumNArgs(1), 69 RunE: searchTeamCmdF, 70 } 71 72 func init() { 73 TeamCreateCmd.Flags().String("name", "", "Team Name") 74 TeamCreateCmd.Flags().String("display_name", "", "Team Display Name") 75 TeamCreateCmd.Flags().Bool("private", false, "Create a private team.") 76 TeamCreateCmd.Flags().String("email", "", "Administrator Email (anyone with this email is automatically a team admin)") 77 78 DeleteTeamsCmd.Flags().Bool("confirm", false, "Confirm you really want to delete the team and a DB backup has been performed.") 79 80 TeamCmd.AddCommand( 81 TeamCreateCmd, 82 RemoveUsersCmd, 83 AddUsersCmd, 84 DeleteTeamsCmd, 85 ListTeamsCmd, 86 SearchTeamCmd, 87 ) 88 RootCmd.AddCommand(TeamCmd) 89 } 90 91 func createTeamCmdF(command *cobra.Command, args []string) error { 92 a, err := InitDBCommandContextCobra(command) 93 if err != nil { 94 return err 95 } 96 defer a.Shutdown() 97 98 name, errn := command.Flags().GetString("name") 99 if errn != nil || name == "" { 100 return errors.New("Name is required") 101 } 102 displayname, errdn := command.Flags().GetString("display_name") 103 if errdn != nil || displayname == "" { 104 return errors.New("Display Name is required") 105 } 106 email, _ := command.Flags().GetString("email") 107 useprivate, _ := command.Flags().GetBool("private") 108 109 teamType := model.TEAM_OPEN 110 if useprivate { 111 teamType = model.TEAM_INVITE 112 } 113 114 team := &model.Team{ 115 Name: name, 116 DisplayName: displayname, 117 Email: email, 118 Type: teamType, 119 } 120 121 if _, err := a.CreateTeam(team); err != nil { 122 return errors.New("Team creation failed: " + err.Error()) 123 } 124 125 return nil 126 } 127 128 func removeUsersCmdF(command *cobra.Command, args []string) error { 129 a, err := InitDBCommandContextCobra(command) 130 if err != nil { 131 return err 132 } 133 defer a.Shutdown() 134 135 if len(args) < 2 { 136 return errors.New("Not enough arguments.") 137 } 138 139 team := getTeamFromTeamArg(a, args[0]) 140 if team == nil { 141 return errors.New("Unable to find team '" + args[0] + "'") 142 } 143 144 users := getUsersFromUserArgs(a, args[1:]) 145 for i, user := range users { 146 removeUserFromTeam(a, team, user, args[i+1]) 147 } 148 149 return nil 150 } 151 152 func removeUserFromTeam(a *app.App, team *model.Team, user *model.User, userArg string) { 153 if user == nil { 154 CommandPrintErrorln("Can't find user '" + userArg + "'") 155 return 156 } 157 if err := a.LeaveTeam(team, user, ""); err != nil { 158 CommandPrintErrorln("Unable to remove '" + userArg + "' from " + team.Name + ". Error: " + err.Error()) 159 } 160 } 161 162 func addUsersCmdF(command *cobra.Command, args []string) error { 163 a, err := InitDBCommandContextCobra(command) 164 if err != nil { 165 return err 166 } 167 defer a.Shutdown() 168 169 if len(args) < 2 { 170 return errors.New("Not enough arguments.") 171 } 172 173 team := getTeamFromTeamArg(a, args[0]) 174 if team == nil { 175 return errors.New("Unable to find team '" + args[0] + "'") 176 } 177 178 users := getUsersFromUserArgs(a, args[1:]) 179 for i, user := range users { 180 addUserToTeam(a, team, user, args[i+1]) 181 } 182 183 return nil 184 } 185 186 func addUserToTeam(a *app.App, team *model.Team, user *model.User, userArg string) { 187 if user == nil { 188 CommandPrintErrorln("Can't find user '" + userArg + "'") 189 return 190 } 191 if err := a.JoinUserToTeam(team, user, ""); err != nil { 192 CommandPrintErrorln("Unable to add '" + userArg + "' to " + team.Name) 193 } 194 } 195 196 func deleteTeamsCmdF(command *cobra.Command, args []string) error { 197 a, err := InitDBCommandContextCobra(command) 198 if err != nil { 199 return err 200 } 201 defer a.Shutdown() 202 203 if len(args) < 1 { 204 return errors.New("Not enough arguments.") 205 } 206 207 confirmFlag, _ := command.Flags().GetBool("confirm") 208 if !confirmFlag { 209 var confirm string 210 CommandPrettyPrintln("Have you performed a database backup? (YES/NO): ") 211 fmt.Scanln(&confirm) 212 213 if confirm != "YES" { 214 return errors.New("ABORTED: You did not answer YES exactly, in all capitals.") 215 } 216 CommandPrettyPrintln("Are you sure you want to delete the teams specified? All data will be permanently deleted? (YES/NO): ") 217 fmt.Scanln(&confirm) 218 if confirm != "YES" { 219 return errors.New("ABORTED: You did not answer YES exactly, in all capitals.") 220 } 221 } 222 223 teams := getTeamsFromTeamArgs(a, args) 224 for i, team := range teams { 225 if team == nil { 226 CommandPrintErrorln("Unable to find team '" + args[i] + "'") 227 continue 228 } 229 if err := deleteTeam(a, team); err != nil { 230 CommandPrintErrorln("Unable to delete team '" + team.Name + "' error: " + err.Error()) 231 } else { 232 CommandPrettyPrintln("Deleted team '" + team.Name + "'") 233 } 234 } 235 236 return nil 237 } 238 239 func deleteTeam(a *app.App, team *model.Team) *model.AppError { 240 return a.PermanentDeleteTeam(team) 241 } 242 243 func listTeamsCmdF(command *cobra.Command, args []string) error { 244 a, err := InitDBCommandContextCobra(command) 245 if err != nil { 246 return err 247 } 248 defer a.Shutdown() 249 250 teams, err2 := a.GetAllTeams() 251 if err2 != nil { 252 return err2 253 } 254 255 for _, team := range teams { 256 CommandPrettyPrintln(team.Name) 257 } 258 259 return nil 260 } 261 262 func searchTeamCmdF(command *cobra.Command, args []string) error { 263 a, err := InitDBCommandContextCobra(command) 264 if err != nil { 265 return err 266 } 267 defer a.Shutdown() 268 269 var teams []*model.Team 270 271 for _, searchTerm := range args { 272 foundTeams, err := a.SearchAllTeams(searchTerm) 273 if err != nil { 274 return err 275 } 276 teams = append(teams, foundTeams...) 277 } 278 279 sortedTeams := removeDuplicatesAndSortTeams(teams) 280 281 for _, team := range sortedTeams { 282 CommandPrettyPrintln(team.Name + ": " + team.DisplayName + " (" + team.Id + ")") 283 } 284 285 return nil 286 } 287 288 // Removes duplicates and sorts teams by name 289 func removeDuplicatesAndSortTeams(teams []*model.Team) []*model.Team { 290 keys := make(map[string]bool) 291 result := []*model.Team{} 292 for _, team := range teams { 293 if _, value := keys[team.Name]; !value { 294 keys[team.Name] = true 295 result = append(result, team) 296 } 297 } 298 sort.Slice(result, func(i, j int) bool { 299 return result[i].Name < result[j].Name 300 }) 301 return result 302 }