Files
hanko/backend/webhooks/webhook.go
2025-09-25 19:15:20 +02:00

76 lines
1.5 KiB
Go

package webhooks
import (
"bytes"
"encoding/json"
"fmt"
"github.com/labstack/echo/v4"
"github.com/teamhanko/hanko/backend/v2/webhooks/events"
"net/http"
"strings"
"time"
)
type Webhook interface {
Trigger(data JobData) error
DisableOnExpiryDate(now time.Time) error
DisableOnFailure() error
Reset() error
IsEnabled() bool
HasEvent(evt events.Event) bool
}
type Webhooks []Webhook
const (
WebhookExpireDuration = 30 * 24 * time.Hour // 30 Days
)
type BaseWebhook struct {
Logger echo.Logger
Callback string
Events events.Events
}
func (bh *BaseWebhook) HasEvent(evt events.Event) bool {
for _, event := range bh.Events {
if strings.HasPrefix(string(evt), string(event)) {
return true
}
}
return false
}
func (bh *BaseWebhook) Trigger(data JobData) error {
// create request
dataJson, err := json.Marshal(data)
if err != nil {
bh.Logger.Error(fmt.Errorf("unable to convert JobData to json: %w", err))
return err
}
request, err := http.NewRequest(http.MethodPost, bh.Callback, bytes.NewReader(dataJson))
if err != nil {
bh.Logger.Error(fmt.Errorf("unable to create request for webhook: %w", err))
return err
}
request.Header.Set("Content-Type", "application/json")
client := http.Client{}
response, err := client.Do(request)
if err != nil {
bh.Logger.Error(fmt.Errorf("unable to execute webhook request: %w", err))
return err
}
if response.StatusCode >= http.StatusBadRequest {
err := fmt.Errorf("request failed due to status code: %d", response.StatusCode)
bh.Logger.Error(err)
return err
}
return nil
}