OXYGENHUB
◆ v0.1.0 spectra / crates / spectra-core / migrations / 0004_conversation.sql
1.9 KiB · SQL · last changed Channels, threads, messages, the inbox and full-text search, shared by every interface (#6) 2 days ago source blame history raw
5eb57578 Andy McCall ↶ 1
-- Conversation (spec §10): channels, messages and threads, reactions, each
2
-- principal's inbox, and full-text search over messages (§13.1).
3
CREATE TABLE channels (
4
    id        TEXT PRIMARY KEY,
5
    name      TEXT NOT NULL UNIQUE,     -- general, humans, system, a project's name, or dm:A+B
6
    kind      TEXT NOT NULL,            -- project | shared | direct | system
7
    project   TEXT,
8
    purpose   TEXT,
9
    members   TEXT NOT NULL,            -- JSON array of actors; empty: everyone
10
    seq       INTEGER NOT NULL
11
);
12
13
CREATE TABLE messages (
14
    id              TEXT PRIMARY KEY,
15
    channel         TEXT NOT NULL,
16
    reply_to        TEXT,
17
    author          TEXT NOT NULL,      -- the event's actor
18
    kind            TEXT NOT NULL,
19
    body            TEXT NOT NULL,
20
    payload         TEXT,
21
    mentions        TEXT NOT NULL,      -- JSON array of actors
22
    refs            TEXT NOT NULL,      -- JSON array
23
    at_ms           INTEGER NOT NULL,
24
    seq             INTEGER NOT NULL,
25
    replies         INTEGER NOT NULL DEFAULT 0,
26
    redacted        TEXT                -- the reason, once redacted
27
);
28
CREATE INDEX messages_channel ON messages(channel, seq);
29
CREATE INDEX messages_thread ON messages(reply_to, seq);
30
31
CREATE TABLE reactions (
32
    message   TEXT NOT NULL,
33
    actor     TEXT NOT NULL,
34
    reaction  TEXT NOT NULL,
35
    PRIMARY KEY (message, actor, reaction)
36
);
37
38
-- What each principal has to look at: mentions and direct messages for now.
39
CREATE TABLE inbox (
40
    principal  TEXT NOT NULL,
41
    item       TEXT NOT NULL,           -- the message id
42
    kind       TEXT NOT NULL,           -- mention | dm
43
    seq        INTEGER NOT NULL,
44
    delivered  INTEGER NOT NULL DEFAULT 0,
45
    read       INTEGER NOT NULL DEFAULT 0,
46
    PRIMARY KEY (principal, item)
47
);
48
49
CREATE VIRTUAL TABLE messages_fts USING fts5(id UNINDEXED, channel UNINDEXED, author UNINDEXED, body, tokenize = 'porter unicode61');