1// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
2// See LICENSE.txt for license information.
3
4package model
5
6import (
7	"encoding/json"
8	"io"
9	"io/ioutil"
10	"strings"
11
12	"github.com/mattermost/mattermost-server/v5/utils/jsonutils"
13)
14
15const (
16	COMMAND_RESPONSE_TYPE_IN_CHANNEL = "in_channel"
17	COMMAND_RESPONSE_TYPE_EPHEMERAL  = "ephemeral"
18)
19
20type CommandResponse struct {
21	ResponseType     string             `json:"response_type"`
22	Text             string             `json:"text"`
23	Username         string             `json:"username"`
24	ChannelId        string             `json:"channel_id"`
25	IconURL          string             `json:"icon_url"`
26	Type             string             `json:"type"`
27	Props            StringInterface    `json:"props"`
28	GotoLocation     string             `json:"goto_location"`
29	TriggerId        string             `json:"trigger_id"`
30	SkipSlackParsing bool               `json:"skip_slack_parsing"` // Set to `true` to skip the Slack-compatibility handling of Text.
31	Attachments      []*SlackAttachment `json:"attachments"`
32	ExtraResponses   []*CommandResponse `json:"extra_responses"`
33}
34
35func (o *CommandResponse) ToJson() string {
36	b, _ := json.Marshal(o)
37	return string(b)
38}
39
40func CommandResponseFromHTTPBody(contentType string, body io.Reader) (*CommandResponse, error) {
41	if strings.TrimSpace(strings.Split(contentType, ";")[0]) == "application/json" {
42		return CommandResponseFromJson(body)
43	}
44	if b, err := ioutil.ReadAll(body); err == nil {
45		return CommandResponseFromPlainText(string(b)), nil
46	}
47	return nil, nil
48}
49
50func CommandResponseFromPlainText(text string) *CommandResponse {
51	return &CommandResponse{
52		Text: text,
53	}
54}
55
56func CommandResponseFromJson(data io.Reader) (*CommandResponse, error) {
57	b, err := ioutil.ReadAll(data)
58	if err != nil {
59		return nil, err
60	}
61
62	var o CommandResponse
63	err = json.Unmarshal(b, &o)
64	if err != nil {
65		return nil, jsonutils.HumanizeJsonError(err, b)
66	}
67
68	o.Attachments = StringifySlackFieldValue(o.Attachments)
69
70	if o.ExtraResponses != nil {
71		for _, resp := range o.ExtraResponses {
72			resp.Attachments = StringifySlackFieldValue(resp.Attachments)
73		}
74	}
75
76	return &o, nil
77}
78