···11+-- OAuth tokens and AT-URI storage for AT Protocol integration
22+-- Adds tables for OAuth session management and AT-URI references
33+44+-- OAuth sessions for tracking authorization flow state
55+CREATE TABLE oauth_sessions (
66+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
77+ state TEXT NOT NULL UNIQUE,
88+ code_verifier TEXT NOT NULL,
99+ dpop_private_key BYTEA NOT NULL,
1010+ did TEXT,
1111+ pds_url TEXT,
1212+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
1313+ expires_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + INTERVAL '10 minutes'
1414+);
1515+1616+CREATE INDEX idx_oauth_sessions_state ON oauth_sessions(state);
1717+CREATE INDEX idx_oauth_sessions_expires_at ON oauth_sessions(expires_at);
1818+1919+-- OAuth tokens for authenticated users
2020+CREATE TABLE oauth_tokens (
2121+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
2222+ did TEXT NOT NULL UNIQUE,
2323+ pds_url TEXT NOT NULL,
2424+ access_token TEXT NOT NULL,
2525+ refresh_token TEXT,
2626+ token_type TEXT NOT NULL DEFAULT 'DPoP',
2727+ expires_at TIMESTAMPTZ,
2828+ dpop_private_key BYTEA NOT NULL,
2929+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
3030+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
3131+);
3232+3333+CREATE INDEX idx_oauth_tokens_did ON oauth_tokens(did);
3434+3535+CREATE TRIGGER update_oauth_tokens_updated_at BEFORE UPDATE ON oauth_tokens
3636+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
3737+3838+-- Add AT-URI columns to existing tables for tracking PDS record references
3939+ALTER TABLE decks ADD COLUMN at_uri TEXT;
4040+ALTER TABLE cards ADD COLUMN at_uri TEXT;
4141+ALTER TABLE notes ADD COLUMN at_uri TEXT;
4242+4343+CREATE INDEX idx_decks_at_uri ON decks(at_uri) WHERE at_uri IS NOT NULL;
4444+CREATE INDEX idx_cards_at_uri ON cards(at_uri) WHERE at_uri IS NOT NULL;
4545+CREATE INDEX idx_notes_at_uri ON notes(at_uri) WHERE at_uri IS NOT NULL;
4646+4747+-- Cleanup job for expired sessions (run periodically via cron or similar)
4848+-- DELETE FROM oauth_sessions WHERE expires_at < NOW();