github.com/ashishbhate/mattermost-server@v5.11.1+incompatible/model/outgoing_webhook.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "io" 10 "net/http" 11 "net/url" 12 "strconv" 13 "strings" 14 ) 15 16 type OutgoingWebhook struct { 17 Id string `json:"id"` 18 Token string `json:"token"` 19 CreateAt int64 `json:"create_at"` 20 UpdateAt int64 `json:"update_at"` 21 DeleteAt int64 `json:"delete_at"` 22 CreatorId string `json:"creator_id"` 23 ChannelId string `json:"channel_id"` 24 TeamId string `json:"team_id"` 25 TriggerWords StringArray `json:"trigger_words"` 26 TriggerWhen int `json:"trigger_when"` 27 CallbackURLs StringArray `json:"callback_urls"` 28 DisplayName string `json:"display_name"` 29 Description string `json:"description"` 30 ContentType string `json:"content_type"` 31 Username string `json:"username"` 32 IconURL string `json:"icon_url"` 33 } 34 35 type OutgoingWebhookPayload struct { 36 Token string `json:"token"` 37 TeamId string `json:"team_id"` 38 TeamDomain string `json:"team_domain"` 39 ChannelId string `json:"channel_id"` 40 ChannelName string `json:"channel_name"` 41 Timestamp int64 `json:"timestamp"` 42 UserId string `json:"user_id"` 43 UserName string `json:"user_name"` 44 PostId string `json:"post_id"` 45 Text string `json:"text"` 46 TriggerWord string `json:"trigger_word"` 47 FileIds string `json:"file_ids"` 48 } 49 50 type OutgoingWebhookResponse struct { 51 Text *string `json:"text"` 52 Username string `json:"username"` 53 IconURL string `json:"icon_url"` 54 Props StringInterface `json:"props"` 55 Attachments []*SlackAttachment `json:"attachments"` 56 Type string `json:"type"` 57 ResponseType string `json:"response_type"` 58 } 59 60 const OUTGOING_HOOK_RESPONSE_TYPE_COMMENT = "comment" 61 62 func (o *OutgoingWebhookPayload) ToJSON() string { 63 b, _ := json.Marshal(o) 64 return string(b) 65 } 66 67 func (o *OutgoingWebhookPayload) ToFormValues() string { 68 v := url.Values{} 69 v.Set("token", o.Token) 70 v.Set("team_id", o.TeamId) 71 v.Set("team_domain", o.TeamDomain) 72 v.Set("channel_id", o.ChannelId) 73 v.Set("channel_name", o.ChannelName) 74 v.Set("timestamp", strconv.FormatInt(o.Timestamp/1000, 10)) 75 v.Set("user_id", o.UserId) 76 v.Set("user_name", o.UserName) 77 v.Set("post_id", o.PostId) 78 v.Set("text", o.Text) 79 v.Set("trigger_word", o.TriggerWord) 80 v.Set("file_ids", o.FileIds) 81 82 return v.Encode() 83 } 84 85 func (o *OutgoingWebhook) ToJson() string { 86 b, _ := json.Marshal(o) 87 return string(b) 88 } 89 90 func OutgoingWebhookFromJson(data io.Reader) *OutgoingWebhook { 91 var o *OutgoingWebhook 92 json.NewDecoder(data).Decode(&o) 93 return o 94 } 95 96 func OutgoingWebhookListToJson(l []*OutgoingWebhook) string { 97 b, _ := json.Marshal(l) 98 return string(b) 99 } 100 101 func OutgoingWebhookListFromJson(data io.Reader) []*OutgoingWebhook { 102 var o []*OutgoingWebhook 103 json.NewDecoder(data).Decode(&o) 104 return o 105 } 106 107 func (o *OutgoingWebhookResponse) ToJson() string { 108 b, _ := json.Marshal(o) 109 return string(b) 110 } 111 112 func OutgoingWebhookResponseFromJson(data io.Reader) (*OutgoingWebhookResponse, error) { 113 var o *OutgoingWebhookResponse 114 err := json.NewDecoder(data).Decode(&o) 115 return o, err 116 } 117 118 func (o *OutgoingWebhook) IsValid() *AppError { 119 120 if len(o.Id) != 26 { 121 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.id.app_error", nil, "", http.StatusBadRequest) 122 } 123 124 if len(o.Token) != 26 { 125 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.token.app_error", nil, "", http.StatusBadRequest) 126 } 127 128 if o.CreateAt == 0 { 129 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.create_at.app_error", nil, "id="+o.Id, http.StatusBadRequest) 130 } 131 132 if o.UpdateAt == 0 { 133 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.update_at.app_error", nil, "id="+o.Id, http.StatusBadRequest) 134 } 135 136 if len(o.CreatorId) != 26 { 137 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.user_id.app_error", nil, "", http.StatusBadRequest) 138 } 139 140 if len(o.ChannelId) != 0 && len(o.ChannelId) != 26 { 141 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.channel_id.app_error", nil, "", http.StatusBadRequest) 142 } 143 144 if len(o.TeamId) != 26 { 145 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.team_id.app_error", nil, "", http.StatusBadRequest) 146 } 147 148 if len(fmt.Sprintf("%s", o.TriggerWords)) > 1024 { 149 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.words.app_error", nil, "", http.StatusBadRequest) 150 } 151 152 if len(o.TriggerWords) != 0 { 153 for _, triggerWord := range o.TriggerWords { 154 if len(triggerWord) == 0 { 155 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.trigger_words.app_error", nil, "", http.StatusBadRequest) 156 } 157 } 158 } 159 160 if len(o.CallbackURLs) == 0 || len(fmt.Sprintf("%s", o.CallbackURLs)) > 1024 { 161 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.callback.app_error", nil, "", http.StatusBadRequest) 162 } 163 164 for _, callback := range o.CallbackURLs { 165 if !IsValidHttpUrl(callback) { 166 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.url.app_error", nil, "", http.StatusBadRequest) 167 } 168 } 169 170 if len(o.DisplayName) > 64 { 171 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.display_name.app_error", nil, "", http.StatusBadRequest) 172 } 173 174 if len(o.Description) > 500 { 175 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.description.app_error", nil, "", http.StatusBadRequest) 176 } 177 178 if len(o.ContentType) > 128 { 179 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.content_type.app_error", nil, "", http.StatusBadRequest) 180 } 181 182 if o.TriggerWhen > 1 { 183 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.is_valid.content_type.app_error", nil, "", http.StatusBadRequest) 184 } 185 186 if len(o.Username) > 64 { 187 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.username.app_error", nil, "", http.StatusBadRequest) 188 } 189 190 if len(o.IconURL) > 1024 { 191 return NewAppError("OutgoingWebhook.IsValid", "model.outgoing_hook.icon_url.app_error", nil, "", http.StatusBadRequest) 192 } 193 194 return nil 195 } 196 197 func (o *OutgoingWebhook) PreSave() { 198 if o.Id == "" { 199 o.Id = NewId() 200 } 201 202 if o.Token == "" { 203 o.Token = NewId() 204 } 205 206 o.CreateAt = GetMillis() 207 o.UpdateAt = o.CreateAt 208 } 209 210 func (o *OutgoingWebhook) PreUpdate() { 211 o.UpdateAt = GetMillis() 212 } 213 214 func (o *OutgoingWebhook) TriggerWordExactMatch(word string) bool { 215 if len(word) == 0 { 216 return false 217 } 218 219 for _, trigger := range o.TriggerWords { 220 if trigger == word { 221 return true 222 } 223 } 224 225 return false 226 } 227 228 func (o *OutgoingWebhook) TriggerWordStartsWith(word string) bool { 229 if len(word) == 0 { 230 return false 231 } 232 233 for _, trigger := range o.TriggerWords { 234 if strings.HasPrefix(word, trigger) { 235 return true 236 } 237 } 238 239 return false 240 } 241 242 func (o *OutgoingWebhook) GetTriggerWord(word string, isExactMatch bool) (triggerWord string) { 243 if len(word) == 0 { 244 return 245 } 246 247 if isExactMatch { 248 for _, trigger := range o.TriggerWords { 249 if trigger == word { 250 triggerWord = trigger 251 break 252 } 253 } 254 } else { 255 for _, trigger := range o.TriggerWords { 256 if strings.HasPrefix(word, trigger) { 257 triggerWord = trigger 258 break 259 } 260 } 261 } 262 263 return triggerWord 264 }