github.com/jfrerich/mattermost-server@v5.8.0-rc2+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 Args: cobra.MinimumNArgs(2), 36 RunE: removeUsersCmdF, 37 } 38 39 var AddUsersCmd = &cobra.Command{ 40 Use: "add [team] [users]", 41 Short: "Add users to team", 42 Long: "Add some users to team", 43 Example: " team add myteam user@example.com username", 44 Args: cobra.MinimumNArgs(2), 45 RunE: addUsersCmdF, 46 } 47 48 var DeleteTeamsCmd = &cobra.Command{ 49 Use: "delete [teams]", 50 Short: "Delete teams", 51 Long: `Permanently delete some teams. 52 Permanently deletes a team along with all related information including posts from the database.`, 53 Example: " team delete myteam", 54 Args: cobra.MinimumNArgs(1), 55 RunE: deleteTeamsCmdF, 56 } 57 58 var ListTeamsCmd = &cobra.Command{ 59 Use: "list", 60 Short: "List all teams.", 61 Long: `List all teams on the server.`, 62 Example: " team list", 63 RunE: listTeamsCmdF, 64 } 65 66 var SearchTeamCmd = &cobra.Command{ 67 Use: "search [teams]", 68 Short: "Search for teams", 69 Long: "Search for teams based on name", 70 Example: " team search team1", 71 Args: cobra.MinimumNArgs(1), 72 RunE: searchTeamCmdF, 73 } 74 75 var ArchiveTeamCmd = &cobra.Command{ 76 Use: "archive [teams]", 77 Short: "Archive teams", 78 Long: "Archive teams based on name", 79 Example: " team archive team1", 80 Args: cobra.MinimumNArgs(1), 81 RunE: archiveTeamCmdF, 82 } 83 84 var RestoreTeamsCmd = &cobra.Command{ 85 Use: "restore [teams]", 86 Short: "Restore some teams", 87 Long: `Restore a previously deleted team`, 88 Example: " team restore myteam", 89 Args: cobra.MinimumNArgs(1), 90 RunE: restoreTeamsCmdF, 91 } 92 93 func init() { 94 TeamCreateCmd.Flags().String("name", "", "Team Name") 95 TeamCreateCmd.Flags().String("display_name", "", "Team Display Name") 96 TeamCreateCmd.Flags().Bool("private", false, "Create a private team.") 97 TeamCreateCmd.Flags().String("email", "", "Administrator Email (anyone with this email is automatically a team admin)") 98 99 DeleteTeamsCmd.Flags().Bool("confirm", false, "Confirm you really want to delete the team and a DB backup has been performed.") 100 101 TeamCmd.AddCommand( 102 TeamCreateCmd, 103 RemoveUsersCmd, 104 AddUsersCmd, 105 DeleteTeamsCmd, 106 ListTeamsCmd, 107 SearchTeamCmd, 108 ArchiveTeamCmd, 109 RestoreTeamsCmd, 110 ) 111 RootCmd.AddCommand(TeamCmd) 112 } 113 114 func createTeamCmdF(command *cobra.Command, args []string) error { 115 a, err := InitDBCommandContextCobra(command) 116 if err != nil { 117 return err 118 } 119 defer a.Shutdown() 120 121 name, errn := command.Flags().GetString("name") 122 if errn != nil || name == "" { 123 return errors.New("Name is required") 124 } 125 displayname, errdn := command.Flags().GetString("display_name") 126 if errdn != nil || displayname == "" { 127 return errors.New("Display Name is required") 128 } 129 email, _ := command.Flags().GetString("email") 130 useprivate, _ := command.Flags().GetBool("private") 131 132 teamType := model.TEAM_OPEN 133 if useprivate { 134 teamType = model.TEAM_INVITE 135 } 136 137 team := &model.Team{ 138 Name: name, 139 DisplayName: displayname, 140 Email: email, 141 Type: teamType, 142 } 143 144 if _, err := a.CreateTeam(team); err != nil { 145 return errors.New("Team creation failed: " + err.Error()) 146 } 147 148 return nil 149 } 150 151 func removeUsersCmdF(command *cobra.Command, args []string) error { 152 a, err := InitDBCommandContextCobra(command) 153 if err != nil { 154 return err 155 } 156 defer a.Shutdown() 157 158 team := getTeamFromTeamArg(a, args[0]) 159 if team == nil { 160 return errors.New("Unable to find team '" + args[0] + "'") 161 } 162 163 users := getUsersFromUserArgs(a, args[1:]) 164 for i, user := range users { 165 removeUserFromTeam(a, team, user, args[i+1]) 166 } 167 168 return nil 169 } 170 171 func removeUserFromTeam(a *app.App, team *model.Team, user *model.User, userArg string) { 172 if user == nil { 173 CommandPrintErrorln("Can't find user '" + userArg + "'") 174 return 175 } 176 if err := a.LeaveTeam(team, user, ""); err != nil { 177 CommandPrintErrorln("Unable to remove '" + userArg + "' from " + team.Name + ". Error: " + err.Error()) 178 } 179 } 180 181 func addUsersCmdF(command *cobra.Command, args []string) error { 182 a, err := InitDBCommandContextCobra(command) 183 if err != nil { 184 return err 185 } 186 defer a.Shutdown() 187 188 team := getTeamFromTeamArg(a, args[0]) 189 if team == nil { 190 return errors.New("Unable to find team '" + args[0] + "'") 191 } 192 193 users := getUsersFromUserArgs(a, args[1:]) 194 for i, user := range users { 195 addUserToTeam(a, team, user, args[i+1]) 196 } 197 198 return nil 199 } 200 201 func addUserToTeam(a *app.App, team *model.Team, user *model.User, userArg string) { 202 if user == nil { 203 CommandPrintErrorln("Can't find user '" + userArg + "'") 204 return 205 } 206 if err := a.JoinUserToTeam(team, user, ""); err != nil { 207 CommandPrintErrorln("Unable to add '" + userArg + "' to " + team.Name) 208 } 209 } 210 211 func deleteTeamsCmdF(command *cobra.Command, args []string) error { 212 a, err := InitDBCommandContextCobra(command) 213 if err != nil { 214 return err 215 } 216 defer a.Shutdown() 217 218 confirmFlag, _ := command.Flags().GetBool("confirm") 219 if !confirmFlag { 220 var confirm string 221 CommandPrettyPrintln("Have you performed a database backup? (YES/NO): ") 222 fmt.Scanln(&confirm) 223 224 if confirm != "YES" { 225 return errors.New("ABORTED: You did not answer YES exactly, in all capitals.") 226 } 227 CommandPrettyPrintln("Are you sure you want to delete the teams specified? All data will be permanently deleted? (YES/NO): ") 228 fmt.Scanln(&confirm) 229 if confirm != "YES" { 230 return errors.New("ABORTED: You did not answer YES exactly, in all capitals.") 231 } 232 } 233 234 teams := getTeamsFromTeamArgs(a, args) 235 for i, team := range teams { 236 if team == nil { 237 CommandPrintErrorln("Unable to find team '" + args[i] + "'") 238 continue 239 } 240 if err := deleteTeam(a, team); err != nil { 241 CommandPrintErrorln("Unable to delete team '" + team.Name + "' error: " + err.Error()) 242 } else { 243 CommandPrettyPrintln("Deleted team '" + team.Name + "'") 244 } 245 } 246 247 return nil 248 } 249 250 func deleteTeam(a *app.App, team *model.Team) *model.AppError { 251 return a.PermanentDeleteTeam(team) 252 } 253 254 func listTeamsCmdF(command *cobra.Command, args []string) error { 255 a, err := InitDBCommandContextCobra(command) 256 if err != nil { 257 return err 258 } 259 defer a.Shutdown() 260 261 teams, err2 := a.GetAllTeams() 262 if err2 != nil { 263 return err2 264 } 265 266 for _, team := range teams { 267 if team.DeleteAt > 0 { 268 CommandPrettyPrintln(team.Name + " (archived)") 269 } else { 270 CommandPrettyPrintln(team.Name) 271 } 272 } 273 274 return nil 275 } 276 277 func searchTeamCmdF(command *cobra.Command, args []string) error { 278 a, err := InitDBCommandContextCobra(command) 279 if err != nil { 280 return err 281 } 282 defer a.Shutdown() 283 284 var teams []*model.Team 285 286 for _, searchTerm := range args { 287 foundTeams, err := a.SearchAllTeams(searchTerm) 288 if err != nil { 289 return err 290 } 291 teams = append(teams, foundTeams...) 292 } 293 294 sortedTeams := removeDuplicatesAndSortTeams(teams) 295 296 for _, team := range sortedTeams { 297 if team.DeleteAt > 0 { 298 CommandPrettyPrintln(team.Name + ": " + team.DisplayName + " (" + team.Id + ")" + " (archived)") 299 } else { 300 CommandPrettyPrintln(team.Name + ": " + team.DisplayName + " (" + team.Id + ")") 301 } 302 } 303 304 return nil 305 } 306 307 // Restores archived teams by name 308 func restoreTeamsCmdF(command *cobra.Command, args []string) error { 309 a, err := InitDBCommandContextCobra(command) 310 if err != nil { 311 return err 312 } 313 defer a.Shutdown() 314 315 teams := getTeamsFromTeamArgs(a, args) 316 for i, team := range teams { 317 if team == nil { 318 CommandPrintErrorln("Unable to find team '" + args[i] + "'") 319 continue 320 } 321 err := a.RestoreTeam(team.Id) 322 if err != nil { 323 CommandPrintErrorln("Unable to restore team '" + team.Name + "' error: " + err.Error()) 324 } 325 } 326 return nil 327 } 328 329 // Removes duplicates and sorts teams by name 330 func removeDuplicatesAndSortTeams(teams []*model.Team) []*model.Team { 331 keys := make(map[string]bool) 332 result := []*model.Team{} 333 for _, team := range teams { 334 if _, value := keys[team.Name]; !value { 335 keys[team.Name] = true 336 result = append(result, team) 337 } 338 } 339 sort.Slice(result, func(i, j int) bool { 340 return result[i].Name < result[j].Name 341 }) 342 return result 343 } 344 345 func archiveTeamCmdF(command *cobra.Command, args []string) error { 346 a, err := InitDBCommandContextCobra(command) 347 if err != nil { 348 return err 349 } 350 defer a.Shutdown() 351 352 foundTeams := getTeamsFromTeamArgs(a, args) 353 for i, team := range foundTeams { 354 if team == nil { 355 CommandPrintErrorln("Unable to find team '" + args[i] + "'") 356 continue 357 } 358 if err := a.SoftDeleteTeam(team.Id); err != nil { 359 CommandPrintErrorln("Unable to archive team '"+team.Name+"' error: ", err) 360 } 361 } 362 363 return nil 364 }