feat: webhooker 1.0 MVP — entity rename, core engine, delivery, management UI #16
@@ -12,7 +12,6 @@ import (
|
||||
"time"
|
||||
|
||||
"go.uber.org/fx"
|
||||
"gorm.io/gorm"
|
||||
"sneak.berlin/go/webhooker/internal/database"
|
||||
"sneak.berlin/go/webhooker/internal/logger"
|
||||
)
|
||||
@@ -46,18 +45,18 @@ type EngineParams struct {
|
||||
|
||||
// Engine processes queued deliveries in the background.
|
||||
type Engine struct {
|
||||
db *gorm.DB
|
||||
log *slog.Logger
|
||||
client *http.Client
|
||||
cancel context.CancelFunc
|
||||
wg sync.WaitGroup
|
||||
database *database.Database
|
||||
log *slog.Logger
|
||||
client *http.Client
|
||||
cancel context.CancelFunc
|
||||
wg sync.WaitGroup
|
||||
}
|
||||
|
||||
// New creates and registers the delivery engine with the fx lifecycle.
|
||||
func New(lc fx.Lifecycle, params EngineParams) *Engine {
|
||||
e := &Engine{
|
||||
db: params.DB.DB(),
|
||||
log: params.Logger.Get(),
|
||||
database: params.DB,
|
||||
log: params.Logger.Get(),
|
||||
client: &http.Client{
|
||||
Timeout: httpClientTimeout,
|
||||
},
|
||||
@@ -110,7 +109,7 @@ func (e *Engine) run(ctx context.Context) {
|
||||
|
||||
func (e *Engine) processPending(ctx context.Context) {
|
||||
var deliveries []database.Delivery
|
||||
result := e.db.
|
||||
result := e.database.DB().
|
||||
Where("status IN ?", []database.DeliveryStatus{
|
||||
database.DeliveryStatusPending,
|
||||
database.DeliveryStatusRetrying,
|
||||
@@ -196,13 +195,13 @@ func (e *Engine) deliverRetry(_ context.Context, d *database.Delivery) {
|
||||
|
||||
// Determine attempt number from existing results
|
||||
var resultCount int64
|
||||
e.db.Model(&database.DeliveryResult{}).Where("delivery_id = ?", d.ID).Count(&resultCount)
|
||||
e.database.DB().Model(&database.DeliveryResult{}).Where("delivery_id = ?", d.ID).Count(&resultCount)
|
||||
attemptNum := int(resultCount) + 1
|
||||
|
||||
// Check if we should wait before retrying (exponential backoff)
|
||||
if attemptNum > 1 {
|
||||
var lastResult database.DeliveryResult
|
||||
lookupErr := e.db.Where("delivery_id = ?", d.ID).Order("created_at DESC").First(&lastResult).Error
|
||||
lookupErr := e.database.DB().Where("delivery_id = ?", d.ID).Order("created_at DESC").First(&lastResult).Error
|
||||
if lookupErr == nil {
|
||||
shift := attemptNum - 2
|
||||
if shift > 30 {
|
||||
@@ -330,7 +329,7 @@ func (e *Engine) recordResult(d *database.Delivery, attemptNum int, success bool
|
||||
Duration: durationMs,
|
||||
}
|
||||
|
||||
if err := e.db.Create(result).Error; err != nil {
|
||||
if err := e.database.DB().Create(result).Error; err != nil {
|
||||
e.log.Error("failed to record delivery result",
|
||||
"delivery_id", d.ID,
|
||||
"error", err,
|
||||
@@ -339,7 +338,7 @@ func (e *Engine) recordResult(d *database.Delivery, attemptNum int, success bool
|
||||
}
|
||||
|
||||
func (e *Engine) updateDeliveryStatus(d *database.Delivery, status database.DeliveryStatus) {
|
||||
if err := e.db.Model(d).Update("status", status).Error; err != nil {
|
||||
if err := e.database.DB().Model(d).Update("status", status).Error; err != nil {
|
||||
e.log.Error("failed to update delivery status",
|
||||
"delivery_id", d.ID,
|
||||
"status", status,
|
||||
|
||||
Reference in New Issue
Block a user