Sprint 11: Freunde & Chat + Phosphor-Icon-Vollmigration
- Freundschaften (pending/accepted), Nutzersuche, Anfragen per Push - Direktnachrichten mit Polling, iMessage-Stil, Deep-Links aus Push - Alle Seiten (map, places, diary, health, dog-profile, sitting, knigge, forum, wiki, walks) vollständig auf Phosphor-Icons migriert - Wikidata-Rassen-Scraper (~833 neue Rassen, lokal gespiegelte Fotos) - TheDogAPI lokal gespiegelt (169 Rassen + Fotos) - Quiz-Result-Cards horizontal (korrekte Bildproportionen) - SW by-v89
This commit is contained in:
parent
96bd57f0ad
commit
097295c628
44 changed files with 9980 additions and 300 deletions
|
|
@ -58,14 +58,24 @@ async def list_events(
|
|||
radius: int = 50000,
|
||||
typ: Optional[str] = None,
|
||||
alle: bool = False,
|
||||
quelle: Optional[str] = None,
|
||||
):
|
||||
today = date.today().isoformat()
|
||||
with db() as conn:
|
||||
q = "SELECT e.*, u.name AS veranstalter_name FROM events e LEFT JOIN users u ON u.id = e.user_id WHERE e.status = 'aktiv'"
|
||||
q = """
|
||||
SELECT e.*,
|
||||
CASE WHEN e.user_id = 0 THEN 'VDH' ELSE u.name END AS veranstalter_name,
|
||||
e.quelle
|
||||
FROM events e
|
||||
LEFT JOIN users u ON u.id = e.user_id AND e.user_id != 0
|
||||
WHERE e.status = 'aktiv'
|
||||
"""
|
||||
if not alle:
|
||||
q += f" AND e.datum >= '{today}'"
|
||||
if typ and typ in TYPEN:
|
||||
q += f" AND e.typ = '{typ}'"
|
||||
if quelle:
|
||||
q += f" AND e.quelle = '{quelle}'"
|
||||
q += " ORDER BY e.datum ASC, e.uhrzeit ASC"
|
||||
rows = conn.execute(q).fetchall()
|
||||
|
||||
|
|
@ -85,14 +95,14 @@ async def create_event(data: EventCreate, user=Depends(get_current_user)):
|
|||
raise HTTPException(400, f"Ungültiger Typ. Erlaubt: {', '.join(TYPEN)}")
|
||||
with db() as conn:
|
||||
cur = conn.execute("""
|
||||
INSERT INTO events (user_id, titel, datum, uhrzeit, lat, lon, ort_name, typ, beschreibung, link)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
INSERT INTO events (user_id, titel, datum, uhrzeit, lat, lon, ort_name, typ, beschreibung, link, quelle)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'nutzer')
|
||||
""", (user['id'], data.titel, data.datum, data.uhrzeit,
|
||||
data.lat, data.lon, data.ort_name,
|
||||
data.typ, data.beschreibung, data.link))
|
||||
row = conn.execute(
|
||||
"SELECT e.*, u.name AS veranstalter_name FROM events e "
|
||||
"LEFT JOIN users u ON u.id = e.user_id WHERE e.id = ?",
|
||||
"SELECT e.*, CASE WHEN e.user_id = 0 THEN 'VDH' ELSE u.name END AS veranstalter_name, e.quelle "
|
||||
"FROM events e LEFT JOIN users u ON u.id = e.user_id AND e.user_id != 0 WHERE e.id = ?",
|
||||
(cur.lastrowid,)
|
||||
).fetchone()
|
||||
return dict(row)
|
||||
|
|
@ -105,8 +115,8 @@ async def create_event(data: EventCreate, user=Depends(get_current_user)):
|
|||
async def get_event(event_id: int):
|
||||
with db() as conn:
|
||||
row = conn.execute(
|
||||
"SELECT e.*, u.name AS veranstalter_name FROM events e "
|
||||
"LEFT JOIN users u ON u.id = e.user_id WHERE e.id = ?",
|
||||
"SELECT e.*, CASE WHEN e.user_id = 0 THEN 'VDH' ELSE u.name END AS veranstalter_name, e.quelle "
|
||||
"FROM events e LEFT JOIN users u ON u.id = e.user_id AND e.user_id != 0 WHERE e.id = ?",
|
||||
(event_id,)
|
||||
).fetchone()
|
||||
if not row:
|
||||
|
|
@ -123,7 +133,7 @@ async def update_event(event_id: int, data: EventUpdate, user=Depends(get_curren
|
|||
ev = conn.execute("SELECT * FROM events WHERE id = ?", (event_id,)).fetchone()
|
||||
if not ev:
|
||||
raise HTTPException(404, "Event nicht gefunden.")
|
||||
if ev['user_id'] != user['id']:
|
||||
if ev['user_id'] == 0 or ev['user_id'] != user['id']:
|
||||
raise HTTPException(403, "Nur der Veranstalter kann das Event bearbeiten.")
|
||||
updates = data.model_dump(exclude_none=True)
|
||||
if updates:
|
||||
|
|
@ -132,8 +142,8 @@ async def update_event(event_id: int, data: EventUpdate, user=Depends(get_curren
|
|||
cols = ', '.join(f"{k} = ?" for k in updates)
|
||||
conn.execute(f"UPDATE events SET {cols} WHERE id = ?", [*updates.values(), event_id])
|
||||
row = conn.execute(
|
||||
"SELECT e.*, u.name AS veranstalter_name FROM events e "
|
||||
"LEFT JOIN users u ON u.id = e.user_id WHERE e.id = ?",
|
||||
"SELECT e.*, CASE WHEN e.user_id = 0 THEN 'VDH' ELSE u.name END AS veranstalter_name, e.quelle "
|
||||
"FROM events e LEFT JOIN users u ON u.id = e.user_id AND e.user_id != 0 WHERE e.id = ?",
|
||||
(event_id,)
|
||||
).fetchone()
|
||||
return dict(row)
|
||||
|
|
@ -148,6 +158,6 @@ async def delete_event(event_id: int, user=Depends(get_current_user)):
|
|||
ev = conn.execute("SELECT * FROM events WHERE id = ?", (event_id,)).fetchone()
|
||||
if not ev:
|
||||
raise HTTPException(404, "Event nicht gefunden.")
|
||||
if ev['user_id'] != user['id']:
|
||||
if ev['user_id'] == 0 or ev['user_id'] != user['id']:
|
||||
raise HTTPException(403, "Nur der Veranstalter kann das Event löschen.")
|
||||
conn.execute("UPDATE events SET status = 'geloescht' WHERE id = ?", (event_id,))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue