banyaro/backend/routes
rene 9394bab1fb Big Sweep: Security + Race-Conditions + Tests + DSGVO + A11y, SW by-v1095
SECURITY (auth.py, routes/auth.py, database.py, main.py)
- JWT bekommt jti; Logout trägt in neue jwt_blacklist-Tabelle ein,
  decode_token() prüft → server-side Invalidierung
- JWT-Expiry default 30 → 7 Tage (ENV JWT_EXPIRY_DAYS überschreibt)
- Sliding-Refresh-Middleware: erneuert Cookie wenn >50% verbraucht
  (Schwelle via JWT_REFRESH_FRACTION, Default 2)
- Login-Lockout in DB-Tabelle login_attempts (5 Versuche / 15 Min,
  überlebt Container-Restart) — alte In-Memory-Lockouts ersetzt
- SMTP-Versand: alle 'except: pass' durch logger.exception ersetzt;
  Fehlversuche landen in failed_emails-Tabelle für späteres Retry
- Referral-Counter Race gefixt: UPDATE partner_codes SET uses=uses+1
  ... WHERE uses<max_uses RETURNING — atomar statt SELECT+UPDATE

RACE CONDITIONS (routes/invoices.py, database.py)
- Neue invoice_counters-Tabelle für atomare Nummernvergabe
- _next_invoice_number nutzt BEGIN IMMEDIATE + atomares UPDATE
- Funktioniert für RG- und ST-Prefixe (Stornorechnungen)
- Race-Test verifiziert (5 Threads × 20 Calls = 100 eindeutige Nummern)

VERSION + TESTS + ERROR-DIGEST (VERSION, Makefile, tests/, scheduler.py)
- Neue VERSION-Datei (Single Source of Truth) — main.py liest beim
  Startup
- Makefile-Target 'make bump' propagiert in sw.js, app.js, index.html
- Makefile-Target 'make test' setzt venv auf, läuft pytest
- 19 Smoke-Tests in tests/ (health, auth, diary, invoice) — alle grün
- Scheduler: täglicher _job_error_digest um 06:30 → schickt Error-
  Zusammenfassung an ADMIN_EMAIL (still wenn keine Errors)

DSGVO + A11Y + ERSTE-HILFE
- landing.html: 'HTML und ODS' → 'JSON' (tatsächlich implementiert)
- datenschutz.js: Sektion Account-Löschung erweitert (sofort gelöscht /
  anonymisiert / 10 Jahre für Rechnungen)
- erste-hilfe.js: prominentes Warning-Banner oben (ersetzt keine
  Tierarzt-Beratung); Notfallnummern gruppiert nach Land, TODO-Platz-
  halter für AT-Uni-Klinik, CH Tox Info Suisse, CH Tierspital Zürich
- ui.js Modal: ESC schließt, Focus-Trap, Auto-Focus erstes Element,
  Restore Focus auf vorigen Caller
- impressum.js Kontaktformular: Labels mit for=cf-name etc.

NEUE DB-TABELLEN (idempotent via CREATE TABLE IF NOT EXISTS)
- jwt_blacklist, login_attempts, failed_emails, invoice_counters

