-- anonim-qa - adatséma (SQLite, WAL). Ez a szerződés: résztvevői adatnál új oszlop csak ADR-rel. -- Ami itt NINCS: IP, user-agent, süti, eszköz-azonosító, e-mail, token. (ADR-0001) PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS events ( id INTEGER PRIMARY KEY, code TEXT NOT NULL UNIQUE, -- 4-6 karakter, a résztvevő ezt üti be / QR title TEXT NOT NULL, guest TEXT, status TEXT NOT NULL DEFAULT 'gyujtes' CHECK (status IN ('gyujtes','elo','lezart','utolagos')), brand_json TEXT NOT NULL DEFAULT '{}', -- színek, logó URL (saját szerverről) settings_json TEXT NOT NULL DEFAULT '{}', -- batch_seconds, n_threshold, rotating_qr, name_field, max_per_token moderator_key TEXT NOT NULL UNIQUE, -- véletlen, a moderátori link része display_key TEXT NOT NULL UNIQUE, -- véletlen, a kivetítő/overlay link része created_day TEXT NOT NULL, -- YYYY-MM-DD purge_after_days INTEGER NOT NULL DEFAULT 90 ); CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY, event_id INTEGER NOT NULL REFERENCES events(id) ON DELETE CASCADE, text TEXT NOT NULL CHECK (length(text) <= 280), status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending','approved','rejected','pinned','answered')), source TEXT NOT NULL DEFAULT 'app' CHECK (source IN ('app','manual')), minute_bucket TEXT NOT NULL, -- YYYY-MM-DDTHH:MM, percre kerekítve (ADR-0001) upvotes INTEGER NOT NULL DEFAULT 0, cluster_id INTEGER REFERENCES questions(id),-- összevonásnál a fő kérdés id-ja flagged INTEGER NOT NULL DEFAULT 0, -- előszűrő sárga jelölése (döntés a moderátoré) answer_ts INTEGER, -- másodperc a felvételen, a fejezetlistához (opcionális) batch_no INTEGER -- melyik kötegben engedték ki (ADR-0006) ); CREATE INDEX IF NOT EXISTS idx_questions_event_status ON questions(event_id, status); CREATE TABLE IF NOT EXISTS feedback ( id INTEGER PRIMARY KEY, event_id INTEGER NOT NULL REFERENCES events(id) ON DELETE CASCADE, q1 INTEGER CHECK (q1 BETWEEN 1 AND 5), q2 INTEGER CHECK (q2 BETWEEN 1 AND 5), q3 INTEGER CHECK (q3 BETWEEN 1 AND 5), free_text TEXT CHECK (length(free_text) <= 500), minute_bucket TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS rotating_codes ( -- forgó QR nagy teremben (ADR-0005) event_id INTEGER NOT NULL REFERENCES events(id) ON DELETE CASCADE, code TEXT NOT NULL, valid_from_minute TEXT NOT NULL, valid_to_minute TEXT NOT NULL, PRIMARY KEY (event_id, code) ); -- Szavazás (ADR-0008): a szavazat csak összesítő számláló - szavazatonként sor, idő, token nincs. Az egy-szavazat-tokenenként szabály memóriában él. CREATE TABLE IF NOT EXISTS polls ( id INTEGER PRIMARY KEY, event_id INTEGER NOT NULL REFERENCES events(id) ON DELETE CASCADE, question TEXT NOT NULL CHECK (length(question) <= 200), status TEXT NOT NULL DEFAULT 'nyitva' CHECK (status IN ('nyitva','lezart','elrejtve')) ); CREATE INDEX IF NOT EXISTS idx_polls_event ON polls(event_id); CREATE TABLE IF NOT EXISTS poll_options ( id INTEGER PRIMARY KEY, poll_id INTEGER NOT NULL REFERENCES polls(id) ON DELETE CASCADE, label TEXT NOT NULL CHECK (length(label) <= 80), position INTEGER NOT NULL, votes INTEGER NOT NULL DEFAULT 0 ); -- Memóriában, DB-n kívül (ADR-0001, ADR-0005): -- token -> { event_id, kerdes_szamlalo, upvote_halmaz(question_id), szavazott_szavazasok(poll_id), lejarat } -- esemenyenkenti PoW-nehezseg