Commit graph

894 commits

Author SHA1 Message Date
d32b802649 Wetter in Statusleiste (war hinter Legende versteckt), SW by-v321 2026-04-24 08:03:13 +02:00
0461f936ce Wetter-Chip auf Karte + Bugfix private Routen zählen für km-Stats
- GET /api/weather?lat=&lon= (Open-Meteo, 30-min TTL-Cache)
- Zecken-Warnung regelbasiert: März–Okt + Temp > 7°C
- Karte: Wetterchip oben rechts nach GPS-Fix
- stats.py + achievements.py: is_public-Filter entfernt —
  private Routen zählen jetzt für eigene km/Achievements
- SW by-v320, APP_VER 308
2026-04-24 07:59:15 +02:00
71e588a240 Security Nice-to-Have: Dockerfile, Magic-Bytes, Path-Traversal, TABLE_MAP, Deps
- Dockerfile: non-root user appuser, chown /data + /app
- media_utils: validate_upload() Magic-Byte-Check (JPEG/PNG/GIF/WebP/MP4/WebM)
- media_utils: safe_media_path() Path-Traversal-Schutz beim Löschen
- diary/health/dogs: safe_media_path() statt os.path.join + lstrip
- diary: validate_upload() vor jedem Medien-Upload
- forum: _LIKE_TABLE dict statt dynamischer String-Interpolation
- requirements: uvicorn 0.34, PyJWT 2.10.1, pydantic 2.10.6, bcrypt 4.3, httpx 0.28.1, anthropic 0.49
- SW by-v319, APP_VER 307
2026-04-23 18:42:05 +02:00
15f854d96c Session 2026-04-23: Security, Content-Schutz, Wiki-Temperament-Migration
Security (9 Fixes):
- JWT_SECRET Pflicht-Check beim Start (Production)
- Rate-Limit: Login (10/5min), Register (5/h), KI-Training (10/h), Giftköder (3/h)
- KI-Training-Endpoint: Auth-Pflicht hinzugefügt
- Private Profile aus Freunde-Suche gefiltert
- OG-Tags XSS mit html.escape() gesichert
- Globales File-Upload-Limit 20 MB (Middleware)
- E-Mail-Maskierung für Moderatoren im Admin-Panel
- IP-Blocklist in ratelimit.py

Content-Schutz (4 Schichten):
- robots.txt: /api/ komplett Disallow, SSR-Seiten Allow
- Rate-Limit auf /api/wiki/rassen (60/min) + Detail (30/min)
- Honeypot /api/wiki/trap + unsichtbarer Link in index.html
- Wasserzeichen in KI-Enricher-Prompt

Wiki Temperament-Migration:
- 60-Wort Übersetzungsmap EN→DE
- Datenmüll-Filter (hunderasse, dog breed etc.)
- translate_existing_temperaments() + Admin-Button
- SW by-v318, APP_VER 306
2026-04-23 18:34:05 +02:00
71a1371b44 Session 2026-04-23: Desktop Multi-Column, Forum, Fixes, Analytics
- Desktop ≥1024px: page-container 680→860px
- Walks: Liste+Karte nebeneinander, View-Toggle ausgeblendet
- Forum: Rubriken 2-zeilig via CSS Grid (ceil(n/2) Spalten, zentriert)
- Welcome: max-width 920px, Feature-Sections 2-spaltig
- Wissen: Toggle-Mechanismus entfernt, Items immer sichtbar
- Übungen Plan-Karten: vertikal statt horizontal gestapelt
- Admin Analytics: Umami v2 gibt plain numbers statt {value:X}
- CSS-Spezifität: #page-forum nötig wegen layout.css < components.css
- SW by-v312, APP_VER 300
2026-04-23 17:52:28 +02:00
44081a6b9d Session 2026-04-22: Training, Fixes, KI-Cloud, Dark-Mode
Training-System:
- Einheit-Dialog Bugs behoben (UI.toast callable, _dogId via _appState, activeDog.id)
- Virtueller Trainer (rein statistisch): üben/festigen/entdecken/levelup
  Empfehlungen auf Basis exercise_progress + sessions, Prognose bis 80%
