-- 001_initial.sql CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, password_hash TEXT, avatar_url TEXT DEFAULT '', oauth_provider TEXT, oauth_id TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE UNIQUE INDEX IF NOT EXISTS idx_users_oauth ON users(oauth_provider, oauth_id) WHERE oauth_provider IS NOT NULL; CREATE TABLE IF NOT EXISTS repos ( id TEXT PRIMARY KEY, name TEXT NOT NULL, slug TEXT NOT NULL, description TEXT DEFAULT '', owner_id TEXT NOT NULL REFERENCES users(id), visibility TEXT DEFAULT 'private' CHECK(visibility IN ('private','public','unlisted')), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE UNIQUE INDEX IF NOT EXISTS idx_repos_owner_slug ON repos(owner_id, slug); CREATE TABLE IF NOT EXISTS repo_collaborators ( repo_id TEXT NOT NULL REFERENCES repos(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, role TEXT NOT NULL DEFAULT 'viewer' CHECK(role IN ('owner','editor','commenter','viewer')), PRIMARY KEY (repo_id, user_id) ); CREATE TABLE IF NOT EXISTS files ( id TEXT PRIMARY KEY, repo_id TEXT NOT NULL REFERENCES repos(id) ON DELETE CASCADE, path TEXT NOT NULL, content TEXT DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE UNIQUE INDEX IF NOT EXISTS idx_files_repo_path ON files(repo_id, path); CREATE TABLE IF NOT EXISTS versions ( id TEXT PRIMARY KEY, file_id TEXT NOT NULL REFERENCES files(id) ON DELETE CASCADE, content TEXT NOT NULL, author_id TEXT NOT NULL REFERENCES users(id), message TEXT DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_versions_file ON versions(file_id, created_at DESC); CREATE TABLE IF NOT EXISTS comments ( id TEXT PRIMARY KEY, file_id TEXT NOT NULL REFERENCES files(id) ON DELETE CASCADE, version_id TEXT REFERENCES versions(id), line_start INTEGER NOT NULL, line_end INTEGER NOT NULL, content_hash TEXT DEFAULT '', body TEXT NOT NULL, author_id TEXT NOT NULL REFERENCES users(id), parent_id TEXT REFERENCES comments(id), resolved INTEGER DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_comments_file ON comments(file_id);