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

79 lines
1.3 KiB
Go

package webhooks
import (
"fmt"
"github.com/labstack/echo/v4"
"github.com/teamhanko/hanko/backend/v2/webhooks/events"
"time"
)
type Job struct {
Data JobData
Hook Webhook
CanExpireAtTime bool
}
type JobData struct {
Token string `json:"token"`
Event events.Event `json:"event"`
}
type Worker struct {
logger echo.Logger
hookChannel chan Job
}
func NewWorker(hookChannel chan Job, logger echo.Logger) Worker {
return Worker{
logger: logger,
hookChannel: hookChannel,
}
}
func (w *Worker) Run() {
for {
job, open := <-w.hookChannel
if !open {
break
}
err := w.triggerWebhook(job)
if err != nil {
w.logger.Error(fmt.Errorf("unable to trigger webhook: %w", err))
continue
}
}
}
func (w *Worker) triggerWebhook(job Job) error {
now := time.Now()
// only if jobs are allowed to expire
if job.CanExpireAtTime {
// check for expire date
err := job.Hook.DisableOnExpiryDate(now)
if err != nil {
return err
}
}
if job.Hook.IsEnabled() {
err := job.Hook.Trigger(job.Data)
if err != nil {
// expire after failure (if failure counter > FailureExpireRate)
disableErr := job.Hook.DisableOnFailure()
if disableErr != nil {
return disableErr
}
return err
}
err = job.Hook.Reset()
if err != nil {
return err
}
}
return nil
}