Parse incoming webhook requsets into model instead of string map

Этот коммит содержится в:
JoramWilander
2015-10-26 15:10:17 -04:00
родитель 2680b81568
Коммит c94388042b
2 изменённых файлов: 26 добавлений и 7 удалений

Просмотреть файл

@@ -23,6 +23,14 @@ 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"`
IconEmoji string `json:"icon_emoji"`
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 +112,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
}
}

Просмотреть файл

@@ -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)