From 3716918c57b7b075676334ab4617ffea619704cc Mon Sep 17 00:00:00 2001 From: Dmytro Chukmasov <35612129+dchukmasov@users.noreply.github.com> Date: Wed, 6 Mar 2019 19:48:49 +0200 Subject: [PATCH] [MM-12365] Create CLI command "team rename" (#9764) (#10083) Allow renaming teams like in `channel rename` command Example: `team rename myteam newteamname --display_name "My New Team Name` --- app/team.go | 28 ++++++++++++ cmd/mattermost/commands/team.go | 48 ++++++++++++++++++++ cmd/mattermost/commands/team_test.go | 67 ++++++++++++++++++++++++++++ store/sqlstore/team_store.go | 1 - 4 files changed, 143 insertions(+), 1 deletion(-) diff --git a/app/team.go b/app/team.go index c862c22ef0..7425238766 100644 --- a/app/team.go +++ b/app/team.go @@ -142,6 +142,34 @@ func (a *App) updateTeamUnsanitized(team *model.Team) (*model.Team, *model.AppEr return result.Data.(*model.Team), nil } +// RenameTeam is used to rename the team Name and the DisplayName fields +func (a *App) RenameTeam(team *model.Team, newTeamName string, newDisplayName string) (*model.Team, *model.AppError) { + + // check if name is occupied + _, errnf := a.GetTeamByName(newTeamName) + + // "-" can be used as a newTeamName if only DisplayName change is wanted + if errnf == nil && newTeamName != "-" { + errbody := fmt.Sprintf("team with name %s already exists", newTeamName) + return nil, model.NewAppError("RenameTeam", "app.team.rename_team.name_occupied", nil, errbody, http.StatusBadRequest) + } + + if newTeamName != "-" { + team.Name = newTeamName + } + + if newDisplayName != "" { + team.DisplayName = newDisplayName + } + + newTeam, err := a.updateTeamUnsanitized(team) + if err != nil { + return nil, err + } + + return newTeam, nil +} + func (a *App) UpdateTeamScheme(team *model.Team) (*model.Team, *model.AppError) { oldTeam, err := a.GetTeam(team.Id) if err != nil { diff --git a/cmd/mattermost/commands/team.go b/cmd/mattermost/commands/team.go index 8a63ac1895..0fbeaada6a 100644 --- a/cmd/mattermost/commands/team.go +++ b/cmd/mattermost/commands/team.go @@ -90,6 +90,16 @@ var RestoreTeamsCmd = &cobra.Command{ RunE: restoreTeamsCmdF, } +var TeamRenameCmd = &cobra.Command{ + Use: "rename", + Short: "Rename a team", + Long: `Rename a team.`, + Example: ` team rename myteam newteamname --display_name "My New Team Name" + team rename myteam - --display_name "My New Team Name"`, + Args: cobra.MinimumNArgs(2), + RunE: renameTeamCmdF, +} + func init() { TeamCreateCmd.Flags().String("name", "", "Team Name") TeamCreateCmd.Flags().String("display_name", "", "Team Display Name") @@ -98,6 +108,8 @@ func init() { DeleteTeamsCmd.Flags().Bool("confirm", false, "Confirm you really want to delete the team and a DB backup has been performed.") + TeamRenameCmd.Flags().String("display_name", "", "Team Display Name") + TeamCmd.AddCommand( TeamCreateCmd, RemoveUsersCmd, @@ -107,6 +119,7 @@ func init() { SearchTeamCmd, ArchiveTeamCmd, RestoreTeamsCmd, + TeamRenameCmd, ) RootCmd.AddCommand(TeamCmd) } @@ -362,3 +375,38 @@ func archiveTeamCmdF(command *cobra.Command, args []string) error { return nil } + +func renameTeamCmdF(command *cobra.Command, args []string) error { + + a, err := InitDBCommandContextCobra(command) + if err != nil { + return err + } + defer a.Shutdown() + + team := getTeamFromTeamArg(a, args[0]) + if team == nil { + return errors.New("Unable to find team '" + args[0] + "'") + } + + var newDisplayName, newTeamName string + + newTeamName = args[1] + + // let user use old team Name when only Display Name change is wanted + if newTeamName == team.Name { + newTeamName = "-" + } + + newDisplayName, errdn := command.Flags().GetString("display_name") + if errdn != nil { + return errdn + } + + _, errrt := a.RenameTeam(team, newTeamName, newDisplayName) + if errrt != nil { + CommandPrintErrorln("Unable to rename team to '"+newTeamName+"' error: ", errrt) + } + + return nil +} diff --git a/cmd/mattermost/commands/team_test.go b/cmd/mattermost/commands/team_test.go index 9d970b897a..13987c2b66 100644 --- a/cmd/mattermost/commands/team_test.go +++ b/cmd/mattermost/commands/team_test.go @@ -205,3 +205,70 @@ func TestRestoreTeams(t *testing.T) { require.True(t, found) } + +func TestRenameTeam(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + team := th.CreateTeam() + + newTeamName := "newteamnamex3" + newDisplayName := "New Display NameX" + + th.CheckCommand(t, "team", "rename", team.Name, newTeamName, "--display_name", newDisplayName) + + // Get the team from the DB + updatedTeam, _ := th.App.GetTeam(team.Id) + + if updatedTeam.Name != newTeamName { + t.Fatal("failed renaming team") + } + + if updatedTeam.DisplayName != newDisplayName { + t.Fatal("failed updating team display name") + } + + // Try to rename to occupied name + team2 := th.CreateTeam() + n := team2.Name + dn := team2.DisplayName + + th.CheckCommand(t, "team", "rename", team2.Name, newTeamName, "--display_name", newDisplayName) + + // No renaming should have occured + if team2.Name != n { + t.Fatal("team was renamed when it should have not been") + } + + if team2.DisplayName != dn { + t.Fatal("team display name was changed when it should have not been") + } + + // Try to change only Display Name + team3 := th.CreateTeam() + + // trying to change only Display Name (using "-" as a new team name) + th.CheckCommand(t, "team", "rename", team3.Name, "-", "--display_name", newDisplayName) + + // Get the team from the DB + updatedTeam, _ = th.App.GetTeam(team3.Id) + + if updatedTeam.Name == "-" { + t.Fatal("team was renamed to `-` but only display name should have been changed") + } + + if updatedTeam.DisplayName != newDisplayName { + t.Fatal("team Display Name was not properly updated") + } + + // now try to change Display Name using old team name + th.CheckCommand(t, "team", "rename", team3.Name, team3.Name, "--display_name", "Brand New DName") + + // Get the team from the DB + updatedTeam, _ = th.App.GetTeam(team3.Id) + + if updatedTeam.DisplayName != "Brand New DName" { + t.Fatal("team Display Name was not properly updated") + } + +} diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 5a3fba27da..fe29628d68 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -216,7 +216,6 @@ func (s SqlTeamStore) Update(team *model.Team) store.StoreChannel { oldTeam := oldResult.(*model.Team) team.CreateAt = oldTeam.CreateAt team.UpdateAt = model.GetMillis() - team.Name = oldTeam.Name count, err := s.GetMaster().Update(team) if err != nil {