NobGit
public anord read

Ledger

Why work hard when you can work easier?

Languages

Repository composition by tracked source files.

TypeScript
TypeScript 86% CSS 10% SQL 3% Shell 1% HTML 0%
Create file Wiki Documentation
Clone
https://nobgit.com/orgs/anord/ledger.git
ssh://[email protected]:2222/orgs/anord/ledger.git
webhooks.ts
import crypto from "node:crypto";
import { Queue } from "bullmq";
import Redis from "ioredis";
import { env } from "../config/env.js";
import { pool } from "../db/pool.js";

const connection = new Redis(env.REDIS_URL, {
  maxRetriesPerRequest: null
});
const queue = new Queue("ledger-jobs", { connection });

export async function enqueueWebhookEvent(
  eventName: string,
  data: Record<string, unknown>,
  options?: {
    actor?: { id: string; name: string; email: string } | null;
    workspaceId?: string | null;
  }
) {
  const webhooks = await pool.query(
    `SELECT id FROM webhooks WHERE is_active = true AND events @> $1::jsonb`,
    [JSON.stringify([eventName])]
  );

  const payload = {
    id: crypto.randomUUID(),
    event: eventName,
    createdAt: new Date().toISOString(),
    workspaceId: options?.workspaceId ?? null,
    actor: options?.actor ?? null,
    data
  };

  for (const row of webhooks.rows) {
    const delivery = await pool.query(
      `INSERT INTO webhook_deliveries (webhook_id, event_name, payload)
       VALUES ($1, $2, $3)
       RETURNING id`,
      [row.id, eventName, JSON.stringify(payload)]
    );

    await queue.add("webhook.deliver", {
      deliveryId: delivery.rows[0].id
    }, {
      attempts: 3,
      backoff: {
        type: "exponential",
        delay: 5000
      }
    });
  }
}