- Stand erfassen Modal: alle Übungen auf einmal setzen (onboarding)
- Erfolgsindikatoren auf Karten: Ø-Quote + Trend-Pfeil + Anzahl Sessions
- exercise_progress → synthetische Stats im Trainer (ohne Sessions nutzbar)
- Levelup: Tricks empfehlen wenn ≥4 Grundkommandos sitzen
- Kommandos & Fähigkeiten im Hundeprofil + öffentlichem Profil
- 2 neue Problemverhalten-Übungen: Bellen/Kläffen, Enttriggern

Mobile/UI-Fixes:
- Übungskarten: Name + Difficulty oben, Buttons eigene Zeile (kein Umbruch)
- Trainingsgrundlagen: Padding in allen Karten, Hinweis-Boxen Dark-Mode-sicher
- Tab-Sichtbarkeit: Trainer/Suggestions nur auf Übungs-Tabs
- Tagebuch FAB (Neu-Eintrag Button) + Quick-Add Eintrag
- FAB Abstand fix (nav-bottom-height + safe-bottom)
- Suggestion-Karten rgba (Dark-Mode)
- routes.js + uebungen.js: alle Hellfarben → rgba (Dark-Mode-sicher)
- ui.js: UI.toast als callable Function-Object (war nur plain Object)

KI & Backend:
- KI_MODE=cloud + ANTHROPIC_API_KEY gesetzt
- ki.py: Cloud-Fallback wenn local nicht erreichbar + KI_MODE=cloud
- KI-Trainer Tageslimit 10 Anfragen/User + ki_daily_calls Tabelle
- Admin-Panel: KI-Nutzung (heute/Monat/User)
- Status-Report Fix (lost-Tabelle) → 06:00 + 18:00 täglich
- Wiki-Anreicherung läuft jetzt (50 Rassen Startup, 20/Nacht)
- landing.html: Trainings-Features in JSON-LD + Feature-Karten
2026-04-22 19:41:22 +02:00
2b442ebd98 Admin: Moderation-Tab für Züchter + Wiki-Fotos (SW by-v280) 2026-04-21 19:44:06 +02:00
180de32e57 Session 2026-04-21: SEO, Wiki-Anreicherung, Training, Lober
SEO & Crawler:
- robots.txt, llms.txt, sitemap.xml (508 Seiten bei Google)
- SSR-Seiten: /info, /wiki/rassen, /wiki/rasse/{slug}, /knigge
- Open Graph, JSON-LD, Breadcrumbs in index.html

Navigation:
- Training unter "Mein Hund", Wissen collapsible
- Welcome-Seite und Landing-Page auf 5-Gruppen-Struktur

Wiki:
- KI-Anreicherung (Claude API): beschreibung, vorkommen_de, Steckbrief
- "So einen hab ich" / Züchter-Verzeichnis
- Scheduler: 50 Rassen beim Start, 20/Nacht

Training:
- Session-Logging (Erfolgsquote, Stimmung, Zufriedenheit)
- Virtueller KI-Trainer (6h-Cache)
- Trainingskalender (Habit-Tracker)
- Top-Training → automatischer Tagebucheintrag
- Gamification ohne Druck: Badges, Streak, Stats

Fortschritts-Lober:
- Jeden Montag 09:00: Claude schreibt Lob-Text pro Hund
- Push + Karte im Tagebuch

