- 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)
56 lines
2 KiB
Python
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}
|