Skip to main content

max / goingson

2.6 KB · 74 lines History Blame Raw
1 -- File attachments on tasks and projects, synced via SyncKit blob API.
2 -- Email attachment metadata column for auto-carry on email→task conversion.
3
4 -- ============ Attachments Table ============
5
6 CREATE TABLE IF NOT EXISTS attachments (
7 id TEXT PRIMARY KEY NOT NULL,
8 user_id TEXT NOT NULL REFERENCES users(id),
9 task_id TEXT REFERENCES tasks(id) ON DELETE CASCADE,
10 project_id TEXT REFERENCES projects(id) ON DELETE CASCADE,
11 filename TEXT NOT NULL,
12 file_size INTEGER NOT NULL,
13 mime_type TEXT NOT NULL DEFAULT 'application/octet-stream',
14 blob_hash TEXT NOT NULL,
15 source_email_id TEXT REFERENCES emails(id) ON DELETE SET NULL,
16 created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
17 );
18
19 CREATE INDEX idx_attachments_task ON attachments(task_id);
20 CREATE INDEX idx_attachments_project ON attachments(project_id);
21 CREATE INDEX idx_attachments_blob_hash ON attachments(blob_hash);
22
23 -- ============ Email Attachment Metadata ============
24
25 ALTER TABLE emails ADD COLUMN attachment_meta TEXT;
26
27 -- ============ Sync Triggers ============
28
29 CREATE TRIGGER IF NOT EXISTS sync_trg_attachments_insert
30 AFTER INSERT ON attachments
31 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
32 BEGIN
33 INSERT INTO sync_changelog (table_name, op, row_id, data)
34 VALUES ('attachments', 'INSERT', NEW.id, json_object(
35 'id', NEW.id,
36 'user_id', NEW.user_id,
37 'task_id', NEW.task_id,
38 'project_id', NEW.project_id,
39 'filename', NEW.filename,
40 'file_size', NEW.file_size,
41 'mime_type', NEW.mime_type,
42 'blob_hash', NEW.blob_hash,
43 'source_email_id', NEW.source_email_id,
44 'created_at', NEW.created_at
45 ));
46 END;
47
48 CREATE TRIGGER IF NOT EXISTS sync_trg_attachments_update
49 AFTER UPDATE ON attachments
50 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
51 BEGIN
52 INSERT INTO sync_changelog (table_name, op, row_id, data)
53 VALUES ('attachments', 'UPDATE', NEW.id, json_object(
54 'id', NEW.id,
55 'user_id', NEW.user_id,
56 'task_id', NEW.task_id,
57 'project_id', NEW.project_id,
58 'filename', NEW.filename,
59 'file_size', NEW.file_size,
60 'mime_type', NEW.mime_type,
61 'blob_hash', NEW.blob_hash,
62 'source_email_id', NEW.source_email_id,
63 'created_at', NEW.created_at
64 ));
65 END;
66
67 CREATE TRIGGER IF NOT EXISTS sync_trg_attachments_delete
68 AFTER DELETE ON attachments
69 WHEN (SELECT value FROM sync_state WHERE key = 'applying_remote') != '1'
70 BEGIN
71 INSERT INTO sync_changelog (table_name, op, row_id, data)
72 VALUES ('attachments', 'DELETE', OLD.id, NULL);
73 END;
74