diff --git a/.projektstructure.txt b/.projektstructure.txt index 6c0dde2..cccebce 100755 --- a/.projektstructure.txt +++ b/.projektstructure.txt @@ -1,9 +1,9 @@ Anweisung: Projektstruktur (Basis-Template) wie in „papa-kind-treff“ Aktueller Projektstand -- Papa-Kind-Treff nutzt im Mitgliederbereich DiceBear `lorelei` direkt für externe SVG-Avatare. +- Papa-Kind-Treff nutzt im Mitgliederbereich DiceBear `lorelei` über einen internen API-Proxy mit lokalem Cache. - Relevante Logik liegt in `src/App/Avatar/Lorelei.php`. -- Die Avatar-Logik erzeugt direkte DiceBear-URLs; der frühere Proxy wird aktuell nicht mehr für die Auslieferung verwendet. +- Der Avatar-Proxy liegt unter `public/page/api/avatar.php`. - Die visuelle Avatar-Konfiguration liegt im Dashboard-Modal unter `partials/landing/account/dashboard.php` und rendert Komponenten-Vorschauen live nach. - Neue Grundvarianten werden im gleichen Modal als separates Auswahlraster eingeblendet und übernehmen die aktuell gewählten Lorelei-Komponenten. - Alte statische Avatar-Presets und frühere Layer-Assets sind entfernt; aktiv ist nur noch der Lorelei-Generator. diff --git a/PROJECT_CONTEXT.md b/PROJECT_CONTEXT.md index 0fd2dc7..4bf5047 100644 --- a/PROJECT_CONTEXT.md +++ b/PROJECT_CONTEXT.md @@ -20,9 +20,9 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter. Kernbereiche sind l - Die Community ist hierarchisch aufgebaut: Kategorien -> Boards -> Threads -> Posts. - Moderation ist getrennt vom normalen Community-Frontend in einem eigenen Adminbereich. - Standortfunktionen sind relevant für lokale Treffen und werden künftig weiter ausgebaut. -- Profilbilder werden aktuell über DiceBear im Stil `lorelei` direkt als externe SVG geladen. +- Profilbilder werden aktuell über DiceBear im Stil `lorelei` serverseitig erzeugt und lokal gecacht. - Der Avatar-Editor bietet aktuell visuelle Komponenten-Vorschauen statt reiner Text-Dropdowns. -- Frühere statische Preset-Avatar-Assets wurden entfernt; der aktuelle Stand nutzt nur noch den Generator mit direkter DiceBear-Auslieferung. +- Frühere statische Preset-Avatar-Assets wurden entfernt; der aktuelle Stand nutzt nur noch den Generator mit Proxy/Cache. ## Navigation / Konto - Eingeloggte Nutzer sehen rechts ein Profil-Menü statt einzelner `Dashboard`-/`Logout`-Buttons. diff --git a/README.md b/README.md index 55ee957..4a3a023 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Papa-Kind-Treff ist eine PHP-basierte Plattform für Väter mit Fokus auf lokale - Impressum, Datenschutz-&-Cookies-Seite und Über-uns - standortbasierte Sortierung für die neuesten Treffen - eigener Einstellungsbereich für Standortfreigabe, Browser-Hinweise und Consent-Verwaltung -- modernes Avatar-System auf Basis von DiceBear `lorelei`, direkt als externe SVG ausgeliefert +- modernes Avatar-System auf Basis von DiceBear `lorelei`, serverseitig über einen lokalen Proxy mit Cache ausgeliefert - Profilbild-Generator mit visueller Komponenten-Auswahl für Augen, Augenbrauen, Mund, Brille, Haare, Bart und Ohrringe sowie einer separaten Auswahl neuer Grundvarianten - keine statischen Avatar-Preset-Dateien mehr im Repository; Vorschau und Auswahl laufen vollständig über den Lorelei-Generator - Consent-Manager für Analyse und externe Dienste @@ -50,7 +50,7 @@ Der aktuelle Code nutzt oder kann nutzen: - lokale Standortspeicherung via Cookie, `localStorage`, `sessionStorage` (`external_services`) - Leaflet von `unpkg.com` (`external_services`) - OpenStreetMap Nominatim (`external_services`) -- DiceBear `lorelei` für extern geladene Profilbilder +- DiceBear `lorelei` für serverseitig erzeugte Profilbilder Wichtig: - Nicht notwendige Analyse- und Drittanbieterfunktionen dürfen erst nach Einwilligung aktiv werden. diff --git a/public/assets/js/app.js b/public/assets/js/app.js index 248d444..9567564 100755 --- a/public/assets/js/app.js +++ b/public/assets/js/app.js @@ -744,7 +744,13 @@ document.addEventListener('DOMContentLoaded', () => { }; const avatarComponentFields = Object.keys(avatarComponentFieldMap); - const avatarEndpoint = 'https://api.dicebear.com/10.x/lorelei/svg'; + const avatarEndpoint = '/api/avatar'; + const avatarOptionalProbabilityMap = { + avatar_lorelei_glasses_variant: 'glassesProbability', + avatar_lorelei_hair_variant: 'hairProbability', + avatar_lorelei_beard_variant: 'beardProbability', + avatar_lorelei_earrings_variant: 'earringsProbability', + }; const buildAvatarParams = (form, overrides = {}) => { const seed = overrides.avatar_preset || readAvatarValue(form, 'avatar_preset'); @@ -756,6 +762,12 @@ document.addEventListener('DOMContentLoaded', () => { ? overrides[field] : readAvatarValue(form, field); const param = avatarComponentFieldMap[field]; + const probabilityParam = avatarOptionalProbabilityMap[field]; + + if (probabilityParam) { + params.set(probabilityParam, value ? '100' : '0'); + } + if (value && param) params.set(param, value); }); @@ -771,7 +783,6 @@ document.addEventListener('DOMContentLoaded', () => { const params = buildAvatarParams(form); if (!params) return; - params.set('size', '256'); const url = `${avatarEndpoint}?${params.toString()}`; if (!url) return; image.src = url; @@ -784,7 +795,6 @@ document.addEventListener('DOMContentLoaded', () => { const params = buildAvatarParams(form, { [field]: value }); if (!params) return; - params.set('size', '256'); image.src = `${avatarEndpoint}?${params.toString()}`; }); }; @@ -803,7 +813,6 @@ document.addEventListener('DOMContentLoaded', () => { card.type = 'button'; card.className = 'avatar-seed-card'; card.setAttribute('data-avatar-seed-option', seed); - params.set('size', '256'); card.innerHTML = ` Grundvariante ${index + 1} diff --git a/public/page/datenschutz.php b/public/page/datenschutz.php index e9d9698..de72df1 100644 --- a/public/page/datenschutz.php +++ b/public/page/datenschutz.php @@ -151,9 +151,9 @@ $clientCookie = $config->cookiePrefix() . 'client';

