Subscriptions now declare a `verb` (create | delete | bulk-create). POST /:did/webhooks defaults to inserting both create and delete rows when no verb is given, preserving existing all-events behavior. Update events fold into the create verb. The new bulk-create verb debounces creates per DID over 400 ms and delivers a `records` array. Migration adds the verb column with default 'create' and clones every existing row for the delete verb so legacy subscriptions keep firing on both events.
84 lines
1.7 KiB
TypeScript
84 lines
1.7 KiB
TypeScript
import { db } from "../data/db.ts";
|
|
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS note (
|
|
title TEXT NOT NULL,
|
|
publishedAt DATETIME,
|
|
createdAt DATETIME NOT NULL,
|
|
did TEXT NOT NULL,
|
|
rkey TEXT NOT NULL,
|
|
discoverable INTEGER NOT NULL DEFAULT 1,
|
|
PRIMARY KEY (did, rkey)
|
|
);
|
|
`);
|
|
|
|
try {
|
|
db.exec(
|
|
`ALTER TABLE note ADD COLUMN listed INTEGER NOT NULL DEFAULT 1;`,
|
|
);
|
|
} catch {
|
|
// Column already exists — no-op
|
|
}
|
|
|
|
try {
|
|
db.exec(
|
|
`ALTER TABLE note ADD COLUMN language STRING;`,
|
|
);
|
|
} catch {
|
|
// Column already exists — no-op
|
|
}
|
|
|
|
try {
|
|
db.exec(`ALTER TABLE note RENAME COLUMN listed TO discoverable;`);
|
|
} catch {
|
|
// Column already renamed or doesn't exist — no-op
|
|
}
|
|
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS state (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS webhook_subscription (
|
|
id INTEGER PRIMARY KEY,
|
|
did TEXT NOT NULL,
|
|
method TEXT NOT NULL,
|
|
url TEXT NOT NULL
|
|
);
|
|
`);
|
|
|
|
db.exec(`
|
|
CREATE INDEX IF NOT EXISTS idx_webhook_subscription_did
|
|
ON webhook_subscription(did);
|
|
`);
|
|
|
|
try {
|
|
db.exec(`ALTER TABLE webhook_subscription ADD COLUMN token TEXT;`);
|
|
} catch {
|
|
// Column already exists — no-op
|
|
}
|
|
|
|
try {
|
|
db.exec(
|
|
`ALTER TABLE webhook_subscription ADD COLUMN verb TEXT NOT NULL DEFAULT 'create';`,
|
|
);
|
|
db.exec(`
|
|
INSERT INTO webhook_subscription (did, method, url, token, verb)
|
|
SELECT did, method, url, token, 'delete'
|
|
FROM webhook_subscription
|
|
WHERE verb = 'create';
|
|
`);
|
|
} catch {
|
|
// Column already exists — backfill already happened on a previous run.
|
|
}
|
|
|
|
db.exec(`
|
|
CREATE INDEX IF NOT EXISTS idx_webhook_subscription_did_verb
|
|
ON webhook_subscription(did, verb);
|
|
`);
|
|
|
|
db.close();
|