-- Chat Switchboard — 010 Projects (SQLite) CREATE TABLE IF NOT EXISTS projects ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, color TEXT, icon TEXT, scope TEXT NOT NULL DEFAULT 'personal' CHECK (scope IN ('personal', 'team', 'global')), owner_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, team_id TEXT REFERENCES teams(id) ON DELETE SET NULL, workspace_id TEXT REFERENCES workspaces(id) ON DELETE SET NULL, is_archived INTEGER NOT NULL DEFAULT 0, settings TEXT DEFAULT '{}', created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_projects_owner ON projects(owner_id); CREATE INDEX IF NOT EXISTS idx_projects_team ON projects(team_id); CREATE INDEX IF NOT EXISTS idx_projects_scope ON projects(scope); CREATE INDEX IF NOT EXISTS idx_projects_workspace ON projects(workspace_id); CREATE TABLE IF NOT EXISTS project_channels ( project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE, position INTEGER NOT NULL DEFAULT 0, folder TEXT, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (project_id, channel_id), UNIQUE (channel_id) ); CREATE INDEX IF NOT EXISTS idx_project_channels_project ON project_channels(project_id); CREATE INDEX IF NOT EXISTS idx_project_channels_channel ON project_channels(channel_id); CREATE TABLE IF NOT EXISTS project_knowledge_bases ( project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, kb_id TEXT NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE, auto_search INTEGER NOT NULL DEFAULT 0, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (project_id, kb_id) ); CREATE INDEX IF NOT EXISTS idx_project_kb_project ON project_knowledge_bases(project_id); CREATE INDEX IF NOT EXISTS idx_project_kb_kb ON project_knowledge_bases(kb_id); CREATE TABLE IF NOT EXISTS project_notes ( project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (project_id, note_id) ); CREATE INDEX IF NOT EXISTS idx_project_notes_project ON project_notes(project_id); CREATE INDEX IF NOT EXISTS idx_project_notes_note ON project_notes(note_id); -- Cross-domain FK columns on channels (SQLite cannot ADD COLUMN with FK in all cases, -- so these may already exist from initial channel creation — safe to skip on error) -- ALTER TABLE channels ADD COLUMN project_id TEXT REFERENCES projects(id) ON DELETE SET NULL; -- ALTER TABLE channels ADD COLUMN workspace_id TEXT REFERENCES workspaces(id) ON DELETE SET NULL; -- Note: SQLite ADD COLUMN IF NOT EXISTS not supported; channels table created with these columns.