Files
synapbus/internal/storage/schema/017_wiki.sql
T

62 lines
2.1 KiB
SQL

-- 017: Wiki articles, revisions, link graph, and FTS
-- Wiki articles
CREATE TABLE IF NOT EXISTS articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL UNIQUE CHECK(length(slug) >= 2 AND length(slug) <= 100),
title TEXT NOT NULL,
body TEXT NOT NULL DEFAULT '',
created_by TEXT NOT NULL,
updated_by TEXT NOT NULL,
revision INTEGER NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_articles_slug ON articles(slug);
CREATE INDEX idx_articles_updated_at ON articles(updated_at);
-- Revision history (full body per revision)
CREATE TABLE IF NOT EXISTS article_revisions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_id INTEGER NOT NULL REFERENCES articles(id) ON DELETE CASCADE,
revision INTEGER NOT NULL,
body TEXT NOT NULL,
changed_by TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_article_revisions_article ON article_revisions(article_id, revision);
-- Link graph (rebuilt on every article create/update)
CREATE TABLE IF NOT EXISTS article_links (
from_slug TEXT NOT NULL,
to_slug TEXT NOT NULL,
display_text TEXT,
PRIMARY KEY (from_slug, to_slug)
);
CREATE INDEX idx_article_links_to ON article_links(to_slug);
-- FTS5 for article search
CREATE VIRTUAL TABLE IF NOT EXISTS articles_fts USING fts5(
title,
body,
content='articles',
content_rowid='id'
);
-- FTS sync triggers
CREATE TRIGGER articles_fts_ai AFTER INSERT ON articles BEGIN
INSERT INTO articles_fts(rowid, title, body) VALUES (new.id, new.title, new.body);
END;
CREATE TRIGGER articles_fts_ad AFTER DELETE ON articles BEGIN
INSERT INTO articles_fts(articles_fts, rowid, title, body) VALUES('delete', old.id, old.title, old.body);
END;
CREATE TRIGGER articles_fts_au AFTER UPDATE ON articles BEGIN
INSERT INTO articles_fts(articles_fts, rowid, title, body) VALUES('delete', old.id, old.title, old.body);
INSERT INTO articles_fts(rowid, title, body) VALUES (new.id, new.title, new.body);
END;
INSERT INTO schema_migrations (version) VALUES (17);