Streak: entkoppelt vom App-Öffnen — nur noch echte Touren zählen

- update_streak NICHT mehr in GET /achievements/me (lief bei jedem Öffnen).
  Streak wird nur noch von create_route (aufnehmen) + record_walk (ablaufen)
  hochgezählt.
- Angezeigter Streak korrekt: nur gültig wenn letzte Tour heute/gestern war,
  sonst 0 (gerissen) — ohne den gespeicherten Wert zu verändern.
This commit is contained in:
rene 2026-06-04 09:40:12 +02:00
parent 667ed91f33
commit f5b5bb2289

View file

@ -281,7 +281,8 @@ def check_and_award(user_id: int, conn):
async def my_achievements(user=Depends(get_current_user)): async def my_achievements(user=Depends(get_current_user)):
uid = user["id"] uid = user["id"]
with db() as conn: with db() as conn:
update_streak(uid, conn) # Streak NICHT beim Öffnen bumpen — nur echte Touren zählen
# (create_route / record_walk). check_and_award bleibt (Badges, idempotent).
new_badges = check_and_award(uid, conn) new_badges = check_and_award(uid, conn)
stats = conn.execute(""" stats = conn.execute("""
@ -302,8 +303,16 @@ async def my_achievements(user=Depends(get_current_user)):
""", (uid, uid, uid, uid, uid, uid, uid, uid, uid)).fetchone() """, (uid, uid, uid, uid, uid, uid, uid, uid, uid)).fetchone()
streak_row = conn.execute( streak_row = conn.execute(
"SELECT current_streak, max_streak FROM users WHERE id=?", (uid,) "SELECT current_streak, max_streak, last_activity_date FROM users WHERE id=?", (uid,)
).fetchone() ).fetchone()
# Angezeigter Streak: nur gültig, wenn die letzte echte Tour heute oder
# gestern war — sonst gerissen (0). Gespeicherten Wert NICHT verändern
# (wird erst bei der nächsten echten Tour zurückgesetzt).
_today = date.today().isoformat()
_yest = (date.today() - timedelta(days=1)).isoformat()
display_streak = ((streak_row["current_streak"] or 0)
if streak_row and streak_row["last_activity_date"] in (_today, _yest)
else 0)
# Wetter-Tapferkeit # Wetter-Tapferkeit
wetter_row = conn.execute(""" wetter_row = conn.execute("""
@ -422,7 +431,7 @@ async def my_achievements(user=Depends(get_current_user)):
return { return {
"stats": dict(stats) if stats else {}, "stats": dict(stats) if stats else {},
"streak": {"current": streak_row["current_streak"] if streak_row else 0, "streak": {"current": display_streak,
"max": streak_row["max_streak"] if streak_row else 0}, "max": streak_row["max_streak"] if streak_row else 0},
"rang": rank_row["rang"] if rank_row else 1, "rang": rank_row["rang"] if rank_row else 1,
"categories": badge_categories, "categories": badge_categories,