Monitoring:
- 4× täglich Status-Mail mit Scheduler-Status + Wiki-Fortschritt
2026-04-21 19:38:20 +02:00
65d1cf6c7f Navigation, Karten-FABs, Nearby-Alerts
- Bottom-Nav neu: Karte | Routen | + | Tagebuch | Forum
- + reduziert auf: Giftköder, Gassi-Treffen, Verlorener Hund
- Notification-Badge auf User-Avatar (Header)
- Nearby-Alerts: Nav-Leiste pulsiert rot/orange bei Giftköder/vermisstm Hund in 20km
- SW postMessage bei poison/lost_alert → sofortiger Alert-Check
- Karten-FABs: nur Marker setzen + Standort (Route aufzeichnen + Offline entfernt)
- SW by-v272, APP_VER 262
2026-04-20 19:46:34 +02:00
5141ba9969 Session 2026-04-20: Medien-Konvertierung, Umami Analytics, Username/Privacy
- HEIC→JPEG, MOV/AVI→MP4 Konvertierung bei allen Upload-Endpoints (media_utils.py)
- ffmpeg im Docker-Image, Video-Thumbnails (extract_video_thumb, poster-Attribut)
- Google Analytics entfernt, Umami self-hosted eingebunden (index.html, datenschutz.js)
- Admin-Panel Analytics-Tab: Stat-Cards, Sparkline 7 Tage, Top-Seiten (Umami-API-Proxy)
- Admin-Panel Tab-Icons korrigiert (aus vorhandenem Phosphor-Sprite)
- users.real_name Spalte: Username öffentlich, echter Name privat und optional
- Registrierung: Label "Benutzername", Leerzeichen verboten, Profanity-Blockliste
- Datenschutzerklärung: GA-Abschnitt durch Umami-Text ersetzt
2026-04-20 18:36:58 +02:00
9a78121a3e Session 2026-04-19: Navigation, Kompass, Übungsfortschritt
Routen-Navigation:
- POI-Marker: farbige Kreise mit Phosphor-Icons (wie Hauptkarte)
- Screensaver: Navi-Pfeil dreht sich via DeviceOrientationEvent (iOS+Android)
- Pfeil-Dämpfung: EMA α=0.12 mit Wrap-Around
- GPS-Distanz-Bug: Fortschritt nur wenn <500m zur Route
- fitBounds: User-Position nur wenn <20km von Route
- Screensaver: "zur Route" vs "verbleibend" kontextabhängig
- Richtungspfeile entlang Route (blau, max 7 Stück)
- Umkehren ins Route-Detail verschoben, Detail-Map rebuildet sich
- rk-header z-index:10 (Leaflet-Tiles liefen drüber)
- 2-Sek. Screensaver-Entsperrung

km-Tracking:
- route_walks Tabelle
- POST /api/routes/{id}/walked (≥50%)
- total_km = erstellte Routes + gelaufene route_walks
- Toast bei neuem Badge

