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)
This commit is contained in:
parent
d18c592ef0
commit
70af387147
12 changed files with 211 additions and 42 deletions
56
backend/routes/feedback.py
Normal file
56
backend/routes/feedback.py
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
"""
|
||||
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}
|
||||
Loading…
Add table
Add a link
Reference in a new issue