-- Accounts are the shared owner namespace for users and organizations.
CREATE TABLE accounts (
id TEXT PRIMARY KEY,
name TEXT NOT NULL UNIQUE COLLATE NOCASE,
kind TEXT NOT NULL CHECK (kind IN ('user', 'org')),
display_name TEXT,
bio TEXT,
website TEXT,
created_at INTEGER NOT NULL
);
CREATE TABLE users (
account_id TEXT PRIMARY KEY REFERENCES accounts(id) ON DELETE CASCADE,
email TEXT NOT NULL UNIQUE COLLATE NOCASE,
password_hash TEXT,
github_id TEXT UNIQUE,
is_admin INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE org_members (
org_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
user_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
role TEXT NOT NULL CHECK (role IN ('owner', 'member')),
created_at INTEGER NOT NULL,
PRIMARY KEY (org_id, user_id)
);
CREATE TABLE access_tokens (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
name TEXT NOT NULL,
token_hash TEXT NOT NULL UNIQUE,
token_prefix TEXT NOT NULL,
scopes TEXT NOT NULL,
last_used_at INTEGER,
expires_at INTEGER,
created_at INTEGER NOT NULL
);
CREATE INDEX access_tokens_user ON access_tokens(user_id);