Skip to main content

huddle_core/storage/
schema.rs

1pub const MIGRATIONS: &[&str] = &[
2    // Our Ed25519 secret. olm_account_data left for forward compat but unused.
3    "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    // Rooms we've created or joined
10    "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    // Per-room Megolm sessions: ours (outbound) and others' (inbound)
20    "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    // Known members of each room (libp2p peer_id + their fingerprint)
30    "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    // Peers we've manually dialed. We auto-reconnect on the next launch so
48    // the user doesn't have to retype an address to rejoin a room.
49    "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    // File attachments offered / received in a room. A row is created
57    // the moment we see a FileOffer; status moves through the lifecycle
58    // as chunks arrive and the user activates the card.
59    "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    // Tolerated by the migration runner if the column already exists.
81    "ALTER TABLE room_attachments ADD COLUMN megolm_session_id TEXT;",
82    // Phase 5: contact verification — user marks a member's fingerprint
83    // as verified after comparing it out-of-band. Default 0 (unverified).
84    "ALTER TABLE room_members ADD COLUMN verified INTEGER NOT NULL DEFAULT 0;",
85    // Phase 6 QoL: per-room mute flag.
86    "ALTER TABLE rooms ADD COLUMN muted INTEGER NOT NULL DEFAULT 0;",
87    // Phase 6: display names — our own, plus per-room remembered names
88    // of other members.
89    "ALTER TABLE identity ADD COLUMN display_name TEXT;",
90    "ALTER TABLE room_members ADD COLUMN display_name TEXT;",
91];