10. Profilbilder mit DiceBear

- Profilbilder werden über den Dienst DiceBear im Stil „Lorelei“ erzeugt. Dabei wird für die - Generierung nur der im Profil gespeicherte Avatar-Seed verwendet. Dein Browser lädt die Avatar-Grafiken - direkt von DiceBear. + Profilbilder werden serverseitig über den Dienst DiceBear im Stil „Lorelei“ erzeugt. Dabei wird für die + Generierung nur der im Profil gespeicherte Avatar-Seed verwendet. Der Abruf erfolgt über unsere Anwendung + und wird lokal zwischengespeichert, sodass dein Browser die Avatar-Grafiken nicht direkt bei DiceBear lädt.

Rechtsgrundlage ist Art. 6 Abs. 1 lit. b DSGVO, soweit die Avatar-Erzeugung Teil des gewählten @@ -166,7 +166,7 @@ $clientCookie = $config->cookiePrefix() . 'client';

Eine Weitergabe erfolgt nur, soweit sie für den Betrieb der Website oder einzelner Funktionen erforderlich ist. Dazu können insbesondere technische Hosting-Dienstleister, E-Mail-Dienstleister, - Analyse-Dienstleister, DiceBear für die Avatar-Erzeugung sowie die oben genannten externen Karten- und Standortdienste gehören. + Analyse-Dienstleister, DiceBear für die serverseitige Avatar-Erzeugung sowie die oben genannten externen Karten- und Standortdienste gehören.

diff --git a/src/App/Avatar/Lorelei.php b/src/App/Avatar/Lorelei.php index 08bfeab..13b679d 100644 --- a/src/App/Avatar/Lorelei.php +++ b/src/App/Avatar/Lorelei.php @@ -127,7 +127,7 @@ final class Lorelei public static function buildProxyUrl(array $row): string { - return 'https://api.dicebear.com/10.x/lorelei/svg?' . http_build_query(self::apiQuery($row) + ['size' => '256']); + return '/api/avatar?' . http_build_query(self::apiQuery($row)); } public static function previewChoices(array $row, string $field): array