Naechste "Ausbaustufe" aus Dogfather_VanVan_Supporter_Abo.odt Abschnitt 20 (siehe Supporter-Abo-System.md), auf Nutzerwunsch "perfektioniere meine Verwaltungsseite": Dogi/VanVan koennen in verwaltung.html eine Frage mit 2-6 Antwortoptionen auf Deutsch erstellen, automatische Uebersetzung beim Speichern (gleiches Muster wie "Event des Jahres"). Jede aktive DogiCrew- Person sieht die Abstimmung in ihrem Supporter-Bereich, stimmt genau einmal ab (UNIQUE-Constraint in der DB, nicht nur Anwendungslogik), sieht danach die Live-Ergebnisse. Admin-Seite zeigt Ergebnisbalken live, kann schliessen/ wiedereroeffnen/loeschen. - Neue Migration 0005_supporter_polls.sql (supporter_polls, supporter_poll_votes), neue Berechtigung POLLS_MANAGE. - server-internal/routes/polls.js: 30 End-to-End-Tests gegen eine Fake-DB bestanden (better-sqlite3 laesst sich lokal nicht kompilieren). - verwaltung.html: neue "Abstimmungen"-Kiste im bestehenden vw-overview-box-Stil (violett/pink Ergebnisbalken). - supporter.html: neue "Aktuelle Abstimmung"-Karte im bestehenden Gold-Look, Optionen -> Stimme -> Ergebnisbalken, alle 5 Sprachen. Backend-Teil (server-internal/, cloudflare-worker/migrations/) noch ohne Deploy-Zugriff -- Dogi muss ihn manuell auf dogiintern ausrollen. Co-Authored-By: Claude Opus 5 <[email protected]>
33 lines
1.5 KiB
SQL
33 lines
1.5 KiB
SQL
-- =====================================================================
|
|
-- Supporter-Abstimmungen (20.08.2026) — "nächste Ausbaustufe" aus
|
|
-- Dogfather_VanVan_Supporter_Abo.odt Abschnitt 20 (Bonus-Features, dort
|
|
-- bewusst nicht in den verbindlichen Abnahmekriterien Abschnitt 34, siehe
|
|
-- Supporter-Abo-System.md "Bewusst nicht Teil dieser ersten Ausbaustufe").
|
|
-- Dogi erstellt in der Verwaltung eine Frage + Antwortoptionen auf Deutsch,
|
|
-- die anderen Sprachen werden wie bei "Event des Jahres" automatisch beim
|
|
-- Speichern übersetzt (lib/translate.js). Jeder DogiCrew-Supporter darf pro
|
|
-- Abstimmung genau einmal abstimmen (UNIQUE-Constraint statt Anwendungslogik
|
|
-- — robust auch bei gleichzeitigen Anfragen).
|
|
-- =====================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS supporter_polls (
|
|
id TEXT PRIMARY KEY,
|
|
question TEXT NOT NULL, -- JSON {de, "de-CH", en, fr, pt}
|
|
options TEXT NOT NULL, -- JSON-Array von {de, "de-CH", en, fr, pt}
|
|
status TEXT NOT NULL DEFAULT 'active', -- active | closed
|
|
created_at TEXT NOT NULL,
|
|
created_by TEXT NOT NULL,
|
|
closed_at TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS supporter_poll_votes (
|
|
id TEXT PRIMARY KEY,
|
|
poll_id TEXT NOT NULL REFERENCES supporter_polls(id),
|
|
supporter_id TEXT NOT NULL REFERENCES supporter_users(id),
|
|
option_index INTEGER NOT NULL,
|
|
voted_at TEXT NOT NULL,
|
|
UNIQUE(poll_id, supporter_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_supporter_poll_votes_poll ON supporter_poll_votes (poll_id);
|