Commit graph

570 commits

Author SHA1 Message Date
5a412c425c Fix: Staging-Media — PROD_MEDIA_DIR Fallback statt überlappende Docker-Volumes 2026-05-02 09:51:03 +02:00
00109a0929 Fix: Staging — DB-Kopie als separates make staging-db Ziel (braucht sudo -t) 2026-05-02 09:43:37 +02:00
4e3b673c22 Fix: Staging DB-Kopie mit sudo 2026-05-02 09:41:56 +02:00
d082a89a9f Fix: Staging — Container erst stoppen bevor DB kopiert wird 2026-05-02 09:41:05 +02:00
08bf3f5b15 Fix: Staging — 10 Icons im Sprite, Media+DB aus Produktion, pie-chart → chart-pie 2026-05-02 09:40:07 +02:00
da176d477a Bump SW by-v598 für Sprint31-Deploy auf Staging 2026-05-02 09:30:34 +02:00
742ad189e8 Feature: Sprint31 — 9 Features merged (Streak, Ausgaben, KI-Tierarzt, Rückrufe, Adoption, Vet+Befunde, Hundepass, Playdate, Rassenerkennung)
- Trainings-Streak: streak.py, DB training_streaks, Scheduler 19:00, Widget in welcome.js, Ping in uebungen.js
- Ausgaben-Tracker: expenses.py, expenses.js, DB expenses-Tabelle
- KI-Tierarztfragen: ki.py /tierarzt, health.js Button+Modal, DB ki_tierarzt_log
- Rückruf-Alarm: recalls.py, recalls.js, DB feed_recalls, Scheduler 08:00 RASFF
- Adoption: adoption.py, adoption.js, DB adoption_cache
- Tierarzt-Favorit + Befunde: tieraerzte.py /my-favorite+/favorite, health_docs.py, health.js, api.js, DB favorite_vets+health_documents
- Digitaler Hundepass: passport.py, dog-profile.js, main.py /pass/{token}, DB vaccinations+medications+dog_passport_meta+passport_shares, requirements.txt fpdf2
- Playdate-Matching: playdate.py, playdate.js, DB playdate_listings+playdate_requests
- Rassen-Erkennung: ki.py /rasse-erkennung (Claude Vision), dog-profile.js+wiki.js, CSS .rasse-result-card, DB ki_rasse_log
2026-05-02 09:29:48 +02:00
031c6028ac Feature: HdM Community-Vote — alle öffentlichen Hunde wählbar, eigene ausgenommen, SW by-v597 2026-05-02 08:44:59 +02:00
83958cbb0b Fix: Forum Tab-Marquee scrollt jetzt bis zum Textende (Padding eingerechnet), SW by-v596 2026-05-02 08:39:22 +02:00
d1572c52bc Feature: Forum Tab-Pills — Marquee-Scroll bei Hover für abgeschnittenen Text, SW by-v595 2026-05-02 08:35:49 +02:00
7474e10031 Fix: Filme-Standardsortierung → IMDb DESC, Erscheinungsjahr DESC 2026-05-02 08:28:47 +02:00
07a888bbd8 Feature: Filme-DB auf 126 Einträge aufgeblasen (+58 neue), Seed immer aktiv
- 58 neue Filme/Serien/Dokus: Bluey, Best in Show, Ginga Gin,
  All Dogs Go to Heaven, Oliver & Co., Cats & Dogs, White Dog,
  The Dog House, Supervet, The Champions, Alpha u.v.m.
