CREATE TABLE IF NOT EXISTS users ( id UUID NOT NULL PRIMARY KEY, uid TEXT UNIQUE NOT NULL, email TEXT NOT NULL ); CREATE INDEX ON users (uid); CREATE TABLE IF NOT EXISTS csrf_tokens ( id UUID NOT NULL PRIMARY KEY, user_id UUID REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL ); CREATE INDEX ON csrf_tokens (created_at); CREATE TABLE teams ( id UUID NOT NULL PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE team_memberships ( roles TEXT[] NOT NULL DEFAULT '{}', team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, PRIMARY KEY (team_id, user_id) ); CREATE INDEX ON team_memberships (team_id); CREATE INDEX ON team_memberships (user_id); CREATE TABLE api_keys ( id UUID NOT NULL PRIMARY KEY, team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), last_used_at TIMESTAMPTZ ); CREATE INDEX ON api_Keys (team_id); CREATE TABLE projects ( id UUID NOT NULL PRIMARY KEY, team_id UUID NOT NULL REFERENCES teams(id), name TEXT NOT NULL, UNIQUE (team_id, name) ); CREATE INDEX ON projects(team_id); CREATE TABLE IF NOT EXISTS channels ( id UUID NOT NULL PRIMARY KEY, team_id UUID NOT NULL REFERENCES teams(id) ON DELETE CASCADE, name TEXT NOT NULL, enable_by_default BOOLEAN NOT NULL DEFAULT FALSE, backend_config JSONB NOT NULL DEFAULT '{}'::JSONB ); CREATE TABLE IF NOT EXISTS channel_selections ( project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE, channel_id UUID NOT NULL REFERENCES channels(id) ON DELETE CASCADE, PRIMARY KEY (project_id, channel_id) ); CREATE INDEX ON channel_selections (project_id); CREATE INDEX ON channel_selections (channel_id);