Files
horror/backend/app/features.py
2026-09-09 17:58:52 +02:00

103 lines
2.9 KiB
Python

"""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
from .users import besitzer, gehoert_mir
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 _spalte_user_id(conn, tabelle):
"""Nachrüsten und aus der Sitzung füllen — einmalig je Datenbank."""
spalten = {r[1] for r in conn.execute(f"PRAGMA table_info({tabelle})")}
if "user_id" in spalten:
return
conn.execute(f"ALTER TABLE {tabelle} ADD COLUMN user_id INTEGER")
conn.execute(
f"UPDATE {tabelle} SET user_id = ("
" SELECT user_id FROM user_sessions s WHERE s.session_id = "
f" {tabelle}.session_id)"
)
def init():
with connect() as conn:
conn.executescript(SCHEMA)
_spalte_user_id(conn, "features")
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()
ich = besitzer(session_id)
return [
{
**{
k: v
for k, v in dict(r).items()
if k not in ("session_id", "user_id")
},
"mine": gehoert_mir(r, session_id, ich),
}
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, user_id, text, created_at) "
"VALUES (?, ?, ?, ?)",
(
session_id,
besitzer(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