-- Chat Switchboard — 002 Teams & Access Control (SQLite) CREATE TABLE IF NOT EXISTS teams ( id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT DEFAULT '', created_by TEXT NOT NULL REFERENCES users(id) ON DELETE RESTRICT, is_active INTEGER DEFAULT 1, settings TEXT DEFAULT '{}', created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_teams_active ON teams(is_active); CREATE TABLE IF NOT EXISTS team_members ( id TEXT PRIMARY KEY, team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('admin', 'member')), joined_at TEXT DEFAULT (datetime('now')), UNIQUE(team_id, user_id) ); CREATE INDEX IF NOT EXISTS idx_team_members_team ON team_members(team_id); CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id); CREATE TABLE IF NOT EXISTS groups ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', scope TEXT NOT NULL DEFAULT 'global' CHECK (scope IN ('global', 'team')), team_id TEXT REFERENCES teams(id) ON DELETE CASCADE, created_by TEXT NOT NULL REFERENCES users(id), created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')), CHECK ( (scope = 'global' AND team_id IS NULL) OR (scope = 'team' AND team_id IS NOT NULL) ) ); CREATE UNIQUE INDEX IF NOT EXISTS idx_groups_name_scope ON groups(name, COALESCE(team_id, '')); CREATE TABLE IF NOT EXISTS group_members ( id TEXT PRIMARY KEY, group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, added_by TEXT NOT NULL REFERENCES users(id), added_at TEXT DEFAULT (datetime('now')), UNIQUE(group_id, user_id) ); CREATE INDEX IF NOT EXISTS idx_group_members_group ON group_members(group_id); CREATE INDEX IF NOT EXISTS idx_group_members_user ON group_members(user_id);