Merge pull request #1194 from mattermost/webhook-request
Parse incoming webhook requests into model instead of string map
Этот коммит содержится в:
@@ -23,6 +23,13 @@ type IncomingWebhook struct {
|
|||||||
TeamId string `json:"team_id"`
|
TeamId string `json:"team_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IncomingWebhookRequest struct {
|
||||||
|
Text string `json:"text"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
IconURL string `json:"icon_url"`
|
||||||
|
ChannelName string `json:"channel"`
|
||||||
|
}
|
||||||
|
|
||||||
func (o *IncomingWebhook) ToJson() string {
|
func (o *IncomingWebhook) ToJson() string {
|
||||||
b, err := json.Marshal(o)
|
b, err := json.Marshal(o)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -104,3 +111,14 @@ func (o *IncomingWebhook) PreSave() {
|
|||||||
func (o *IncomingWebhook) PreUpdate() {
|
func (o *IncomingWebhook) PreUpdate() {
|
||||||
o.UpdateAt = GetMillis()
|
o.UpdateAt = GetMillis()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IncomingWebhookRequestFromJson(data io.Reader) *IncomingWebhookRequest {
|
||||||
|
decoder := json.NewDecoder(data)
|
||||||
|
var o IncomingWebhookRequest
|
||||||
|
err := decoder.Decode(&o)
|
||||||
|
if err == nil {
|
||||||
|
return &o
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
14
web/web.go
14
web/web.go
@@ -969,20 +969,20 @@ func incomingWebhook(c *api.Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
|
|
||||||
var props map[string]string
|
var parsedRequest *model.IncomingWebhookRequest
|
||||||
if r.Header.Get("Content-Type") == "application/json" {
|
if r.Header.Get("Content-Type") == "application/json" {
|
||||||
props = model.MapFromJson(r.Body)
|
parsedRequest = model.IncomingWebhookRequestFromJson(r.Body)
|
||||||
} else {
|
} else {
|
||||||
props = model.MapFromJson(strings.NewReader(r.FormValue("payload")))
|
parsedRequest = model.IncomingWebhookRequestFromJson(strings.NewReader(r.FormValue("payload")))
|
||||||
}
|
}
|
||||||
|
|
||||||
text := props["text"]
|
text := parsedRequest.Text
|
||||||
if len(text) == 0 {
|
if len(text) == 0 {
|
||||||
c.Err = model.NewAppError("incomingWebhook", "No text specified", "")
|
c.Err = model.NewAppError("incomingWebhook", "No text specified", "")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
channelName := props["channel"]
|
channelName := parsedRequest.ChannelName
|
||||||
|
|
||||||
var hook *model.IncomingWebhook
|
var hook *model.IncomingWebhook
|
||||||
if result := <-hchan; result.Err != nil {
|
if result := <-hchan; result.Err != nil {
|
||||||
@@ -1012,8 +1012,8 @@ func incomingWebhook(c *api.Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
cchan = api.Srv.Store.Channel().Get(hook.ChannelId)
|
cchan = api.Srv.Store.Channel().Get(hook.ChannelId)
|
||||||
}
|
}
|
||||||
|
|
||||||
overrideUsername := props["username"]
|
overrideUsername := parsedRequest.Username
|
||||||
overrideIconUrl := props["icon_url"]
|
overrideIconUrl := parsedRequest.IconURL
|
||||||
|
|
||||||
if result := <-cchan; result.Err != nil {
|
if result := <-cchan; result.Err != nil {
|
||||||
c.Err = model.NewAppError("incomingWebhook", "Couldn't find the channel", "err="+result.Err.Message)
|
c.Err = model.NewAppError("incomingWebhook", "Couldn't find the channel", "err="+result.Err.Message)
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user