Skip to content

Commit 22ed643

Browse files
committed
unhide read-only collaborator setting for deployed apps
1 parent e99774d commit 22ed643

File tree

7 files changed

+60
-99
lines changed

7 files changed

+60
-99
lines changed

cmd/collaborators/add.go

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
"github.com/opentracing/opentracing-go"
2424
"github.com/slackapi/slack-cli/internal/cmdutil"
25-
"github.com/slackapi/slack-cli/internal/experiment"
2625
"github.com/slackapi/slack-cli/internal/iostreams"
2726
"github.com/slackapi/slack-cli/internal/prompts"
2827
"github.com/slackapi/slack-cli/internal/shared"
@@ -62,8 +61,7 @@ func NewAddCommand(clients *shared.ClientFactory) *cobra.Command {
6261
return runAddCommandFunc(ctx, clients, cmd, args)
6362
},
6463
}
65-
cmd.Flags().StringVarP(&addFlags.permissionType, "permission-type", "P", "", "collaborator permission type: reader, owner")
66-
cmd.Flag("permission-type").Hidden = true
64+
cmd.Flags().StringVarP(&addFlags.permissionType, "permission-type", "P", "", "collaborator permission type: [reader|owner]")
6765
return cmd
6866
}
6967

@@ -87,7 +85,7 @@ func runAddCommandFunc(ctx context.Context, clients *shared.ClientFactory, cmd *
8785
}
8886
err = clients.API().AddCollaborator(ctx, selection.Auth.Token, selection.App.AppID, slackUser)
8987
if err != nil {
90-
if clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) && strings.Contains(err.Error(), "user_already_owner") {
88+
if strings.Contains(err.Error(), "user_already_owner") {
9189
cmd.Println()
9290
cmd.Println(style.Sectionf(style.TextSection{
9391
Emoji: "bulb",
@@ -123,14 +121,15 @@ func promptCollaboratorsAdd(
123121
if err != nil {
124122
return types.SlackUser{}, err
125123
}
124+
126125
switch clients.Config.Flags.Lookup("permission-type").Changed {
127126
case true:
128127
slackUser.PermissionType, err = promptCollaboratorsAddPermissionFlags(ctx, clients, addFlags.permissionType)
128+
if err != nil {
129+
return types.SlackUser{}, err
130+
}
129131
default:
130-
slackUser.PermissionType, err = promptCollaboratorsAddPermissionPrompts(ctx, clients)
131-
}
132-
if err != nil {
133-
return types.SlackUser{}, err
132+
slackUser.PermissionType = types.OWNER
134133
}
135134
return slackUser, nil
136135
}
@@ -181,40 +180,7 @@ func promptCollaboratorsAddSlackUserPrompts(
181180
return slackUser, nil
182181
}
183182

184-
// promptCollaboratorsAddPermissionPrompts gathers the collaborator permission
185-
// from selection if the experiment allows
186-
func promptCollaboratorsAddPermissionPrompts(
187-
ctx context.Context,
188-
clients *shared.ClientFactory,
189-
) (
190-
permission types.AppCollaboratorPermission,
191-
err error,
192-
) {
193-
switch clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) {
194-
case false:
195-
return types.OWNER, nil
196-
default:
197-
permissionLabels := []string{
198-
"owner",
199-
"reader",
200-
}
201-
response, err := clients.IO.SelectPrompt(
202-
ctx,
203-
"Decide the collaborator permission",
204-
permissionLabels,
205-
iostreams.SelectPromptConfig{
206-
Required: true,
207-
},
208-
)
209-
if err != nil {
210-
return "", err
211-
}
212-
return types.StringToAppCollaboratorPermission(response.Option)
213-
}
214-
}
215-
216-
// promptCollaboratorsAddPermissionFlags gathers the collaborator permission
217-
// from flags if the experiment allows
183+
// promptCollaboratorsAddPermissionFlags fetches collaborator permission from the flag
218184
func promptCollaboratorsAddPermissionFlags(
219185
ctx context.Context,
220186
clients *shared.ClientFactory,
@@ -223,19 +189,7 @@ func promptCollaboratorsAddPermissionFlags(
223189
permission types.AppCollaboratorPermission,
224190
err error,
225191
) {
226-
switch clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) {
227-
case true:
228-
return types.StringToAppCollaboratorPermission(addFlags.permissionType)
229-
default:
230-
clients.IO.PrintInfo(ctx, false, "\n%s", style.Sectionf(style.TextSection{
231-
Emoji: "construction",
232-
Text: fmt.Sprintf("This command is under construction. Use at your own risk %s", style.Emoji("skull")),
233-
Secondary: []string{
234-
fmt.Sprintf("Bypass this message with the %s flag", style.Highlight("--experiment read-only-collaborators")),
235-
},
236-
}))
237-
return "", slackerror.New(slackerror.ErrMissingExperiment)
238-
}
192+
return types.StringToAppCollaboratorPermission(addFlags.permissionType)
239193
}
240194

241195
// printCollaboratorsAddSuccess outputs a message when addition is done

cmd/collaborators/add_test.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ func TestAddCommand(t *testing.T) {
3737
appSelectMock := prompts.NewAppSelectMock()
3838
appSelectPromptFunc = appSelectMock.AppSelectPrompt
3939
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil)
40-
// Set experiment flag
41-
cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, "read-only-collaborators")
42-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
4340
// Mock API call
4441
cm.API.On("AddCollaborator", mock.Anything, mock.Anything,
4542
"A123",
@@ -61,9 +58,6 @@ func TestAddCommand(t *testing.T) {
6158
appSelectMock := prompts.NewAppSelectMock()
6259
appSelectPromptFunc = appSelectMock.AppSelectPrompt
6360
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil)
64-
// Set experiment flag
65-
cm.Config.ExperimentsFlag = append(cm.Config.ExperimentsFlag, "read-only-collaborators")
66-
cm.Config.LoadExperiments(ctx, cm.IO.PrintDebug)
6761
// Mock API call
6862
cm.API.On("AddCollaborator", mock.Anything, mock.Anything,
6963
"A123",

cmd/collaborators/update.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
package collaborators
1616

1717
import (
18-
"fmt"
18+
"context"
1919
"net/mail"
2020

2121
"github.com/opentracing/opentracing-go"
2222
"github.com/slackapi/slack-cli/internal/cmdutil"
23-
"github.com/slackapi/slack-cli/internal/experiment"
23+
"github.com/slackapi/slack-cli/internal/iostreams"
2424
"github.com/slackapi/slack-cli/internal/prompts"
2525
"github.com/slackapi/slack-cli/internal/shared"
2626
"github.com/slackapi/slack-cli/internal/shared/types"
@@ -51,18 +51,6 @@ func NewUpdateCommand(clients *shared.ClientFactory) *cobra.Command {
5151
return cmdutil.IsValidProjectDirectory(clients)
5252
},
5353
RunE: func(cmd *cobra.Command, args []string) error {
54-
if !clients.Config.WithExperimentOn(experiment.ReadOnlyAppCollaborators) {
55-
cmd.Println()
56-
cmd.Println(style.Sectionf(style.TextSection{
57-
Emoji: "construction",
58-
Text: fmt.Sprintf("This command is under construction. Use at your own risk %s", style.Emoji("skull")),
59-
Secondary: []string{
60-
fmt.Sprintf("Bypass this message with the %s flag", style.Highlight("--experiment read-only-collaborators")),
61-
},
62-
}))
63-
return nil
64-
}
65-
6654
return runUpdateCommand(cmd, clients, args)
6755
},
6856
}
@@ -92,8 +80,10 @@ func runUpdateCommand(cmd *cobra.Command, clients *shared.ClientFactory, args []
9280
return err
9381
}
9482
} else {
95-
cmd.Println(fmt.Sprintf("\n%s Specify a permission type for your collaborator with the %s flag\n", style.Emoji("warning"), style.Highlight("--permission-type")))
96-
return nil
83+
slackUser.PermissionType, err = promptCollaboratorPermissionSelection(ctx, clients)
84+
if err != nil {
85+
return err
86+
}
9787
}
9888

9989
// Get the app auth selection from the flag or prompt
@@ -117,3 +107,29 @@ func runUpdateCommand(cmd *cobra.Command, clients *shared.ClientFactory, args []
117107

118108
return nil
119109
}
110+
111+
// promptCollaboratorPermissionSelection fetches collaborator permission from the prompt
112+
func promptCollaboratorPermissionSelection(
113+
ctx context.Context,
114+
clients *shared.ClientFactory,
115+
) (
116+
permission types.AppCollaboratorPermission,
117+
err error,
118+
) {
119+
permissionLabels := []string{
120+
"owner",
121+
"reader",
122+
}
123+
response, err := clients.IO.SelectPrompt(
124+
ctx,
125+
"Select a permission type for this collaborator",
126+
permissionLabels,
127+
iostreams.SelectPromptConfig{
128+
Required: true,
129+
},
130+
)
131+
if err != nil {
132+
return "", err
133+
}
134+
return types.StringToAppCollaboratorPermission(response.Option)
135+
}

cmd/collaborators/update_test.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"testing"
2020

21+
"github.com/slackapi/slack-cli/internal/iostreams"
2122
"github.com/slackapi/slack-cli/internal/prompts"
2223
"github.com/slackapi/slack-cli/internal/shared"
2324
"github.com/slackapi/slack-cli/internal/shared/types"
@@ -37,9 +38,6 @@ func TestUpdateCommand(t *testing.T) {
3738
appSelectMock := prompts.NewAppSelectMock()
3839
appSelectPromptFunc = appSelectMock.AppSelectPrompt
3940
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil)
40-
// Set experiment flag
41-
clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators")
42-
clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug)
4341
// Mock APi call
4442
clientsMock.API.On("UpdateCollaborator", mock.Anything, mock.Anything,
4543
"A123",
@@ -55,33 +53,39 @@ func TestUpdateCommand(t *testing.T) {
5553
appSelectMock := prompts.NewAppSelectMock()
5654
appSelectPromptFunc = appSelectMock.AppSelectPrompt
5755
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil)
58-
// Set experiment flag
59-
clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators")
60-
clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug)
61-
// Mock APi call
56+
// Mock API call
6257
clientsMock.API.On("UpdateCollaborator", mock.Anything, mock.Anything,
6358
"A123",
6459
types.SlackUser{Email: "[email protected]", PermissionType: types.OWNER}).Return(nil)
6560
},
6661
},
67-
"permission type must be specified": {
62+
"prompts when permission type not specified": {
6863
CmdArgs: []string{"[email protected]"},
69-
ExpectedOutputs: []string{"Specify a permission type for your collaborator"},
64+
ExpectedOutputs: []string{"[email protected] successfully updated as a reader collaborator on this app"},
7065
Setup: func(t *testing.T, ctx context.Context, clientsMock *shared.ClientsMock, clients *shared.ClientFactory) {
7166
clientsMock.AddDefaultMocks()
72-
// Set experiment flag
73-
clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators")
74-
clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug)
67+
// Mock app selection
68+
appSelectMock := prompts.NewAppSelectMock()
69+
appSelectPromptFunc = appSelectMock.AppSelectPrompt
70+
appSelectMock.On("AppSelectPrompt", mock.Anything, mock.Anything, prompts.ShowHostedOnly, prompts.ShowInstalledAndUninstalledApps).Return(prompts.SelectedApp{App: types.App{AppID: "A123"}, Auth: types.SlackAuth{}}, nil)
71+
// Mock permission selection prompt
72+
clientsMock.IO.On("SelectPrompt", mock.Anything, "Select a permission type for this collaborator", mock.Anything, mock.Anything).Return(
73+
iostreams.SelectPromptResponse{
74+
Prompt: true,
75+
Option: "reader",
76+
Index: 1,
77+
}, nil)
78+
// Mock API call
79+
clientsMock.API.On("UpdateCollaborator", mock.Anything, mock.Anything,
80+
"A123",
81+
types.SlackUser{Email: "[email protected]", PermissionType: types.READER}).Return(nil)
7582
},
7683
},
7784
"user ID must be provided": {
7885
CmdArgs: []string{},
7986
ExpectedErrorStrings: []string{"accepts 1 arg(s), received 0"},
8087
Setup: func(t *testing.T, ctx context.Context, clientsMock *shared.ClientsMock, clients *shared.ClientFactory) {
8188
clientsMock.AddDefaultMocks()
82-
// Set experiment flag
83-
clientsMock.Config.ExperimentsFlag = append(clientsMock.Config.ExperimentsFlag, "read-only-collaborators")
84-
clientsMock.Config.LoadExperiments(ctx, clientsMock.IO.PrintDebug)
8589
},
8690
},
8791
}, func(clients *shared.ClientFactory) *cobra.Command {

docs/reference/experiments.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ The following is a list of currently available experiments. We'll remove experim
99
* `bolt-install`: enables creating, installing, and running Bolt projects that manage their app manifest on app settings (remote manifest).
1010
* `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)).
1111
* `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)).
12-
* `read-only-collaborators`: enables creating and modifying collaborator permissions via the `slack collaborator` commands.
1312

1413
## Experiments changelog
1514

internal/experiment/experiment.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ const (
3838
// manage their app manifest on app settings (remote manifest).
3939
BoltInstall Experiment = "bolt-install"
4040

41-
// The ReadOnlyAppCollaborators experiment enables creating and modifying collaborator
42-
// permissions via the `collaborator` commands.
43-
ReadOnlyAppCollaborators Experiment = "read-only-collaborators"
44-
4541
// Placeholder experiment is a placeholder for testing and does nothing... or does it?
4642
Placeholder Experiment = "placeholder"
4743
)
@@ -51,7 +47,6 @@ const (
5147
var AllExperiments = []Experiment{
5248
BoltFrameworks,
5349
BoltInstall,
54-
ReadOnlyAppCollaborators,
5550
Placeholder,
5651
}
5752

internal/experiment/experiment_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func Test_Includes(t *testing.T) {
2626

2727
// Test expected experiments
2828
require.Equal(t, true, Includes(Experiment("bolt")))
29-
require.Equal(t, true, Includes(Experiment("read-only-collaborators")))
3029

3130
// Test invalid experiment
3231
require.Equal(t, false, Includes(Experiment("should-fail")))

0 commit comments

Comments
 (0)