- seed_movies() läuft jetzt immer (INSERT OR IGNORE), nicht nur wenn DB leer
2026-05-02 08:25:51 +02:00
ea2a83b29e Feature: Filme-Suche, HdM ins Forum + Gewinner-Badge im Profil, SW by-v594
- Filme-Seite: Suchfeld (filtert live nach Titel, Rasse, Genre, Beschreibung)
- Filme-Seite: Tab "Hund des Monats" entfernt
- Forum: kompakte HdM-Kachel über der Suche (Sieger + Stimmen), Klick öffnet Abstimmungs-Modal
- Hundeprofil: goldene Badges für jeden gewonnenen Monat (🏆 Mai 2026 …)
- DB: Tabelle hund_des_monats_wins (dauerhaft, dog_id + monat + stimmen)
- Scheduler: Job am 1. des Monats 00:05 — schreibt Vormonats-Sieger, Push an Besitzer
- Dogs-API: liefert hdm_wins[] pro Hund mit
2026-05-02 08:12:29 +02:00
d00284184b Feature: Moderation SLA — Altersanzeige + Overdue-Alarm täglich 12:00, SW by-v591 2026-05-01 19:49:02 +02:00
87039994ce Feature: Moderation History — Log für alle 4 Bereiche, resolved_by/at Migration, SW by-v590 2026-05-01 19:44:59 +02:00
e2cd32a550 Feature: Moderation — Forum-Meldungen + POI-Korrekturen, SW by-v589 2026-05-01 19:37:46 +02:00
020153484a Feature: Moderation-Tab — Action-Items-Karte oben, SW by-v588 2026-05-01 19:34:26 +02:00
df8c4cc279 Feature: Tagesmail — Action Items + neue Nutzer heute 2026-05-01 19:31:42 +02:00
d04110c2ae Feature: Admin Action-Items-Karte über Tabs, SW by-v587 2026-05-01 19:29:23 +02:00
fb7bbe5ccc Fix: UI.modal.open() statt UI.modal() im Outreach-Log, SW by-v586 2026-05-01 19:21:38 +02:00
775cda9a67 Feature: Outreach-Log — Mail-Inhalt per Klick anzeigen, SW by-v585 2026-05-01 19:19:03 +02:00
8bdd67573e Fix: form-label Kontrast — c-text statt c-text-secondary, SW by-v584 2026-05-01 18:58:57 +02:00
9cc7b7258a Fix: Telefonnummer im Pressekontakt ergänzt 2026-05-01 18:52:02 +02:00
a6e123a1fd Fix: Gründungsjahr 2026 auf Presseseite 2026-05-01 18:45:53 +02:00
2cc4252120 Feature: Presseseite /presse mit Pressemitteilung, Screenshots, Logos, Gründerfoto 2026-05-01 18:42:59 +02:00
b6fdb23292 Cleanup: Influencer-Runde-2-Vorlagen aus Migration entfernt (bereits versendet) 2026-05-01 18:15:30 +02:00
5e0dcde523 Fix: Pflicht-Footer in Outreach-Mails (UWG §7, DSGVO Art. 14, Anschrift) 2026-05-01 17:50:48 +02:00
ab197d3ca2 Fix: Date-Header in Outreach-Mails (Spam-Prävention) 2026-05-01 17:46:01 +02:00
37ad20a096 Outreach: 7 personalisierte Influencer-Mail-Vorlagen (Runde 2)
@nami.and.tommy, @brina.explores, @heimatherzen, @pfotentick,
@flummis_diary, @verwolft, @babybearyuki — INSERT OR IGNORE Migration
2026-05-01 17:34:20 +02:00
062794c61a landing.html: SEO-Update, 68 Filme, Hundeo-Vergleich, Sicherheits-USP, Social-Links, featureList aktualisiert 2026-05-01 09:59:57 +02:00
da1146b047 Fix: movies-type-btn bekommt movies-filter-btn CSS + Phosphor-Icons sichtbar, SW by-v583 2026-05-01 09:49:48 +02:00
b3bd34c76a UI: Phosphor-Icons für Jobs, Filme, Admin-Bewerbungen + Jobs-Link in Entdecken, SW by-v582 2026-05-01 09:44:51 +02:00
d5e408528b Fix: UI.esc → UI.escape in jobs.js, SW by-v581 2026-05-01 09:37:51 +02:00
8561cffc80 Fix: page-jobs Section in index.html + SW by-v580 2026-05-01 09:34:12 +02:00
f378edab5d Jobs: Bewerbungssystem für Social-Media-Manager/in
Backend:
- job_applications + job_application_docs Tabellen in DB
- luna_trial_until Spalte in users (Migration)
- routes/jobs.py: POST /apply (FormData + Datei-Upload, max 3×10MB),
  GET /my-application, GET /luna-trial-status
- Admin: GET/PATCH /admin/applications, GET /admin/applications/{id}/docs/{doc_id}
- Bei Bewerbung: 14-Tage Luna-Probezugang automatisch aktiviert
- Bei Annahme: is_social_media=1 + Gründer-Status gesetzt
- Status-Mails (pending/reviewing/accepted/rejected) via email_html-Template
- auth.py: require_social_media prüft auch luna_trial_until

