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  }