diff --git a/cmd/collaborators/add.go b/cmd/collaborators/add.go index c0b07800..7a0db5ed 100644 --- a/cmd/collaborators/add.go +++ b/cmd/collaborators/add.go @@ -22,7 +22,6 @@ import ( "github.com/opentracing/opentracing-go" "github.com/slackapi/slack-cli/internal/cmdutil" - "github.com/slackapi/slack-cli/internal/experiment" "github.com/slackapi/slack-cli/internal/iostreams" "github.com/slackapi/slack-cli/internal/prompts" "github.com/slackapi/slack-cli/internal/shared" @@ -62,8 +61,11 @@ func NewAddCommand(clients *shared.ClientFactory) *cobra.Command { return runAddCommandFunc(ctx, clients, cmd, args) }, } - cmd.Flags().StringVarP(&addFlags.permissionType, "permission-type", "P", "", "collaborator permission type: reader, owner") - cmd.Flag("permission-type").Hidden = true + cmd.Flags().StringVarP(&addFlags.permissionType, "permission-type", "P", string(types.OWNER), fmt.Sprintf( + "collaborator permission type\n(\"%s\" or \"%s\")", + string(types.OWNER), + string(types.READER), + )) return cmd } @@ -87,7 +89,7 @@ func runAddCommandFunc(ctx context.Context, clients *shared.ClientFactory, cmd * } err = clients.API().AddCollaborator(ctx, selection.Auth.Token, selection.App.AppID, slackUser) if err != nil { - if clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) && strings.Contains(err.Error(), "user_already_owner") { + if strings.Contains(err.Error(), "user_already_owner") { cmd.Println() cmd.Println(style.Sectionf(style.TextSection{ Emoji: "bulb", @@ -123,14 +125,15 @@ func promptCollaboratorsAdd( if err != nil { return types.SlackUser{}, err } + switch clients.Config.Flags.Lookup("permission-type").Changed { case true: slackUser.PermissionType, err = promptCollaboratorsAddPermissionFlags(ctx, clients, addFlags.permissionType) + if err != nil { + return types.SlackUser{}, err + } default: - slackUser.PermissionType, err = promptCollaboratorsAddPermissionPrompts(ctx, clients) - } - if err != nil { - return types.SlackUser{}, err + slackUser.PermissionType = types.OWNER } return slackUser, nil } @@ -181,40 +184,7 @@ func promptCollaboratorsAddSlackUserPrompts( return slackUser, nil } -// promptCollaboratorsAddPermissionPrompts gathers the collaborator permission -// from selection if the experiment allows -func promptCollaboratorsAddPermissionPrompts( - ctx context.Context, - clients *shared.ClientFactory, -) ( - permission types.AppCollaboratorPermission, - err error, -) { - switch clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) { - case false: - return types.OWNER, nil - default: - permissionLabels := []string{ - "owner", - "reader", - } - response, err := clients.IO.SelectPrompt( - ctx, - "Decide the collaborator permission", - permissionLabels, - iostreams.SelectPromptConfig{ - Required: true, - }, - ) - if err != nil { - return "", err - } - return types.StringToAppCollaboratorPermission(response.Option) - } -} - -// promptCollaboratorsAddPermissionFlags gathers the collaborator permission -// from flags if the experiment allows +// promptCollaboratorsAddPermissionFlags fetches collaborator permission from the flag func promptCollaboratorsAddPermissionFlags( ctx context.Context, clients *shared.ClientFactory, @@ -223,19 +193,7 @@ func promptCollaboratorsAddPermissionFlags( permission types.AppCollaboratorPermission, err error, ) { - switch clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) { - case true: - return types.StringToAppCollaboratorPermission(addFlags.permissionType) - default: - clients.IO.PrintInfo(ctx, false, "\n%s", style.Sectionf(style.TextSection{ - Emoji: "construction", - Text: fmt.Sprintf("This command is under construction. Use at your own risk %s", style.Emoji("skull")), - Secondary: []string{ - fmt.Sprintf("Bypass this message with the %s flag", style.Highlight("--experiment read-only-collaborators")), - }, - })) - return "", slackerror.New(slackerror.ErrMissingExperiment) - } + return types.StringToAppCollaboratorPermission(addFlags.permissionType) } // printCollaboratorsAddSuccess outputs a message when addition is done diff --git a/cmd/collaborators/add_test.go b/cmd/collaborators/add_test.go index 69139d99..2a8b12dd 100644 --- a/cmd/collaborators/add_test.go +++ b/cmd/collaborators/add_test.go @@ -37,9 +37,6 @@ func TestAddCommand(t *testing.T) { appSelectMock := prompts.NewAppSelectMock() appSelectPromptFunc = appSelectMock.AppSelectPrompt appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil) - // Set experiment flag - cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, "read-only-collaborators") - cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug) // Mock API call cm.API.On("AddCollaborator", mock.Anything, mock.Anything, "A123", @@ -61,9 +58,6 @@ func TestAddCommand(t *testing.T) { appSelectMock := prompts.NewAppSelectMock() appSelectPromptFunc = appSelectMock.AppSelectPrompt appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil) - // Set experiment flag - cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, "read-only-collaborators") - cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug) // Mock API call cm.API.On("AddCollaborator", mock.Anything, mock.Anything, "A123", diff --git a/cmd/collaborators/update.go b/cmd/collaborators/update.go index 78e056bb..cd8beebe 100644 --- a/cmd/collaborators/update.go +++ b/cmd/collaborators/update.go @@ -20,7 +20,6 @@ import ( "github.com/opentracing/opentracing-go" "github.com/slackapi/slack-cli/internal/cmdutil" - "github.com/slackapi/slack-cli/internal/experiment" "github.com/slackapi/slack-cli/internal/prompts" "github.com/slackapi/slack-cli/internal/shared" "github.com/slackapi/slack-cli/internal/shared/types" @@ -51,23 +50,15 @@ func NewUpdateCommand(clients *shared.ClientFactory) *cobra.Command { return cmdutil.IsValidProjectDirectory(clients) }, RunE: func(cmd *cobra.Command, args []string) error { - if !clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) { - cmd.Println() - cmd.Println(style.Sectionf(style.TextSection{ - Emoji: "construction", - Text: fmt.Sprintf("This command is under construction. Use at your own risk %s", style.Emoji("skull")), - Secondary: []string{ - fmt.Sprintf("Bypass this message with the %s flag", style.Highlight("--experiment read-only-collaborators")), - }, - })) - return nil - } - return runUpdateCommand(cmd, clients, args) }, } - cmd.Flags().StringVarP(&updateFlags.permissionType, "permission-type", "P", "", "collaborator permission type: reader, owner") + cmd.Flags().StringVarP(&updateFlags.permissionType, "permission-type", "P", "", fmt.Sprintf( + "collaborator permission type\n(\"%s\" or \"%s\")", + string(types.OWNER), + string(types.READER), + )) return cmd } diff --git a/cmd/collaborators/update_test.go b/cmd/collaborators/update_test.go index f2ab1ed4..e1ea7f0c 100644 --- a/cmd/collaborators/update_test.go +++ b/cmd/collaborators/update_test.go @@ -37,9 +37,6 @@ func TestUpdateCommand(t *testing.T) { appSelectMock := prompts.NewAppSelectMock() appSelectPromptFunc = appSelectMock.AppSelectPrompt appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil) - // Set experiment flag - clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators") - clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug) // Mock APi call clientsMock.API.On("UpdateCollaborator", mock.Anything, mock.Anything, "A123", @@ -55,10 +52,7 @@ func TestUpdateCommand(t *testing.T) { appSelectMock := prompts.NewAppSelectMock() appSelectPromptFunc = appSelectMock.AppSelectPrompt appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil) - // Set experiment flag - clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators") - clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug) - // Mock APi call + // Mock API call clientsMock.API.On("UpdateCollaborator", mock.Anything, mock.Anything, "A123", types.SlackUser{Email: "joe.smith@company.com", PermissionType: types.OWNER}).Return(nil) @@ -79,9 +73,6 @@ func TestUpdateCommand(t *testing.T) { ExpectedErrorStrings: []string{"accepts 1 arg(s), received 0"}, Setup: func(t *testing.T, ctx context.Context, clientsMock *shared.ClientsMock, clients *shared.ClientFactory) { clientsMock.AddDefaultMocks() - // Set experiment flag - clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators") - clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug) }, }, }, func(clients *shared.ClientFactory) *cobra.Command { diff --git a/docs/reference/experiments.md b/docs/reference/experiments.md index 9b73a32f..a163f9c7 100644 --- a/docs/reference/experiments.md +++ b/docs/reference/experiments.md @@ -9,7 +9,6 @@ The following is a list of currently available experiments. We'll remove experim * `bolt-install`: enables creating, installing, and running Bolt projects that manage their app manifest on app settings (remote manifest). * `slack create` and `slack init` now set manifest source to "app settings" (remote) for Bolt JS & Bolt Python projects ([PR#96](https://github.com/slackapi/slack-cli/pull/96)). * `slack run` and `slack install` support creating and installing Bolt Framework apps that have the manifest source set to "app settings (remote)" ([PR#111](https://github.com/slackapi/slack-cli/pull/111), [PR#154](https://github.com/slackapi/slack-cli/pull/154)). -* `read-only-collaborators`: enables creating and modifying collaborator permissions via the `slack collaborator` commands. ## Experiments changelog diff --git a/internal/experiment/experiment.go b/internal/experiment/experiment.go index 65878654..d4de14dd 100644 --- a/internal/experiment/experiment.go +++ b/internal/experiment/experiment.go @@ -38,10 +38,6 @@ const ( // manage their app manifest on app settings (remote manifest). BoltInstall Experiment = "bolt-install" - // The ReadOnlyAppCollaborators experiment enables creating and modifying collaborator - // permissions via the `collaborator` commands. - ReadOnlyAppCollaborators Experiment = "read-only-collaborators" - // Placeholder experiment is a placeholder for testing and does nothing... or does it? Placeholder Experiment = "placeholder" ) @@ -51,7 +47,6 @@ const ( var AllExperiments = []Experiment{ BoltFrameworks, BoltInstall, - ReadOnlyAppCollaborators, Placeholder, } diff --git a/internal/experiment/experiment_test.go b/internal/experiment/experiment_test.go index b9e94df6..699f6e90 100644 --- a/internal/experiment/experiment_test.go +++ b/internal/experiment/experiment_test.go @@ -26,7 +26,6 @@ func Test_Includes(t *testing.T) { // Test expected experiments require.Equal(t, true, Includes(Experiment("bolt"))) - require.Equal(t, true, Includes(Experiment("read-only-collaborators"))) // Test invalid experiment require.Equal(t, false, Includes(Experiment("should-fail"))) diff --git a/internal/shared/types/permissions.go b/internal/shared/types/permissions.go index cd6f7d27..f4c73390 100644 --- a/internal/shared/types/permissions.go +++ b/internal/shared/types/permissions.go @@ -37,7 +37,7 @@ func StringToAppCollaboratorPermission(input string) (AppCollaboratorPermission, case "reader": return READER, nil default: - return "", fmt.Errorf("invalid") + return "", fmt.Errorf("invalid permission; accepted values are \"owner\" or \"reader\"") } }