Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

g1t.sh
46 linesCodeBlameRaw
1-- Permanent tombstones for erased people and workspaces (src/erasure.ts),
2-- and the channels a purge still has to visit.
3CREATE TABLE erased_subjects (id TEXT PRIMARY KEY, kind TEXT NOT NULL);
4CREATE TABLE purge_channels (subject_id TEXT NOT NULL, channel_id TEXT NOT NULL, PRIMARY KEY(subject_id, channel_id));
5
6-- A purge finds a person's messages, reactions and channels without scanning every row.
7CREATE INDEX messages_by_author ON messages (author);
8CREATE INDEX reactions_by_principal ON reactions (principal);
9CREATE INDEX channels_by_creator ON channels (created_by);
10
11-- Late, in-flight writes cannot recreate the erased person's membership,
12-- messages or reactions. Each looks the tombstone up by its key.
13CREATE TRIGGER erased_message BEFORE INSERT ON messages WHEN NEW.author LIKE 'user:%' AND EXISTS (
14 SELECT 1 FROM erased_subjects WHERE id = substr(NEW.author, 6) AND kind = 'user'
15) BEGIN SELECT RAISE(IGNORE); END;
16CREATE TRIGGER erased_member BEFORE INSERT ON channel_members WHEN NEW.principal LIKE 'user:%' AND EXISTS (
17 SELECT 1 FROM erased_subjects WHERE id = substr(NEW.principal, 6) AND kind = 'user'
18) BEGIN SELECT RAISE(IGNORE); END;
19CREATE TRIGGER erased_reaction BEFORE INSERT ON reactions WHEN (NEW.principal LIKE 'user:%' AND EXISTS (
20 SELECT 1 FROM erased_subjects WHERE id = substr(NEW.principal, 6) AND kind = 'user'
21)) OR NOT EXISTS (SELECT 1 FROM messages WHERE id = NEW.message_id) BEGIN SELECT RAISE(IGNORE); END;
22
23-- Nothing of an erased workspace comes back.
24CREATE TRIGGER erased_channel BEFORE INSERT ON channels WHEN EXISTS (
25 SELECT 1 FROM erased_subjects WHERE id = NEW.workspace_id AND kind = 'workspace'
26) BEGIN SELECT RAISE(IGNORE); END;
27CREATE TRIGGER erased_general_joined BEFORE INSERT ON general_joined WHEN EXISTS (
28 SELECT 1 FROM erased_subjects WHERE id = NEW.workspace_id AND kind = 'workspace'
29) BEGIN SELECT RAISE(IGNORE); END;
30CREATE TRIGGER erased_custom_emoji BEFORE INSERT ON custom_emoji WHEN EXISTS (
31 SELECT 1 FROM erased_subjects WHERE id = NEW.workspace_id AND kind = 'workspace'
32) BEGIN SELECT RAISE(IGNORE); END;
33CREATE TRIGGER erased_chat_settings BEFORE INSERT ON chat_settings WHEN EXISTS (
34 SELECT 1 FROM erased_subjects WHERE id = NEW.workspace_id AND kind = 'workspace'
35) BEGIN SELECT RAISE(IGNORE); END;
36CREATE TRIGGER erased_chat_meter BEFORE INSERT ON chat_meter WHEN EXISTS (
37 SELECT 1 FROM erased_subjects WHERE id = NEW.workspace_id AND kind = 'workspace'
38) BEGIN SELECT RAISE(IGNORE); END;
39
40-- A message or member of a channel that is gone (an erased one) is not kept.
41CREATE TRIGGER orphan_message BEFORE INSERT ON messages WHEN NOT EXISTS (
42 SELECT 1 FROM channels WHERE id = NEW.channel_id
43) BEGIN SELECT RAISE(IGNORE); END;
44CREATE TRIGGER orphan_member BEFORE INSERT ON channel_members WHEN NOT EXISTS (
45 SELECT 1 FROM channels WHERE id = NEW.channel_id
46) BEGIN SELECT RAISE(IGNORE); END;