huddle_core/storage/
schema.rs1pub const MIGRATIONS: &[&str] = &[
2 "CREATE TABLE IF NOT EXISTS identity (
4 id INTEGER PRIMARY KEY CHECK (id = 1),
5 ed25519_secret BLOB NOT NULL,
6 olm_account_data BLOB,
7 created_at INTEGER NOT NULL
8 );",
9 "CREATE TABLE IF NOT EXISTS rooms (
11 id TEXT PRIMARY KEY,
12 name TEXT NOT NULL,
13 creator_fingerprint TEXT NOT NULL,
14 encrypted INTEGER NOT NULL,
15 passphrase_salt BLOB,
16 created_at INTEGER NOT NULL,
17 last_active INTEGER
18 );",
19 "CREATE TABLE IF NOT EXISTS room_megolm_sessions (
21 room_id TEXT NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
22 sender_fingerprint TEXT NOT NULL,
23 session_id TEXT NOT NULL,
24 session_data BLOB NOT NULL,
25 is_outbound INTEGER NOT NULL,
26 created_at INTEGER NOT NULL,
27 PRIMARY KEY (room_id, sender_fingerprint, session_id)
28 );",
29 "CREATE TABLE IF NOT EXISTS room_members (
31 room_id TEXT NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
32 peer_id TEXT NOT NULL,
33 fingerprint TEXT NOT NULL,
34 last_seen INTEGER,
35 PRIMARY KEY (room_id, peer_id)
36 );",
37 "CREATE TABLE IF NOT EXISTS room_messages (
38 id INTEGER PRIMARY KEY AUTOINCREMENT,
39 room_id TEXT NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
40 sender_fingerprint TEXT NOT NULL,
41 direction TEXT NOT NULL CHECK (direction IN ('in', 'out')),
42 body TEXT NOT NULL,
43 sent_at INTEGER NOT NULL
44 );",
45 "CREATE INDEX IF NOT EXISTS idx_room_messages_room ON room_messages(room_id, sent_at);",
46 "CREATE INDEX IF NOT EXISTS idx_room_members_room ON room_members(room_id);",
47 "CREATE TABLE IF NOT EXISTS known_peers (
50 address TEXT PRIMARY KEY,
51 label TEXT,
52 last_connected_at INTEGER,
53 last_attempt_at INTEGER,
54 created_at INTEGER NOT NULL
55 );",
56 "CREATE TABLE IF NOT EXISTS room_attachments (
60 id INTEGER PRIMARY KEY AUTOINCREMENT,
61 room_id TEXT NOT NULL REFERENCES rooms(id) ON DELETE CASCADE,
62 message_id INTEGER,
63 sender_fingerprint TEXT NOT NULL,
64 file_id TEXT NOT NULL,
65 name TEXT NOT NULL,
66 mime TEXT,
67 size_bytes INTEGER NOT NULL,
68 status TEXT NOT NULL CHECK (status IN ('offered','downloading','ready','saved','failed','cancelled')),
69 cache_path TEXT,
70 saved_path TEXT,
71 error TEXT,
72 encrypted INTEGER NOT NULL DEFAULT 0,
73 wrapped_key TEXT,
74 nonce TEXT,
75 megolm_session_id TEXT,
76 created_at INTEGER NOT NULL,
77 UNIQUE(room_id, file_id)
78 );",
79 "CREATE INDEX IF NOT EXISTS idx_room_attachments_room ON room_attachments(room_id);",
80 "ALTER TABLE room_attachments ADD COLUMN megolm_session_id TEXT;",
82 "ALTER TABLE room_members ADD COLUMN verified INTEGER NOT NULL DEFAULT 0;",
85 "ALTER TABLE rooms ADD COLUMN muted INTEGER NOT NULL DEFAULT 0;",
87 "ALTER TABLE identity ADD COLUMN display_name TEXT;",
90 "ALTER TABLE room_members ADD COLUMN display_name TEXT;",
91];