Skip to main content

max / balanced_breakfast

3.2 KB · 95 lines History Blame Raw
1 -- Feature: Reading List (bookmarks)
2 -- Database-backed bookmark manager replacing localStorage saved articles.
3
4 CREATE TABLE IF NOT EXISTS bookmarks (
5 id TEXT PRIMARY KEY,
6 url TEXT NOT NULL,
7 title TEXT NOT NULL DEFAULT '',
8 description TEXT NOT NULL DEFAULT '',
9 author TEXT NOT NULL DEFAULT '',
10 source_name TEXT NOT NULL DEFAULT '',
11 feed_item_id TEXT REFERENCES feed_items(id) ON DELETE SET NULL,
12 notes TEXT NOT NULL DEFAULT '',
13 is_pinned INTEGER NOT NULL DEFAULT 0,
14 created_at TEXT NOT NULL,
15 updated_at TEXT NOT NULL
16 );
17
18 CREATE INDEX idx_bookmarks_url ON bookmarks(url);
19 CREATE INDEX idx_bookmarks_feed_item_id ON bookmarks(feed_item_id);
20 CREATE INDEX idx_bookmarks_created_at ON bookmarks(created_at);
21
22 CREATE TABLE IF NOT EXISTS bookmark_tags (
23 bookmark_id TEXT NOT NULL REFERENCES bookmarks(id) ON DELETE CASCADE,
24 tag TEXT NOT NULL,
25 PRIMARY KEY (bookmark_id, tag)
26 );
27
28 CREATE INDEX idx_bookmark_tags_tag ON bookmark_tags(tag);
29
30 -- ── Triggers: bookmarks ──
31
32 CREATE TRIGGER sync_bookmarks_insert AFTER INSERT ON bookmarks
33 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
34 BEGIN
35 INSERT INTO sync_changelog (table_name, op, row_id, data)
36 VALUES ('bookmarks', 'INSERT', NEW.id, json_object(
37 'id', NEW.id,
38 'url', NEW.url,
39 'title', NEW.title,
40 'description', NEW.description,
41 'author', NEW.author,
42 'source_name', NEW.source_name,
43 'feed_item_id', NEW.feed_item_id,
44 'notes', NEW.notes,
45 'is_pinned', NEW.is_pinned,
46 'created_at', NEW.created_at,
47 'updated_at', NEW.updated_at
48 ));
49 END;
50
51 CREATE TRIGGER sync_bookmarks_update AFTER UPDATE ON bookmarks
52 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
53 BEGIN
54 INSERT INTO sync_changelog (table_name, op, row_id, data)
55 VALUES ('bookmarks', 'UPDATE', NEW.id, json_object(
56 'id', NEW.id,
57 'url', NEW.url,
58 'title', NEW.title,
59 'description', NEW.description,
60 'author', NEW.author,
61 'source_name', NEW.source_name,
62 'feed_item_id', NEW.feed_item_id,
63 'notes', NEW.notes,
64 'is_pinned', NEW.is_pinned,
65 'created_at', NEW.created_at,
66 'updated_at', NEW.updated_at
67 ));
68 END;
69
70 CREATE TRIGGER sync_bookmarks_delete AFTER DELETE ON bookmarks
71 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
72 BEGIN
73 INSERT INTO sync_changelog (table_name, op, row_id)
74 VALUES ('bookmarks', 'DELETE', OLD.id);
75 END;
76
77 -- ── Triggers: bookmark_tags ──
78
79 CREATE TRIGGER sync_bookmark_tags_insert AFTER INSERT ON bookmark_tags
80 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
81 BEGIN
82 INSERT INTO sync_changelog (table_name, op, row_id, data)
83 VALUES ('bookmark_tags', 'INSERT', NEW.bookmark_id || ':' || NEW.tag, json_object(
84 'bookmark_id', NEW.bookmark_id,
85 'tag', NEW.tag
86 ));
87 END;
88
89 CREATE TRIGGER sync_bookmark_tags_delete AFTER DELETE ON bookmark_tags
90 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
91 BEGIN
92 INSERT INTO sync_changelog (table_name, op, row_id)
93 VALUES ('bookmark_tags', 'DELETE', OLD.bookmark_id || ':' || OLD.tag);
94 END;
95