Übungsfortschritt:
- exercise_progress + training_plan_progress Tabellen
- GET/POST /api/training/progress, /plan-progress, /suggestions
- uebungen.js: API-first + localStorage-Fallback + Auto-Migration
- Empfehlungs-Banner (regelbasiert)
- Toast bei "sitzt"
2026-04-19 20:33:01 +02:00
390176383f Fix: Routen-Header exakte Höhen — height:46px statt min-height, View-Toggle 44×44px quadratisch 2026-04-19 12:31:32 +02:00
385b4540b3 UX: Routen-Header alle Zeilen gleiche Höhe 46px, Inline-Styles durchgängig 2026-04-19 12:28:18 +02:00
4030da3776 Fix: Bottom-Nav z-index 300→700 (über Leaflet), Routen-Buttons auf refresh() aktualisiert 2026-04-19 12:25:33 +02:00
79e88b43ca UX: Routen-Header Buttons größer (46px Höhe, mehr Padding) 2026-04-19 12:09:34 +02:00
d374b5af61 Fix: Routen-Header Buttons mit Inline-Styles (cache-unabhängig wie Pills) 2026-04-19 12:07:37 +02:00
98dd5d74ee UX: Routen-Header aufgeräumt — 3 saubere Zeilen, einheitliche Buttons 2026-04-19 12:05:14 +02:00
26bcd07f84 UX: Routenübersicht-Cards nutzen gleiche Pill-Darstellung wie Detail 2026-04-19 12:00:39 +02:00
01a499b740 Fix: Pills mit Inline-Styles (CSS-Cache-unabhängig) + CSS-Version gebumpt 2026-04-19 11:56:47 +02:00
eabc88f0b8 Fix: Hunde-Tauglichkeit Labels vereinfacht (Leine/gut/sehr gut/premium) 2026-04-19 11:47:26 +02:00
54a6615ebb UX: Route-Pills kompakter, kürzere Texte, Rahmen sichtbar 2026-04-19 11:44:31 +02:00
167c8018bb UX: Route-Detail Pills text-only, keine Icons, Farben nach Bedeutung 2026-04-19 11:38:52 +02:00
f00084deb8 Fix: Nearby-Gruppen standardmäßig eingeklappt 2026-04-19 11:34:06 +02:00
9ba78f3b16 Fix: Mehrfachauswahl bei Routen-Fotos (multiple attribute + loop) 2026-04-19 11:31:38 +02:00
3144e100f3 UX: Nearby-POIs einklappbar + klickbar + nur relevante Typen
- NEARBY_TYPES: Bänke/Wasserstellen entfernt → nur Restaurant, Tierarzt, Zoobedarf
- Gruppen einklappbar (Chevron dreht sich)
- POI-Namen anklickbar → öffnet Apple Maps/Google Maps am POI-Standort
- CSS: Card-Stil für Gruppen, gute Touch-Targets
2026-04-19 11:29:46 +02:00
9a56978f81 UX: Sichtbarkeits-Pill im Route-Body anklickbar (grün/blau) 2026-04-19 11:23:36 +02:00
6f667b5c61 UX: Routen-Footer als einheitliches Icon+Label-Raster 2026-04-19 11:20:37 +02:00
a37b103dfe Fix: Routen-Footer Icons korrekt
- globe → lock-open (globe fehlt im Sprite → leerer Button)
- chat-circle-dots → paper-plane-tilt für 'An Freund senden'
- Toggle-Handler nutzt jetzt lock-open/lock statt lock/globe
2026-04-19 11:17:02 +02:00
9115f55dac Privacy: Tagebuch-Einträge aus Freunde-Aktivitäts-Feed entfernt
Tagebücher sind privat — auch Freunde sollen keine Einblicke bekommen
2026-04-19 11:12:54 +02:00
6d757b86c2 Feature: Referral-System — User wirbt User
- DB: referral_code (8-stellig, eindeutig) + referred_by zu users
  Bestehende User erhalten automatisch einen Code
- GET /api/auth/referral: Code, Link und Anzahl geworbener User
- POST /api/auth/register: ref_code Parameter für Zuordnung
- Settings: 'App empfehlen'-Karte mit Link, Teilen-Button und Botschafter-Badges
  (Botschafter ab 1, Super ab 5, Top ab 10 Einladungen)
- app.js: ?ref=CODE aus URL in sessionStorage speichern
- APP_VER 222, SW by-v244
2026-04-19 11:09:24 +02:00
82d9e26823 Feature: Forum-Beiträge von Freunden im Aktivitäts-Feed + Deep-Link
- friends.py: forum_threads im Activity-Feed (mit entry_id)
- Filter-Chip 'Forum' ergänzt
- Klick öffnet direkt den Forum-Thread via App.callModule('forum','openThread',id)
2026-04-19 11:04:26 +02:00
f9e2202ac7 Fix: Freunde-Aktivitäten öffnen direkt das Ziel-Item
- friends.py: entry_id für diary + walk Einträge zurückgeben
- diary.js: openDetail(id) öffentlich gemacht
- friends.js: App.callModule('diary','openDetail',id) bzw.
  App.callModule('walks','openDetail',id) statt nur App.navigate(page)
2026-04-19 11:01:31 +02:00
6809cfae23 Rename: Benachrichtigungen → Aktuelles (Bottom-Nav + Sidebar + Seitentitel) 2026-04-19 10:52:39 +02:00
e5cbe879ff Fix: Modal-Footer Layout Routes + Forum
Routen-Footer:
- 2-Zeilen-Layout: Aktions-Buttons oben, Schließen full-width unten
- GPX/Teilen/Navi als Text-Icon, Freund/Sichtbarkeit/Löschen als Icon-only rechts
- Keine Overflow/Clipping mehr