Frontend:
- pages/jobs.js: Stellenausschreibung + Bewerbungsformular
  (Name, E-Mail, Hund, Social-Handle, Motivation, Datei-Upload)
- Luna-Probezugang Teaser mit Countdown wenn aktiv
- Bestehende Bewerbung: Status-Screen statt Formular
- app.js: 'jobs' Seite registriert
- admin.js: neuer Tab 'Bewerbungen' (filtert nach Status,
  Statuswechsel per Dropdown, Detailansicht mit Anhang-Download,
  Admin-Notiz-Feld)
- admin.js: Tab 'Jobs' → 'Scheduler' umbenannt
2026-05-01 09:30:05 +02:00
59856e61a1 Filme: DB-Migration, 68 Einträge, Sort + Typ-Filter
- movies-Tabelle in SQLite (statt hardcoded Liste)
- seed_movies(): 68 Filme/Serien/Dokus beim ersten Start
- Felder: titel, originaltitel, jahr, genre, typ, hund_rasse,
  stirbt_der_hund, beschreibung, bild_emoji, imdb_rating, streaming
- GET /api/movies/filme?sort=&typ= — serverseitig sortiert
  Sort: default | titel | jahr_desc | jahr_asc | imdb | bewertung
  Typ: alle | film | serie | doku
- Admin-CRUD: POST/PATCH/DELETE /api/movies/filme
- Frontend: Sort-Dropdown, Typ-Filter-Buttons (Filme/Serien/Dokus),
  Zähler, IMDb-Rating + Streaming auf der Karte
- Promis ebenfalls erweitert (10 statt 6 Einträge)
2026-05-01 08:50:01 +02:00
de1677154f Security + E-Mail-HTML + Quartalsbericht + Registrierungspflicht
Registrierung & Login:
- E-Mail-Verifikation jetzt Pflicht vor erstem Login
- Register gibt keinen Token mehr zurück → "Postfach prüfen"-Screen
- Login blockt mit EMAIL_NOT_VERIFIED (403) wenn unverifiziert
- Resend-Verification ohne Auth (email-basiert)
- Frontend: _renderVerifyPending() nach Register und Login-Fehler
- Account-Lockout: 5 Fehlversuche → 15 Min gesperrt (ratelimit.py)
- Login Rate-Limit zusätzlich per E-Mail-Adresse (5/5 Min)
- Fehler-Tracking wird bei erfolgreichem Login zurückgesetzt

E-Mail-Templates (alle Mails jetzt HTML):
- email_html() Shared-Template in mailer.py (Gradient-Header, Warm-Beige)
- Verifikations-Mail, Passwort-Reset → HTML mit CTA-Button
- Admin-Outreach: plain text auto-wrapped in HTML
- Züchter-Mails (Antrag/Genehmigung/Ablehnung) → Template
- Tierschutz-Alert (litters.py) → Template
- send_support_mail → HTML
- outreach._build_message() + _send_smtp() unterstützen jetzt html= Parameter

Forum-Schutz:
- Post-Cooldown: 30 Sek zwischen beliebigen Posts (DB-Check)
- Stunden-Limit: 5 Threads / 20 Antworten pro User/Stunde
- Duplikat-Erkennung: gleicher Text in 5 Min blockiert (in-memory)
- content_filter.py: Spam-Keywords, URL-Sperre für Accounts < 7 Tage,
  Sonderzeichen-Ratio-Check

Security-Headers:
- HSTS: max-age=31536000; includeSubDomains
- Content-Security-Policy: frame-ancestors none, base-uri self, …
- X-Frame-Options entfernt (CSP frame-ancestors ist moderner)

Honeypot-Fallen (13 Scanner-Pfade → 24h IP-Sperre):
- /api/admin/users, /api/v1/users, /api/.env, /api/config,
  /api/setup, /api/install, /api/phpinfo, /api/debug,
  /api/actuator, /api/swagger, /api/graphql u.a.

Quartalsbericht-System:
- backend/scripts/generate_reports.py: 6 Sections
  (Sicherheit, Funktionsumfang, Dateien, Nutzer, Partner, Server)
