package delivery import ( "context" "gorm.io/gorm" "sneak.berlin/go/webhooker/internal/database" ) // logTarget is a fire-and-forget target that logs the entire // inbound webhook — the full request body and headers, plus // the method, content type, and the webhook and entrypoint // ids — then records a single successful attempt. // // This is the one log call in the service that deliberately writes // unbounded client-chosen bytes, so it is the one exception to the // per-field budgets in internal/logfield and to the ceiling stated on // middleware.MaxAccessLogLineBytes. Capping here would defeat the // target: emitting the payload IS the delivery. It costs nothing by // default — an authenticated operator has to create a target of this // type on a specific webhook before a single line is written — and the // bytes it writes are bounded per event by maxWebhookBodySize (1 MB). // An operator who adds one is choosing to spend log volume on the // payloads that webhook receives. type logTarget struct { eng *Engine } // Deliver implements Target. func (t *logTarget) Deliver( _ context.Context, webhookDB *gorm.DB, d *database.Delivery, _ *Task, _ Scheduler, ) { t.eng.log.Info( "webhook event delivered to log target", "delivery_id", d.ID, "event_id", d.EventID, "target_id", d.TargetID, "target_name", d.Target.Name, "webhook_id", d.Event.WebhookID, "entrypoint_id", d.Event.EntrypointID, "method", d.Event.Method, "content_type", d.Event.ContentType, "headers", d.Event.Headers, "body", d.Event.Body, ) t.eng.recordResult( webhookDB, d, 1, true, 0, "", "", 0, ) t.eng.updateDeliveryStatus( webhookDB, d, database.DeliveryStatusDelivered, ) }