[MM-9937] Add support for sending a message to a different channel than where the slash command was issued from (#9878)
* add support for channel_id in a slash command response * add test for HandleCommandResponsePost
Этот коммит содержится в:
коммит произвёл
Hanzei
родитель
8d7cb44f30
Коммит
f94567c97b
@@ -41,6 +41,13 @@ func (a *App) CreateCommandPost(post *model.Post, teamId string, response *model
|
||||
post.Message = model.ParseSlackLinksToMarkdown(response.Text)
|
||||
post.CreateAt = model.GetMillis()
|
||||
|
||||
_, err := a.GetChannelMember(post.ChannelId, post.UserId)
|
||||
if err != nil {
|
||||
err = model.NewAppError("CreateCommandPost", "api.command.command_post.forbidden.app_error", nil, err.Error(), http.StatusForbidden)
|
||||
mlog.Error(err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if strings.HasPrefix(post.Type, model.POST_SYSTEM_MESSAGE_PREFIX) {
|
||||
err := model.NewAppError("CreateCommandPost", "api.context.invalid_param.app_error", map[string]interface{}{"Name": "post.type"}, "", http.StatusBadRequest)
|
||||
return nil, err
|
||||
@@ -301,7 +308,7 @@ func (a *App) HandleCommandResponse(command *model.Command, args *model.CommandA
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (a *App) HandleCommandResponsePost(command *model.Command, args *model.CommandArgs, response *model.CommandResponse, builtIn bool) (*model.CommandResponse, *model.AppError) {
|
||||
func (a *App) HandleCommandResponsePost(command *model.Command, args *model.CommandArgs, response *model.CommandResponse, builtIn bool) (*model.Post, *model.AppError) {
|
||||
post := &model.Post{}
|
||||
post.ChannelId = args.ChannelId
|
||||
post.RootId = args.RootId
|
||||
@@ -310,6 +317,10 @@ func (a *App) HandleCommandResponsePost(command *model.Command, args *model.Comm
|
||||
post.Type = response.Type
|
||||
post.Props = response.Props
|
||||
|
||||
if len(response.ChannelId) != 0 {
|
||||
post.ChannelId = response.ChannelId
|
||||
}
|
||||
|
||||
isBotPost := !builtIn
|
||||
|
||||
if a.Config().ServiceSettings.EnablePostUsernameOverride {
|
||||
@@ -346,7 +357,7 @@ func (a *App) HandleCommandResponsePost(command *model.Command, args *model.Comm
|
||||
mlog.Error(err.Error())
|
||||
}
|
||||
|
||||
return response, nil
|
||||
return post, nil
|
||||
}
|
||||
|
||||
func (a *App) CreateCommand(cmd *model.Command) (*model.Command, *model.AppError) {
|
||||
|
||||
@@ -61,7 +61,142 @@ func TestCreateCommandPost(t *testing.T) {
|
||||
}
|
||||
|
||||
_, err := th.App.CreateCommandPost(post, th.BasicTeam.Id, resp)
|
||||
if err == nil && err.Id != "api.context.invalid_param.app_error" {
|
||||
if err == nil || err.Id != "api.context.invalid_param.app_error" {
|
||||
t.Fatal("should have failed - bad post type")
|
||||
}
|
||||
|
||||
channel := th.CreateChannel(th.BasicTeam)
|
||||
|
||||
post = &model.Post{
|
||||
ChannelId: th.BasicChannel.Id,
|
||||
UserId: channel.Id,
|
||||
}
|
||||
|
||||
_, err = th.App.CreateCommandPost(post, th.BasicTeam.Id, resp)
|
||||
if err == nil || err.Id != "api.command.command_post.forbidden.app_error" {
|
||||
t.Fatal("should have failed - forbidden channel post")
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleCommandResponsePost(t *testing.T) {
|
||||
th := Setup().InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
command := &model.Command{}
|
||||
args := &model.CommandArgs{
|
||||
ChannelId: th.BasicChannel.Id,
|
||||
TeamId: th.BasicTeam.Id,
|
||||
UserId: th.BasicUser.Id,
|
||||
RootId: "root_id",
|
||||
ParentId: "parent_id",
|
||||
}
|
||||
|
||||
resp := &model.CommandResponse{
|
||||
Type: model.POST_EPHEMERAL,
|
||||
Props: model.StringInterface{"some_key": "some value"},
|
||||
Text: "some message",
|
||||
}
|
||||
|
||||
builtIn := true
|
||||
|
||||
post, err := th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, args.ChannelId, post.ChannelId)
|
||||
assert.Equal(t, args.RootId, post.RootId)
|
||||
assert.Equal(t, args.ParentId, post.ParentId)
|
||||
assert.Equal(t, args.UserId, post.UserId)
|
||||
assert.Equal(t, resp.Type, post.Type)
|
||||
assert.Equal(t, resp.Props, post.Props)
|
||||
assert.Equal(t, resp.Text, post.Message)
|
||||
assert.Nil(t, post.Props["override_icon_url"])
|
||||
assert.Nil(t, post.Props["override_username"])
|
||||
assert.Nil(t, post.Props["from_webhook"])
|
||||
|
||||
// Command is not built in, so it is a bot command.
|
||||
builtIn = false
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Equal(t, "true", post.Props["from_webhook"])
|
||||
|
||||
builtIn = true
|
||||
|
||||
// Channel id is specified by response, it should override the command args value.
|
||||
channel := th.CreateChannel(th.BasicTeam)
|
||||
resp.ChannelId = channel.Id
|
||||
th.AddUserToChannel(th.BasicUser, channel)
|
||||
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, resp.ChannelId, post.ChannelId)
|
||||
assert.NotEqual(t, args.ChannelId, post.ChannelId)
|
||||
|
||||
// Override username config is turned off. No override should occur.
|
||||
th.App.Config().ServiceSettings.EnablePostUsernameOverride = false
|
||||
resp.ChannelId = ""
|
||||
command.Username = "Command username"
|
||||
resp.Username = "Response username"
|
||||
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Nil(t, post.Props["override_username"])
|
||||
|
||||
th.App.Config().ServiceSettings.EnablePostUsernameOverride = true
|
||||
|
||||
// Override username config is turned on. Override username through command property.
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, command.Username, post.Props["override_username"])
|
||||
assert.Equal(t, "true", post.Props["from_webhook"])
|
||||
|
||||
command.Username = ""
|
||||
|
||||
// Override username through response property.
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, resp.Username, post.Props["override_username"])
|
||||
assert.Equal(t, "true", post.Props["from_webhook"])
|
||||
|
||||
th.App.Config().ServiceSettings.EnablePostUsernameOverride = false
|
||||
|
||||
// Override icon url config is turned off. No override should occur.
|
||||
th.App.Config().ServiceSettings.EnablePostIconOverride = false
|
||||
command.IconURL = "Command icon url"
|
||||
resp.IconURL = "Response icon url"
|
||||
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Nil(t, post.Props["override_icon_url"])
|
||||
|
||||
th.App.Config().ServiceSettings.EnablePostIconOverride = true
|
||||
|
||||
// Override icon url config is turned on. Override icon url through command property.
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, command.IconURL, post.Props["override_icon_url"])
|
||||
assert.Equal(t, "true", post.Props["from_webhook"])
|
||||
|
||||
command.IconURL = ""
|
||||
|
||||
// Override icon url through response property.
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, resp.IconURL, post.Props["override_icon_url"])
|
||||
assert.Equal(t, "true", post.Props["from_webhook"])
|
||||
|
||||
// Test Slack text conversion.
|
||||
resp.Text = "<!channel>"
|
||||
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "@channel", post.Message)
|
||||
|
||||
// Test Slack attachments text conversion.
|
||||
resp.Attachments = []*model.SlackAttachment{
|
||||
&model.SlackAttachment{
|
||||
Text: "<!here>",
|
||||
},
|
||||
}
|
||||
|
||||
post, err = th.App.HandleCommandResponsePost(command, args, resp, builtIn)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "@here", resp.Attachments[0].Text)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user