"""Was der Seite noch fehlt. Jeder darf aufschreiben, was er sich wünscht. Alle sehen alle Wünsche, ändern darf jeder nur die eigenen — wie bei den Filmsammlungen. """ from datetime import datetime, timezone from .db import connect SCHEMA = """ CREATE TABLE IF NOT EXISTS features ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, text TEXT NOT NULL, created_at TEXT NOT NULL ); """ MAX_LAENGE = 500 def init(): with connect() as conn: conn.executescript(SCHEMA) def alle(session_id): """Alle Wünsche, jeder mit dem Namen seines Verfassers.""" with connect() as conn: rows = conn.execute( "SELECT f.*, u.name FROM features f " "LEFT JOIN user_sessions s ON s.session_id = f.session_id " "LEFT JOIN users u ON u.id = s.user_id " "ORDER BY f.created_at DESC" ).fetchall() return [ { **{k: v for k, v in dict(r).items() if k != "session_id"}, "mine": r["session_id"] == session_id, } for r in rows ] def anlegen(session_id, text): """Gibt None zurück, wenn nichts dasteht.""" text = (text or "").strip()[:MAX_LAENGE] if not text: return None with connect() as conn: conn.execute( "INSERT INTO features (session_id, text, created_at) VALUES (?, ?, ?)", ( session_id, text, datetime.now(timezone.utc).isoformat(timespec="seconds"), ), ) return alle(session_id) def aendern(feature_id, text): """Der Host räumt auf: Tippfehler, Dopplungen, unklare Formulierungen.""" text = (text or "").strip()[:MAX_LAENGE] if not text: return 0 with connect() as conn: return conn.execute( "UPDATE features SET text = ? WHERE id = ?", (text, feature_id) ).rowcount def loeschen(feature_id): """Ohne Sitzungsbindung — den Knopf zeigt die Oberfläche nur dem Verfasser und dem Host.""" with connect() as conn: return conn.execute( "DELETE FROM features WHERE id = ?", (feature_id,) ).rowcount