banyaro/backend/routes/feedback.py
rene 70af387147 Feature: User-Feedback, Regen-Uhrzeit im Wetter-Chip, Admin-Karten klickbar (SW by-v833)
- Feedback-Modal im Settings (Kategorie + Text → E-Mail an support@banyaro.app)
- Wetter-Chip (Karte + Gassi-Score): zeigt nächste Regenstunde ab ≥20% Wahrscheinlichkeit
- Gassi-Score-Chip: zweizeilige Wetter-Info, linksbündig, volle Chipbreite
- Admin-Übersicht: Stat-Karten anklickbar → navigiert direkt zum jeweiligen Tab
- ui.js: visualViewport-Listener hebt Modal über Tastatur (alle Modals)
- api.js: Pydantic v2 Array-Detail korrekt als Fehlermeldung extrahiert
- map.js: Wetter-Fallback über watchPosition wenn getCurrentPosition scheitert
- Update-Loop-Fix: index.html ?v= synchron mit APP_VER halten (alle 4 Stellen)
2026-05-10 12:52:55 +02:00

56 lines
2 KiB
Python

"""
BAN YARO — User-Feedback per E-Mail an support@banyaro.app
"""
from typing import Annotated, Literal
from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field
from auth import get_current_user
from mailer import send_email, email_html
router = APIRouter()
SUPPORT_MAIL = "support@banyaro.app"
KATEGORIEN = {"bug": "🐛 Bug / Fehler", "idee": "💡 Idee / Wunsch", "lob": "🎉 Lob", "sonstiges": "💬 Sonstiges"}
class FeedbackIn(BaseModel):
kategorie: Literal["bug", "idee", "lob", "sonstiges"]
text: Annotated[str, Field(min_length=5, max_length=2000)]
@router.post("")
async def submit_feedback(
payload: FeedbackIn,
user=Depends(get_current_user),
):
kat_label = KATEGORIEN.get(payload.kategorie, payload.kategorie)
username = user.get("name", "?")
email = user.get("email", "")
tier = user.get("subscription_tier", "standard")
subject = f"[Feedback] {kat_label} von @{username}"
body = f"""
<p style="margin:0 0 16px">
Neues Feedback aus der App:
</p>
<table style="width:100%;border-collapse:collapse;font-size:13px;margin-bottom:20px">
<tr><td style="padding:6px 10px;background:#f5f0ea;font-weight:600;width:120px">Kategorie</td>
<td style="padding:6px 10px;border-bottom:1px solid #eee">{kat_label}</td></tr>
<tr><td style="padding:6px 10px;background:#f5f0ea;font-weight:600">User</td>
<td style="padding:6px 10px;border-bottom:1px solid #eee">@{username} ({email})</td></tr>
<tr><td style="padding:6px 10px;background:#f5f0ea;font-weight:600">Tier</td>
<td style="padding:6px 10px;border-bottom:1px solid #eee">{tier}</td></tr>
</table>
<div style="background:#fdf6ef;border-left:4px solid #C4843A;padding:14px 16px;
border-radius:0 8px 8px 0;white-space:pre-wrap;font-size:14px;line-height:1.6">
{payload.text}
</div>"""
plain = f"Feedback [{kat_label}] von @{username} ({email})\n\n{payload.text}"
await send_email(SUPPORT_MAIL, subject, email_html(body), plain)
return {"ok": True}