/** * Cloudflare D1 Database Client * * Provides typed access to D1 SQLite database */ /** * Cloudflare D1 Database interface * Compatible with @cloudflare/workers-types D1Database */ export interface D1Database { prepare(query: string): D1PreparedStatement; batch(statements: D1PreparedStatement[]): Promise[]>; exec(query: string): Promise; } export interface D1PreparedStatement { bind(...values: unknown[]): D1PreparedStatement; first(column?: string): Promise; all(): Promise>; run(): Promise; } export interface D1Result { results?: T[]; success: boolean; meta?: { duration: number; changes: number; last_row_id: number; }; } export interface D1ExecResult { count: number; duration: number; } export declare const SCHEMA = "\n-- Tenants\nCREATE TABLE IF NOT EXISTS tenants (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n slug TEXT UNIQUE NOT NULL,\n region TEXT NOT NULL DEFAULT 'global',\n plan TEXT NOT NULL DEFAULT 'free',\n encryption_key_id TEXT NOT NULL,\n settings TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_tenants_slug ON tenants(slug);\n\n-- Users (global)\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n email TEXT UNIQUE NOT NULL,\n email_verified INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_users_email ON users(email);\n\n-- Memberships\nCREATE TABLE IF NOT EXISTS memberships (\n tenant_id TEXT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n role TEXT NOT NULL DEFAULT 'member',\n status TEXT NOT NULL DEFAULT 'active',\n invited_by TEXT REFERENCES users(id),\n joined_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (tenant_id, user_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_memberships_user ON memberships(user_id);\n\n-- OAuth Grants\nCREATE TABLE IF NOT EXISTS photon_grants (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,\n user_id TEXT REFERENCES users(id) ON DELETE CASCADE,\n photon_id TEXT NOT NULL,\n provider TEXT NOT NULL,\n scopes TEXT NOT NULL,\n access_token_encrypted TEXT NOT NULL,\n refresh_token_encrypted TEXT,\n token_expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE (tenant_id, user_id, photon_id, provider)\n);\n\nCREATE INDEX IF NOT EXISTS idx_grants_tenant ON photon_grants(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_grants_lookup ON photon_grants(tenant_id, photon_id, provider);\n\n-- Elicitation Requests (short-lived)\nCREATE TABLE IF NOT EXISTS elicitation_requests (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n photon_id TEXT NOT NULL,\n provider TEXT NOT NULL,\n required_scopes TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n redirect_uri TEXT NOT NULL,\n code_verifier TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n expires_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_elicitation_session ON elicitation_requests(session_id);\nCREATE INDEX IF NOT EXISTS idx_elicitation_expires ON elicitation_requests(expires_at);\n"; export declare class D1Client { private db; constructor(db: D1Database); /** * Initialize the database schema */ initialize(): Promise; /** * Execute a query and return first result */ first(query: string, ...params: unknown[]): Promise; /** * Execute a query and return all results */ all(query: string, ...params: unknown[]): Promise; /** * Execute a query (INSERT, UPDATE, DELETE) */ run(query: string, ...params: unknown[]): Promise<{ changes: number; lastRowId: number; }>; /** * Execute multiple queries in a batch */ batch(queries: Array<{ sql: string; params: unknown[]; }>): Promise; } //# sourceMappingURL=d1-client.d.ts.map