Forum-Footer:
- flex-direction:column Layout mit margin-left:auto für Icon-Buttons links
- Löschen/Bearbeiten (Icon) links, Schließen/Antworten rechts
- flex:1 Spacer-Problem behoben
2026-04-19 10:48:49 +02:00
b1053198de Fix: Standort-Picker im Forum-Edit-Modal ergänzt
- _showEditThreadModal: location picker mit Vorausfüllung (thread_lat/lon/ort)
- ThreadUpdate-Schema: thread_lat/lon/ort Felder ergänzt
- PATCH /threads/{id}/content: Location wird jetzt gespeichert/überschrieben
2026-04-19 10:45:05 +02:00
062c0209e6 Fix: Forum-Buttons Icon-only, Layout-Fix (Edit+Delete rechtsbündig)
- Neue .forum-icon-btn CSS-Klasse: 32×32px, transparent, hover-Feedback
- Post-Aktionen: Like links, Melden/Bearbeiten/Löschen rechtsbündig gruppiert
- Thread-Footer: Löschen+Bearbeiten als Icon-Buttons, Schließen/Antworten als Text
- .forum-icon-btn--danger für rote Löschen-Buttons
2026-04-19 10:39:48 +02:00
7a25ccae90 Feature/Fix: Routen-Navi, Badge-Klick-Fix, Forum-Edit, Chat-Unread-Refresh
- Routen: Navi-Button öffnet Apple Maps/Google Maps mit Start/Ziel-GPS
- Routen: Teilen-Button nutzt navigator.share() mit Fallback auf Clipboard
- Routen: Icon 'share' → 'arrow-square-out' (war nicht im Sprite)
- Nav-Badge: pointer-events:none → Badge blockiert keine Klicks mehr
- visibilitychange: Badges + Chat-Liste sofort refresh bei App-Rückkehr
- Forum: eigene Threads und Antworten bearbeiten (PATCH /threads/content, PATCH /posts)
- SW by-v238, APP_VER 215
2026-04-19 10:34:01 +02:00
289158b2cd Feature: Gasthund-Zugang für Sitter
- sitting_subscriptions Tabelle (dog_id, owner_id, sitter_id, valid_until)
- POST/DELETE/GET /api/sitting-access — Zugang gewähren/widerrufen/auflisten
- GET /api/dogs gibt Gasthunde zurück (is_guest=True, sitting_until, owner_name)
- Diary POST erlaubt Sitter-Schreibzugang; PATCH/DELETE nur für Besitzer
- Dog-Switcher: GAST-Badge bei fremden Hunden
- Dog-Profil: Sitter-Zugang-Sektion (nur für Besitzer), Freund auswählen + Datum
- Diary Detail-View: Bearbeiten-Button für Gasthunde ausgeblendet
2026-04-19 10:29:21 +02:00
eef787cc72 Fix: Benachrichtigungen öffnen direkt das Ziel-Item
- forum_reply → öffnet direkt den Forum-Thread (openThread exposed)
- walk_invite → öffnet direkt das Gassi-Treffen (openDetail exposed)
- poison_alert → öffnet direkt den Giftköder-Eintrag (openDetail exposed)
- chat_message → öffnet direkt den Chat-Thread (war schon vorhanden)
- _execNav nutzt nav.data statt nav.data?.field für konsistentes Parsing
2026-04-19 10:22:13 +02:00
05b28fcd8d Feature: Aktivitäten in Freunde-Ansicht anklickbar
- diary → Tagebuch, health → Gesundheit, walk → Gassi-Treffen
- Items als <button> für iOS-Tap-Zuverlässigkeit
- fr-activity-item--link mit Hover/Tap-Stil
2026-04-19 10:19:44 +02:00
90f1c4e299 Fix: Notifications-Klick-Handler durch UI.toast-TypeError blockiert
UI.toast ist ein Objekt {success,error,info}, kein Funktion.
UI.toast?.('...','info') wirft TypeError → async handler crasht still
→ setTimeout(_execNav) wird nie ausgeführt → keine Navigation