NEUE ENV-VARS
- JWT_REFRESH_FRACTION (Default 2)
- JWT_EXPIRY_DAYS Default geändert (30 → 7)
2026-05-26 20:12:01 +02:00
..
__init__.py Sprint 0: Backend, Docker, KI-Layer mit Free/Premium-Trennung 2026-04-12 16:39:34 +02:00
achievements.py Feature: Hilfe/FAQ, Übungen-Content, Navigation-Fixes (SW by-v727) 2026-05-05 21:46:16 +02:00
admin.py UX: Upgrades-Tab — Button zeigt vorhandene Rechnung an, SW by-v1074 2026-05-26 13:50:03 +02:00
adoption.py Chore: Sprint32-36 Zwischenstand — alle Änderungen aus dieser Session committen 2026-05-03 11:09:39 +02:00
alerts.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
auth.py Big Sweep: Security + Race-Conditions + Tests + DSGVO + A11y, SW by-v1095 2026-05-26 20:12:01 +02:00
breeder.py Refactor: Züchter-Antrag in Upgrade-Flow integriert (SW by-v925) 2026-05-14 11:17:49 +02:00
breeder_export.py Feature: Tierschutz-Check, KI-Züchter-Features, Export, SEO-Update 2026-04-28 19:49:54 +02:00
breeder_photos.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
challenges.py Feature: 3 Community-Features — Foto-Challenge, Stamm-Gassis, Rassen-Chip (SW by-v700) 2026-05-04 21:09:35 +02:00
chat.py Sprint 16: Chat-Fotos/Online/Read-Receipts, Gesundheit-Dokumente löschen, Bugfixes 2026-04-17 22:38:33 +02:00
contact.py Feat: Kontaktformular im Impressum + /api/contact Endpoint ohne Auth (SW by-v986) 2026-05-15 16:46:37 +02:00
diary.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
dogs.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
ernaehrung.py Fix: Ernährung Hund-spezifisch, Erinnerungen in Settings, Übung des Tages per Hund (SW by-v872) 2026-05-11 19:25:00 +02:00
events.py Sprint 19: Social, UX-Verbesserungen, Nerd2Noob-Hilfe 2026-04-17 23:53:50 +02:00
expenses.py Feature: Daueraufträge in Ausgaben — monatlich/quartalsweise/jährlich, Scheduler, SW by-v605 2026-05-02 10:51:28 +02:00
feedback.py Feature: User-Feedback, Regen-Uhrzeit im Wetter-Chip, Admin-Karten klickbar (SW by-v833) 2026-05-10 12:52:55 +02:00
forum.py Chore: Sprint32-36 Zwischenstand — alle Änderungen aus dieser Session committen 2026-05-03 11:09:39 +02:00
friends.py Feature+Fix: Referral-Admin, Pro-Gates, Karten-Layer, onDogChange, Staging-Media (SW by-v855) 2026-05-11 17:23:29 +02:00
gassi_zeiten.py Feature: 3 Community-Features — Foto-Challenge, Stamm-Gassis, Rassen-Chip (SW by-v700) 2026-05-04 21:09:35 +02:00
health.py Feature: Aktive Erinnerungen, Versicherung, Verhaltensprotokoll, Hundefreundliche Orte (SW by-v874) 2026-05-11 22:24:42 +02:00
health_docs.py Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung) 2026-05-02 09:29:48 +02:00
help.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
import_data.py Sprint 12+13: Tagebuch Day-One-Redesign, Notiz-Feature, Icon-Fixes, SW by-v405 2026-04-25 20:44:46 +02:00
invoices.py Big Sweep: Security + Race-Conditions + Tests + DSGVO + A11y, SW by-v1095 2026-05-26 20:12:01 +02:00
jobs.py Chore: Sprint32-36 Zwischenstand — alle Änderungen aus dieser Session committen 2026-05-03 11:09:39 +02:00
ki.py Feature: Trauer-Feature, Futter-Verträglichkeit, Multi-Hund-Fixes, Wetter-Ort (Sprint 47) 2026-05-11 19:28:38 +02:00
knigge.py KI-Tracking vollständig, Cloud-Limit 20/Woche, Statusmail täglich 06:00 — SW by-v434, APP_VER 413 2026-04-26 17:01:05 +02:00
laeufi.py Feature: Läufigkeit & Trächtigkeit — Zyklen, Progesterontests, Deckdaten, Meilensteine (SW by-v894) 2026-05-13 17:09:02 +02:00
litters.py Feature: Wurf-Buchstabe (A–Z) + Wurf-Name — DB, Backend, Formular, Kartenanzeige (SW by-v912) 2026-05-13 19:58:50 +02:00
lost.py Sprint 15: Zeitzone-Fix, Gewichts-Sync, Öffnungszeiten, KI-Bericht, POI-Moderation — SW by-v432, APP_VER 411 2026-04-26 15:38:50 +02:00
moderation.py Chore: Sprint32-36 Zwischenstand — alle Änderungen aus dieser Session committen 2026-05-03 11:09:39 +02:00
movies.py Feature: HdM Community-Vote — alle öffentlichen Hunde wählbar, eigene ausgenommen, SW by-v597 2026-05-02 08:44:59 +02:00
notes.py KI-Tracking vollständig, Cloud-Limit 20/Woche, Statusmail täglich 06:00 — SW by-v434, APP_VER 413 2026-04-26 17:01:05 +02:00
notifications.py Badge-System: personal/general Split, Punkte ohne Zahl, SW by-v328 2026-04-24 08:39:41 +02:00
osm.py Feature: Aktive Erinnerungen, Versicherung, Verhaltensprotokoll, Hundefreundliche Orte (SW by-v874) 2026-05-11 22:24:42 +02:00
outreach.py Fix: SMTP Port 25 mit STARTTLS (465/587 von Synology geblockt) 2026-05-06 20:27:40 +02:00
partner.py Fix: Grant is_founder=0 löscht founder_number; /me gibt is_founder zurück; DB direkt gefixt 2026-04-30 15:38:17 +02:00
passport.py Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung) 2026-05-02 09:29:48 +02:00
places.py Feature: Telefonnummer für Orte (DB-Migration + API + Formular + Detailansicht) 2026-04-17 10:32:04 +02:00
playdate.py Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung) 2026-05-02 09:29:48 +02:00
poison.py Push geo-filter: Giftköder-Alert nur im 30km-Radius, Standort via Alerts-Check gespeichert 2026-04-24 09:35:55 +02:00
praise.py Session 2026-04-21: SEO, Wiki-Anreicherung, Training, Lober 2026-04-21 19:38:20 +02:00
profile.py Fix: users.geburtstag Migration + Format TT.MM statt MM-DD 2026-05-16 12:02:52 +02:00
push.py Push geo-filter: Giftköder-Alert nur im 30km-Radius, Standort via Alerts-Check gespeichert 2026-04-24 09:35:55 +02:00
ratings.py Feature: Ratings, Lightbox, Forum-Standort, Notifications, Routen-Recording, Chat-Picker 2026-04-19 09:40:35 +02:00
recalls.py Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung) 2026-05-02 09:29:48 +02:00
routen.py Feature: Trauer-Feature, Futter-Verträglichkeit, Multi-Hund-Fixes, Wetter-Ort (Sprint 47) 2026-05-11 19:28:38 +02:00
services.py Fix: services.py fehlte nach Worktree-Merge 2026-04-17 23:54:49 +02:00
sharing.py Sprint 15: Suche, Ausweis, Teilen, Widget 2026-04-17 15:51:09 +02:00
sitting.py Sprint 8: Events + Hundesitting 2026-04-14 06:19:15 +02:00
sitting_access.py Feature: Gasthund-Zugang für Sitter 2026-04-19 10:29:21 +02:00
social.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
stats.py Feature: Stats-Band + Tagebuch-Einträge, km alle Routen (public+privat) 2026-05-15 18:34:03 +02:00
streak.py Chore: Sprint32-36 Zwischenstand — alle Änderungen aus dieser Session committen 2026-05-03 11:09:39 +02:00
tieraerzte.py Feature: Tierarzt-Bewertungen — Sterne-Rating pro Praxis mit Detail-Modal (SW by-v700) 2026-05-04 21:02:49 +02:00
training.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
walks.py Security: Auth-geschützte Media-Endpoints für Diary+Health, Walk-Foto-Naming (SW by-v879) 2026-05-12 17:17:36 +02:00
weather.py Feature+Fix: Referral-Admin, Pro-Gates, Karten-Layer, onDogChange, Staging-Media (SW by-v855) 2026-05-11 17:23:29 +02:00
webcal.py WebCal: Tierarzt-Termine, Medikamenten-Enddaten, Hunde-Geburtstage ergänzt 2026-04-17 09:41:14 +02:00
widget.py Feature: Welten-Onboarding, Wetter-Motivation, UX-Fixes (SW by-v715) 2026-05-05 17:32:03 +02:00
wiki.py Perf: 9 Performance-Fixes — SW by-v1072 2026-05-26 06:30:36 +02:00
zucht_hunde.py Feature: Tierschutz-Check, KI-Züchter-Features, Export, SEO-Update 2026-04-28 19:49:54 +02:00
zucht_ki.py Feature: KI-Jahresberichte speichern + Archiv + Download — SW by-v505, APP_VER 482 2026-04-29 17:03:49 +02:00