mirror of
https://github.com/teamhanko/hanko.git
synced 2025-10-26 13:27:57 +08:00
79 lines
1.3 KiB
Go
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
|
|
}
|