From 653933270f9ed027728677951aab17e0e57be220 Mon Sep 17 00:00:00 2001 From: arsam Date: Fri, 18 Sep 2026 23:13:49 +0330 Subject: [PATCH] Import source: src-tauri/migrations/0001_init.sql Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality. --- src-tauri/migrations/0001_init.sql | 80 ++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src-tauri/migrations/0001_init.sql diff --git a/src-tauri/migrations/0001_init.sql b/src-tauri/migrations/0001_init.sql new file mode 100644 index 0000000..8d9a57d --- /dev/null +++ b/src-tauri/migrations/0001_init.sql @@ -0,0 +1,80 @@ +-- Notara initial schema (see PLAN.md — Data Model) + +CREATE TABLE workspace_meta ( + id INTEGER PRIMARY KEY CHECK (id = 1), + name TEXT NOT NULL DEFAULT 'My Workspace', + theme TEXT NOT NULL DEFAULT 'system', + accent TEXT NOT NULL DEFAULT '#2383e2', + onboarded INTEGER NOT NULL DEFAULT 0, + last_page_id TEXT, + settings JSON NOT NULL DEFAULT '{}' +); +INSERT INTO workspace_meta (id) VALUES (1); + +CREATE TABLE pages ( + id TEXT PRIMARY KEY, + parent_id TEXT REFERENCES pages(id) ON DELETE CASCADE, + title TEXT NOT NULL DEFAULT '', + icon TEXT, + cover TEXT, + sort_order REAL NOT NULL DEFAULT 0, + is_favorite INTEGER NOT NULL DEFAULT 0, + in_trash INTEGER NOT NULL DEFAULT 0, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL +); +CREATE INDEX idx_pages_parent ON pages(parent_id); +CREATE INDEX idx_pages_trash ON pages(in_trash); + +-- Page body as a Yjs document (CRDT): Y.encodeStateAsUpdate(doc) +CREATE TABLE page_docs ( + page_id TEXT PRIMARY KEY REFERENCES pages(id) ON DELETE CASCADE, + ydoc BLOB NOT NULL +); + +CREATE TABLE databases ( + id TEXT PRIMARY KEY, + page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE, + name TEXT NOT NULL DEFAULT '' +); + +CREATE TABLE db_properties ( + id TEXT PRIMARY KEY, + database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, + name TEXT NOT NULL, + type TEXT NOT NULL, + config JSON NOT NULL DEFAULT '{}', + sort_order REAL NOT NULL DEFAULT 0 +); +CREATE INDEX idx_props_db ON db_properties(database_id); + +CREATE TABLE db_rows ( + id TEXT PRIMARY KEY, + database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, + page_id TEXT NOT NULL REFERENCES pages(id) ON DELETE CASCADE, + sort_order REAL NOT NULL DEFAULT 0 +); +CREATE INDEX idx_rows_db ON db_rows(database_id); + +CREATE TABLE db_values ( + row_id TEXT NOT NULL REFERENCES db_rows(id) ON DELETE CASCADE, + property_id TEXT NOT NULL REFERENCES db_properties(id) ON DELETE CASCADE, + value JSON, + PRIMARY KEY (row_id, property_id) +); + +CREATE TABLE db_views ( + id TEXT PRIMARY KEY, + database_id TEXT NOT NULL REFERENCES databases(id) ON DELETE CASCADE, + name TEXT NOT NULL, + type TEXT NOT NULL, + filters JSON NOT NULL DEFAULT '[]', + sorts JSON NOT NULL DEFAULT '[]', + groups JSON NOT NULL DEFAULT 'null', + visible_props JSON NOT NULL DEFAULT 'null', + sort_order REAL NOT NULL DEFAULT 0 +); +CREATE INDEX idx_views_db ON db_views(database_id); + +-- Full-text search mirror (title + plain-text body extracted from the Y.Doc) +CREATE VIRTUAL TABLE pages_fts USING fts5(page_id UNINDEXED, title, body);