76 lines
2.8 KiB
SQL
76 lines
2.8 KiB
SQL
-- Project Bifrost — initial schema
|
|
-- SPEC §7.2
|
|
|
|
CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
email TEXT UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
organisation TEXT NOT NULL,
|
|
role TEXT NOT NULL CHECK(role IN ('pilot', 'cab', 'fenja')),
|
|
bio TEXT NOT NULL DEFAULT '',
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
last_seen_at TEXT,
|
|
active INTEGER NOT NULL DEFAULT 1
|
|
);
|
|
|
|
CREATE TABLE invites (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
token_hash TEXT UNIQUE NOT NULL,
|
|
email TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
organisation TEXT NOT NULL,
|
|
role TEXT NOT NULL CHECK(role IN ('pilot', 'cab', 'fenja')),
|
|
expires_at TEXT NOT NULL,
|
|
used_at TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
created_by_user_id INTEGER REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE sessions (
|
|
id TEXT PRIMARY KEY,
|
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
expires_at TEXT NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE contributions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
type TEXT NOT NULL CHECK(type IN ('idea', 'inspiration', 'question')),
|
|
body_md TEXT NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
edited_at TEXT,
|
|
hidden_at TEXT
|
|
);
|
|
|
|
CREATE TABLE reactions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
contribution_id INTEGER NOT NULL REFERENCES contributions(id) ON DELETE CASCADE,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
UNIQUE(user_id, contribution_id)
|
|
);
|
|
|
|
CREATE TABLE replies (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
contribution_id INTEGER NOT NULL REFERENCES contributions(id) ON DELETE CASCADE,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
body_md TEXT NOT NULL,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE attendance (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
meeting_slug TEXT NOT NULL,
|
|
status TEXT NOT NULL CHECK(status IN ('yes', 'no')),
|
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
UNIQUE(user_id, meeting_slug)
|
|
);
|
|
|
|
CREATE INDEX idx_sessions_user ON sessions(user_id);
|
|
CREATE INDEX idx_contributions_type ON contributions(type);
|
|
CREATE INDEX idx_reactions_contrib ON reactions(contribution_id);
|
|
CREATE INDEX idx_replies_contrib ON replies(contribution_id);
|
|
CREATE INDEX idx_attendance_meeting ON attendance(meeting_slug);
|