summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Mogozov <artur@canva.com>2018-10-16 22:13:00 +1100
committerGeorge Goldberg <george@gberg.me>2018-10-16 12:13:00 +0100
commitcedf6488e4d4d66c186facb4253513b1f7e775c6 (patch)
tree5fb9560e1ec73af6de1e18fa63c322dd5486dba2
parent80153ef87379040ff1c9ac6f11a7063b743a3fb2 (diff)
downloadchat-cedf6488e4d4d66c186facb4253513b1f7e775c6.tar.gz
chat-cedf6488e4d4d66c186facb4253513b1f7e775c6.tar.bz2
chat-cedf6488e4d4d66c186facb4253513b1f7e775c6.zip
MM-12368 Add create webhook-incoming command (#9566)
-rw-r--r--cmd/mattermost/commands/webhook.go52
-rw-r--r--cmd/mattermost/commands/webhook_test.go45
2 files changed, 97 insertions, 0 deletions
diff --git a/cmd/mattermost/commands/webhook.go b/cmd/mattermost/commands/webhook.go
index dbe292e72..0c56af18c 100644
--- a/cmd/mattermost/commands/webhook.go
+++ b/cmd/mattermost/commands/webhook.go
@@ -7,6 +7,7 @@ import (
"fmt"
"github.com/mattermost/mattermost-server/model"
+ "github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -23,6 +24,14 @@ var WebhookListCmd = &cobra.Command{
RunE: listWebhookCmdF,
}
+var WebhookCreateIncomingCmd = &cobra.Command{
+ Use: "create-incoming",
+ Short: "Create incoming webhook",
+ Long: "create incoming webhook which allows external posting of messages to specific channel",
+ Example: " webhook create-incoming --channel [channelID] --user [userID] --description [webhookDescription] --lock-to-channel --icon [iconURL]",
+ RunE: createIncomingWebhookCmdF,
+}
+
func listWebhookCmdF(command *cobra.Command, args []string) error {
app, err := InitDBCommandContextCobra(command)
if err != nil {
@@ -75,9 +84,52 @@ func listWebhookCmdF(command *cobra.Command, args []string) error {
return nil
}
+func createIncomingWebhookCmdF(command *cobra.Command, args []string) error {
+ app, err := InitDBCommandContextCobra(command)
+ if err != nil {
+ return err
+ }
+ defer app.Shutdown()
+
+ channelArg, _ := command.Flags().GetString("channel")
+ channel := getChannelFromChannelArg(app, channelArg)
+ if channel == nil {
+ return errors.New("Unable to find channel '" + channelArg + "'")
+ }
+
+ userArg, _ := command.Flags().GetString("user")
+ user := getUserFromUserArg(app, userArg)
+ displayName, _ := command.Flags().GetString("display-name")
+ description, _ := command.Flags().GetString("description")
+ iconUrl, _ := command.Flags().GetString("icon")
+ channelLocked, _ := command.Flags().GetBool("lock-to-channel")
+
+ incomingWebhook := &model.IncomingWebhook{
+ ChannelId: channel.Id,
+ DisplayName: displayName,
+ Description: description,
+ IconURL: iconUrl,
+ ChannelLocked: channelLocked,
+ }
+
+ if _, err := app.CreateIncomingWebhookForChannel(user.Id, channel, incomingWebhook); err != nil {
+ return err
+ }
+
+ return nil
+}
+
func init() {
+ WebhookCreateIncomingCmd.Flags().String("channel", "", "Channel ID")
+ WebhookCreateIncomingCmd.Flags().String("user", "", "User ID")
+ WebhookCreateIncomingCmd.Flags().String("display-name", "", "Incoming webhook display name")
+ WebhookCreateIncomingCmd.Flags().String("description", "", "Incoming webhook description")
+ WebhookCreateIncomingCmd.Flags().String("icon", "", "Icon URL")
+ WebhookCreateIncomingCmd.Flags().Bool("lock-to-channel", false, "Lock to channel")
+
WebhookCmd.AddCommand(
WebhookListCmd,
+ WebhookCreateIncomingCmd,
)
RootCmd.AddCommand(WebhookCmd)
diff --git a/cmd/mattermost/commands/webhook_test.go b/cmd/mattermost/commands/webhook_test.go
index cdbe9d7bb..1eea36b76 100644
--- a/cmd/mattermost/commands/webhook_test.go
+++ b/cmd/mattermost/commands/webhook_test.go
@@ -4,6 +4,7 @@
package commands
import (
+ "github.com/stretchr/testify/require"
"strings"
"testing"
@@ -49,3 +50,47 @@ func TestListWebhooks(t *testing.T) {
}
}
+
+func TestCreateIncomingWebhook(t *testing.T) {
+ th := api4.Setup().InitBasic().InitSystemAdmin()
+ defer th.TearDown()
+
+ th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableIncomingWebhooks = true })
+ th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableOutgoingWebhooks = true })
+ th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnablePostUsernameOverride = true })
+ th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnablePostIconOverride = true })
+
+ defaultRolePermissions := th.SaveDefaultRolePermissions()
+ defer func() {
+ th.RestoreDefaultRolePermissions(defaultRolePermissions)
+ }()
+ th.AddPermissionToRole(model.PERMISSION_MANAGE_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID)
+ th.RemovePermissionFromRole(model.PERMISSION_MANAGE_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID)
+
+ // should fail because you need to specify valid channel
+ require.Error(t, RunCommand(t, "webhook", "create-incoming"))
+ require.Error(t, RunCommand(t, "webhook", "create-incoming", "--channel", th.BasicTeam.Name+":doesnotexist"))
+
+ // should fail because you need to specify valid user
+ require.Error(t, RunCommand(t, "webhook", "create-incoming", "--channel", th.BasicChannel.Id))
+ require.Error(t, RunCommand(t, "webhook", "create-incoming", "--channel", th.BasicChannel.Id, "--user", "doesnotexist"))
+
+ description := "myhookinc"
+ displayName := "myhookinc"
+ CheckCommand(t, "webhook", "create-incoming", "--channel", th.BasicChannel.Id, "--user", th.BasicUser.Email, "--description", description, "--display-name", displayName)
+
+ webhooks, err := th.App.GetIncomingWebhooksPage(0, 1000)
+ if err != nil {
+ t.Fatal("unable to retrieve incoming webhooks")
+ }
+
+ found := false
+ for _, webhook := range webhooks {
+ if webhook.Description == description && webhook.UserId == th.BasicUser.Id {
+ found = true
+ }
+ }
+ if !found {
+ t.Fatal("Failed to create incoming webhook")
+ }
+}