| import { getSystemDatabase } from '../auth/system-database'; |
| import type { WebhookEventType, WebhookPayload, WebhookEvent } from './types'; |
|
|
| const WEBHOOK_URL = process.env.WEBHOOK_URL; |
|
|
| export function isWebhookEnabled(): boolean { |
| return !!WEBHOOK_URL; |
| } |
|
|
| export function enqueueEvent(eventType: WebhookEventType, payload: WebhookPayload): void { |
| if (!isWebhookEnabled()) return; |
|
|
| const db = getSystemDatabase(); |
| db.prepare( |
| 'INSERT INTO webhook_outbox (event_type, payload) VALUES (?, ?)' |
| ).run(eventType, JSON.stringify(payload)); |
| } |
|
|
| export function getPendingEvents(limit = 50): WebhookEvent[] { |
| const db = getSystemDatabase(); |
| return db.prepare( |
| 'SELECT * FROM webhook_outbox WHERE delivered = 0 AND attempts < 10 ORDER BY id ASC LIMIT ?' |
| ).all(limit) as WebhookEvent[]; |
| } |
|
|
| export function markDelivered(id: number): void { |
| const db = getSystemDatabase(); |
| db.prepare( |
| "UPDATE webhook_outbox SET delivered = 1, delivered_at = datetime('now') WHERE id = ?" |
| ).run(id); |
| } |
|
|
| export function markFailed(id: number): void { |
| const db = getSystemDatabase(); |
| db.prepare( |
| "UPDATE webhook_outbox SET attempts = attempts + 1, last_attempted_at = datetime('now') WHERE id = ?" |
| ).run(id); |
| } |
|
|
| export function pruneDelivered(olderThanDays = 7): void { |
| const db = getSystemDatabase(); |
| db.prepare( |
| "DELETE FROM webhook_outbox WHERE delivered = 1 AND delivered_at < datetime('now', ?)" |
| ).run(`-${olderThanDays} days`); |
| } |
|
|