63 lines
2.9 KiB
SQL
63 lines
2.9 KiB
SQL
-- 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.
|