Feature: 3 Community-Features — Foto-Challenge, Stamm-Gassis, Rassen-Chip (SW by-v700)

- Foto-Challenge der Woche: DB-Tabellen, routes/challenges.py (current/submit/vote/winners),
  Scheduler-Job jeden Montag 08:00, walks.js Challenge-Tab mit Banner, Galerie, Voting-Herz
- Gassi-Zeiten-Pool: DB-Tabelle gassi_zeiten, routes/gassi_zeiten.py (CRUD + Umkreis),
  walks.js Stamm-Gassis-Tab mit Karten, Wochentag-Selector, Mitmachen→Chat
- Rassen-Treffen-Chip: GET /api/friends/same-breed, dog-profile.js zeigt Chip
  wenn andere User gleiche Rasse haben, Klick → Forum mit Rassen-Suche vorausgefüllt
This commit is contained in:
rene 2026-05-04 21:09:35 +02:00
parent d6206d378e
commit aa4849d947
10 changed files with 1322 additions and 22 deletions

View file

@ -342,3 +342,56 @@ async def remove_friend(friend_user_id: int, user=Depends(get_current_user)):
AND ((requester_id=? AND addressee_id=?) OR (requester_id=? AND addressee_id=?))
""", (uid, friend_user_id, friend_user_id, uid))
return {"ok": True}
# ------------------------------------------------------------------
# GET /api/friends/same-breed — andere User mit gleicher Rasse
# ------------------------------------------------------------------
@router.get("/same-breed")
async def same_breed(user=Depends(get_current_user)):
"""Findet andere User mit Hunden derselben Rasse. Gibt Anzahl + Forum-Suche zurück."""
uid = user["id"]
with db() as conn:
# Rassen des eingeloggten Users
my_dogs = conn.execute(
"SELECT rasse FROM dogs WHERE user_id=? AND rasse IS NOT NULL AND rasse != ''",
(uid,)
).fetchall()
if not my_dogs:
return {"count": 0, "rassen": [], "forum_query": None}
rassen = list({d["rasse"].strip() for d in my_dogs if d["rasse"]})
# Andere User (nicht ich) die eine dieser Rassen haben
ph = ",".join("?" * len(rassen))
count_row = conn.execute(f"""
SELECT COUNT(DISTINCT d.user_id) AS cnt
FROM dogs d
WHERE d.user_id != ?
AND d.rasse IN ({ph})
""", (uid, *rassen)).fetchone()
count = count_row["cnt"] if count_row else 0
# Für jede Rasse: wie viele andere User
rassen_detail = []
for rasse in rassen:
n = conn.execute(
"SELECT COUNT(DISTINCT user_id) AS cnt FROM dogs "
"WHERE user_id != ? AND rasse = ?",
(uid, rasse)
).fetchone()["cnt"]
if n > 0:
rassen_detail.append({"rasse": rasse, "count": n})
rassen_detail.sort(key=lambda x: -x["count"])
# Forum-Suche-Link für die häufigste Rasse
forum_query = rassen_detail[0]["rasse"] if rassen_detail else None
return {
"count": count,
"rassen": rassen_detail,
"forum_query": forum_query,
}