- make reports: generiert alle Berichte aus dem Container, committed
- Scheduler: quarterly_report Job (1. Feb/Mai/Aug/Nov 07:00)
  → vollständige HTML-Mail an ADMIN_EMAIL
- quarterly_report erscheint im täglichen Status-Report

Admin-Panel:
- "Forum & Meldungen" → "Forum"
2026-05-01 08:20:53 +02:00
c1bb728153 Reports 2026-05-01 — Quartalsbericht 2026-05-01 08:07:41 +02:00
be300bf5f4 Release v1.2.1 — Launch-Ready: Security, E-Mail-Verifikation, Passwort-vergessen, Forum public, Mailing-System 2026-04-30 20:24:59 +02:00
f3e4a51178 Release v1.2.1 — APP_VERSION bump, SW by-v577 2026-04-30 20:24:55 +02:00
526ff42215 Security: Passwort-Minimum, Rate Limits, Headers, Passwort-vergessen, email_verified
- Passwort-Minimum 8 Zeichen bei Register + Reset
- Rate Limit auf /resend-verification (3/h) und /forgot-password (3/h)
- Security-Headers: X-Frame-Options, X-Content-Type-Options, Referrer-Policy etc.
- email_verified in get_current_user SELECT ergänzt
- Forum: create_thread + create_post erfordern email_verified
- POST /auth/forgot-password + /auth/reset-password (2h-Token, via support@)
- DB-Migration: password_reset_token + password_reset_expires
- Frontend: Passwort-vergessen-Modal im Login, Reset-Formular mit Passphrase-Generator
- SW by-v576, APP_VER 553
2026-04-30 20:23:43 +02:00
82d6417d09 Security: SMTP_SUPPORT Credentials aus docker-compose.yml entfernt — gehören in .env 2026-04-30 20:18:53 +02:00
3291930d07 Fix: arrow-bend-up-left Icon zum Sprite hinzugefügt (Vorlage laden) 2026-04-30 20:05:52 +02:00
4c6dd07c31 Fix: IMAP Sent-Ordner — echten Namen aus LIST-Antwort extrahieren (INBOX.Sent) 2026-04-30 20:03:23 +02:00
31fae63658 Feature: Gesendete Mails via IMAP in Sent-Ordner ablegen 2026-04-30 19:54:51 +02:00
69cb79f973 Release v1.2.0 — E-Mail-Verifikation, Forum public, Auth-Gates, Mailing-System, Partner/Gründer 2026-04-30 19:51:12 +02:00
b9ee67b8dd Feature: E-Mail-Verifikation + Forum öffentlich lesbar + Launch-Vorbereitung
- Forum ohne requiresAuth: öffentlich lesbar, Schreiben weiter via API-Guard
- E-Mail-Verifikation: Token bei Registrierung, support@-Mail, /verify-email/{token}
- Verifikations-Banner (orange, dismissible) wenn email_verified=0
- Grüner Haken / "Nicht bestätigt"-Chip in Settings
- POST /auth/resend-verification für Chip und Banner
- DB-Migration: users.verification_token TEXT
- SW by-v575, APP_VER 552
2026-04-30 19:51:07 +02:00
e79290edb7 Feature: Mailing — Template-Manager, zwei SMTP-Accounts (partner/support)
- email_templates Tabelle (CRUD), Startwert-Vorlage wird einmalig geseedet
- outreach_log.from_account Spalte ergänzt
- Admin-UI: Template-Liste mit Laden/Bearbeiten/Löschen + Modal zum Anlegen
- Compose mit Absender-Auswahl (partner@/support@)
- send_support_mail() intern aufrufbar für Moderations-Trigger
- SW by-v574, APP_VER 551
2026-04-30 19:41:58 +02:00
b17b061496 Fix: Karten-Pin-Setzen erfordert Login — Weiterleitung zu Welcome
SW by-v573, APP_VER 550
2026-04-30 19:33:39 +02:00
a16f0268cc Fix: Nicht-eingeloggte User werden bei geschützten Seiten zu Welcome umgeleitet
Forum erhält requiresAuth, Auth-Guard navigiert zu Welcome statt Inline-Gate.
SW by-v572, APP_VER 549
2026-04-30 19:30:28 +02:00