Fix: UI.toast?.info?.(…) / UI.toast?.error?.(…)
2026-04-19 10:16:46 +02:00
bb0250a8b5 Fix: Benachrichtigungen anklickbar (button statt div, data-Parsing repariert)
- _parseData() flacht verschachteltes {data:{conversation_id:…}} auf
  → d.conversation_id war immer undefined wegen doppelter Verschachtelung aus push.py
- .notif-item als <button> statt <div> — iOS feuert clicks auf divs unzuverlässig
- closest() im Löschen-Handler auf button.notif-item angepasst
2026-04-19 10:13:11 +02:00
b6d2606a23 Feature: Bottom-Nav umgebaut, Dog-Avatar→Welcome, Routen-Filter-Panel, Recording-Fix
- Bottom-Nav: Tagebuch | Routen | [+] | Forum | Benachrichtigungen (mit Badge)
- Benachrichtigungs-Badge auch in Bottom-Nav (notif-nav-badge)
- Dog-Avatar-Klick → Welcome-Seite (Name bleibt → Hund-Profil)
- Routen: Filter in aufklappbarem Panel, aktive Filter zeigen roten Punkt
- Routen: Start/Stop-Button fragt Page_map.isRecording() ab, kein veralteter lokaler State
- SW by-v232, APP_VER 209
2026-04-19 10:09:02 +02:00
0113ee2fbb Fix: Forum-Icon von 'chats' (fehlt im Sprite) auf 'push-pin' geändert 2026-04-19 09:59:51 +02:00
16150ced89 Feature: Startseite in 3 Sektionen (Mein Hund, Community, Entdecken) 2026-04-19 09:57:32 +02:00
f05ef9eeca Fix: Benachrichtigungen navigieren jetzt in den richtigen Kontext
- App.callModule() öffentlich: navigiert + ruft Modul-Methode auf
- chat_message → öffnet direkt den richtigen Chat-Thread (conversation_id)
- friend_request → Freunde-Seite
- walk_invite → Gassi-Treffen (+ page-Feld im Push-Payload ergänzt)
- poison_alert → Giftköder-Seite
- health_reminder → Gesundheit
- _execNav() zentralisiert alle typ-spezifischen Navigationen
2026-04-19 09:54:46 +02:00
8386e20ca1 Feature: Welcome-Kacheln anklickbar + Hamburger-Puls-Effekt 2026-04-19 09:50:24 +02:00
08ec40228a Fix: App-Frame bei großer Systemschrift (min-height statt height, Grid responsiv) 2026-04-19 09:48:44 +02:00
e784832a87 Fix: Sidebar schließt beim Klick auf '+ Neu erstellen' 2026-04-19 09:44:19 +02:00
e56183b642 Feature: Ratings, Lightbox, Forum-Standort, Notifications, Routen-Recording, Chat-Picker
- Bewertungssystem (ratings.py): Sterne für Sitter/Walks/Places/Routen
- Admin: Server-Log-Viewer + OSM-Cache-Statistiken
- Chat: "Neue Nachricht"-Button mit Freundesliste-Picker
- Forum: 5 neue Kategorien, Standorteingabe (locationPicker), Absende-Toast, Lightbox
- Freunde: Aktivitäts-Filter (Chips), Freundschaftsanfrage → In-App-Notification
- Sitter: locationPicker statt manuelle Koordinateneingabe + ratingStars
- Tagebuch: Bilder-Lightbox im Detail-View, iOS-Modal-Header-Fix (90svh)
- Routen: Start/Stopp-Button wechselt Zustand, nutzt Page_map.isRecording()
- Benachrichtigungen: Delete-Button sichtbar, typ-basierte Navigation, Toast-Feedback
- OSM: globales Semaphore + 429-Retry-Logic; Scheduler: München-Umland, täglich
- SW by-v225, APP_VER 202
2026-04-19 09:40:35 +02:00