BareRTC/pkg/webhooks.go

84 lines
2.0 KiB
Go

package barertc
import (
"bytes"
"encoding/json"
"errors"
"io"
"net/http"
"time"
"git.kirsle.net/apps/barertc/pkg/config"
"git.kirsle.net/apps/barertc/pkg/log"
)
// The available and supported webhook event names.
const (
WebhookReport = "report"
)
// WebhookEnabled checks if the named webhook is enabled.
func WebhookEnabled(name string) bool {
for _, webhook := range config.Current.WebhookURLs {
if webhook.Name == name && webhook.Enabled {
return true
}
}
return false
}
// GetWebhook gets a configured webhook.
func GetWebhook(name string) (config.WebhookURL, bool) {
for _, webhook := range config.Current.WebhookURLs {
if webhook.Name == name {
return webhook, true
}
}
return config.WebhookURL{}, false
}
// PostWebhook submits a JSON body to one of the app's configured webhooks.
//
// Returns the bytes of the response body (hopefully, JSON data) and any errors.
func PostWebhook(name string, payload any) ([]byte, error) {
webhook, ok := GetWebhook(name)
if !ok {
return nil, errors.New("PostWebhook(%s): webhook name %s is not configured")
} else if !webhook.Enabled {
return nil, errors.New("PostWebhook(%s): webhook is not enabled")
}
// JSON request body.
jsonStr, err := json.Marshal(payload)
if err != nil {
return nil, err
}
// Make the API request to BareRTC.
var url = webhook.URL
log.Debug("PostWebhook(%s): to %s we send: %s", name, url, jsonStr)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
if resp.StatusCode != http.StatusOK {
log.Error("PostWebhook(%s): unexpected response from webhook URL %s (code %d): %s", name, url, resp.StatusCode, body)
return body, errors.New("unexpected error from webhook URL")
}
return body, nil
}