Files
orca/cloud/apps/push/src/database/push-schema.ts
T
Neil 33a3cd3b1f refactor(cloud): organize push service by concrete owners (#41261)
* refactor(push): organize provider, delivery, and host authentication owners

* style(push): brace moved fixture guards and cleanup
2026-11-11 14:03:10 -08:00

47 lines
1.6 KiB
TypeScript

import { DURABLE_PUSH_SCHEMA } from './durable-push-schema.js'
// Applied at startup for both dialects, including additive queue tables,
// so every column type has to read the same in SQLite and PostgreSQL.
const PUSH_SCHEMA = `
CREATE TABLE IF NOT EXISTS push_challenges (
challenge_id TEXT PRIMARY KEY,
host_fingerprint TEXT NOT NULL,
secret_hash TEXT NOT NULL,
expires_at BIGINT NOT NULL,
consumed_at BIGINT
);
CREATE INDEX IF NOT EXISTS push_challenges_expires_at ON push_challenges(expires_at);
CREATE TABLE IF NOT EXISTS push_sessions (
token_hash TEXT PRIMARY KEY,
host_fingerprint TEXT NOT NULL,
expires_at BIGINT NOT NULL,
created_at BIGINT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS push_sessions_host ON push_sessions(host_fingerprint);
CREATE INDEX IF NOT EXISTS push_sessions_expires_at ON push_sessions(expires_at);
CREATE TABLE IF NOT EXISTS push_devices (
registration_id TEXT PRIMARY KEY,
host_fingerprint TEXT NOT NULL,
device_id TEXT NOT NULL,
platform TEXT NOT NULL,
token TEXT NOT NULL,
apns_environment TEXT,
dead_at BIGINT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS push_devices_host_device
ON push_devices(host_fingerprint, device_id);
`
export function pushSchemaStatements(): string[] {
// Comments are stripped before the split so a ';' inside one cannot cut a
// statement in half and hand SQLite an "incomplete input" fragment.
return (PUSH_SCHEMA + DURABLE_PUSH_SCHEMA)
.replace(/--[^\n]*/g, '')
.split(';')
.map((statement) => statement.trim())
.filter((statement) => statement.length > 0)
}