// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. package api4 import ( "encoding/json" "net/http" "github.com/mattermost/mattermost/server/public/model" "github.com/mattermost/mattermost/server/public/shared/mlog" ) func (api *API) InitWebhookLocal() { api.BaseRoutes.IncomingHooks.Handle("", api.APILocal(localCreateIncomingHook)).Methods(http.MethodPost) api.BaseRoutes.IncomingHooks.Handle("", api.APILocal(getIncomingHooks)).Methods(http.MethodGet) api.BaseRoutes.IncomingHook.Handle("", api.APILocal(getIncomingHook)).Methods(http.MethodGet) api.BaseRoutes.IncomingHook.Handle("", api.APILocal(updateIncomingHook)).Methods(http.MethodPut) api.BaseRoutes.IncomingHook.Handle("", api.APILocal(deleteIncomingHook)).Methods(http.MethodDelete) api.BaseRoutes.OutgoingHooks.Handle("", api.APILocal(localCreateOutgoingHook)).Methods(http.MethodPost) api.BaseRoutes.OutgoingHooks.Handle("", api.APILocal(getOutgoingHooks)).Methods(http.MethodGet) api.BaseRoutes.OutgoingHook.Handle("", api.APILocal(getOutgoingHook)).Methods(http.MethodGet) api.BaseRoutes.OutgoingHook.Handle("", api.APILocal(updateOutgoingHook)).Methods(http.MethodPut) api.BaseRoutes.OutgoingHook.Handle("", api.APILocal(deleteOutgoingHook)).Methods(http.MethodDelete) } func localCreateIncomingHook(c *Context, w http.ResponseWriter, r *http.Request) { var hook model.IncomingWebhook if jsonErr := json.NewDecoder(r.Body).Decode(&hook); jsonErr != nil { c.SetInvalidParamWithErr("incoming_webhook", jsonErr) return } if hook.UserId == "" { c.SetInvalidParam("user_id") return } channel, err := c.App.GetChannel(c.AppContext, hook.ChannelId) if err != nil { c.Err = err return } if _, err = c.App.GetUser(hook.UserId); err != nil { c.Err = err return } auditRec := c.MakeAuditRecord(model.AuditEventLocalCreateIncomingHook, model.AuditStatusFail) defer c.LogAuditRec(auditRec) model.AddEventParameterAuditableToAuditRec(auditRec, "hook", &hook) model.AddEventParameterAuditableToAuditRec(auditRec, "channel", channel) c.LogAudit("attempt") incomingHook, err := c.App.CreateIncomingWebhookForChannel(hook.UserId, channel, &hook) if err != nil { c.Err = err return } auditRec.Success() auditRec.AddEventResultState(incomingHook) auditRec.AddEventObjectType("incoming_webhook") c.LogAudit("success") w.WriteHeader(http.StatusCreated) if err := json.NewEncoder(w).Encode(incomingHook); err != nil { c.Logger.Warn("Error while writing response", mlog.Err(err)) } } func localCreateOutgoingHook(c *Context, w http.ResponseWriter, r *http.Request) { var hook model.OutgoingWebhook if jsonErr := json.NewDecoder(r.Body).Decode(&hook); jsonErr != nil { c.SetInvalidParamWithErr("outgoing_webhook", jsonErr) return } auditRec := c.MakeAuditRecord(model.AuditEventCreateOutgoingHook, model.AuditStatusFail) defer c.LogAuditRec(auditRec) model.AddEventParameterAuditableToAuditRec(auditRec, "hook", &hook) c.LogAudit("attempt") if hook.CreatorId == "" { c.SetInvalidParam("creator_id") return } _, err := c.App.GetUser(hook.CreatorId) if err != nil { c.Err = err return } rhook, err := c.App.CreateOutgoingWebhook(&hook) if err != nil { c.LogAudit("fail") c.Err = err return } auditRec.Success() auditRec.AddEventResultState(rhook) auditRec.AddEventObjectType("outgoing_webhook") c.LogAudit("success") w.WriteHeader(http.StatusCreated) if err := json.NewEncoder(w).Encode(rhook); err != nil { c.Logger.Warn("Error while writing response", mlog.Err(err)) } }