diff --git a/README.md b/README.md index d9a0679..bd6309a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Technisch besteht die Anwendung aus einem React-/Tailwind-Frontend und einem Exp - Optionale serverseitige Gemini-Unterstützung für Klappentexte - Profilabhängige SEO-Metadaten, Open Graph, strukturierte Daten, Sitemap und `robots.txt` - Health-Endpunkte, persistente JSON-Datenhaltung und automatische Migrationsbackups -- optionale Kontaktsektion je Profil für E-Mail, Instagram und Threads +- optionale Kontaktsektion je Profil für E-Mail, Instagram, Threads und Discord - adressierbare und teilbare Buch-/Projektansichten - neutrale, nicht indexierbare 404-Seite ohne Hinweise auf andere Profile @@ -169,7 +169,7 @@ Die Buttons öffnen das Ziel in einem neuen Tab und werden automatisch mit den A ## Kontakt und Social Media -Jedes Profil kann unabhängig eine Kontakt-E-Mail-Adresse sowie Links zu Instagram und Threads erhalten. Der Abschnitt erscheint unterhalb des zusätzlichen Textmoduls und zeigt nur tatsächlich gepflegte Angaben. Es gibt bewusst kein serverseitiges Kontaktformular; dadurch entstehen weder Spam-Endpunkt noch zusätzliche gespeicherte Kontaktdaten. +Jedes Profil kann unabhängig eine Kontakt-E-Mail-Adresse sowie Links zu Instagram, Threads und Discord erhalten. Der Abschnitt erscheint unterhalb des zusätzlichen Textmoduls und zeigt nur tatsächlich gepflegte Angaben. Es gibt bewusst kein serverseitiges Kontaktformular; dadurch entstehen weder Spam-Endpunkt noch zusätzliche gespeicherte Kontaktdaten. ## Buchreihen, KDP-Links und Leseproben @@ -191,7 +191,7 @@ Weitere mögliche externe Verbindungen: - `GEMINI_API_KEY`: Der optionale Admin-Assistent sendet die eingegebenen Buchinformationen serverseitig an die Google-Gemini-API. - Kauf- und sonstige Markdown-Links: Erst ein Klick führt zur jeweiligen externen Website. -- Instagram-, Threads- und bewusst gepflegte Profilverlinkungen: Eine Verbindung entsteht erst beim Klick. +- Instagram-, Threads-, Discord- und bewusst gepflegte Profilverlinkungen: Eine Verbindung entsteht erst beim Klick. - Externe Bild-URLs: Das System unterstützt sie weiterhin, empfohlen werden jedoch lokal hochgeladene Bilder. Die Anwendung enthält kein Analytics- oder Tracking-System und lädt keine externen Webfonts. Sie verwendet für Besucher weder `localStorage` noch `sessionStorage`. Der Browser speichert lediglich das notwendige Admin-Sitzungscookie nach einer Anmeldung. Diese Punkte sowie das übliche Logging des Reverse Proxys/Hosters sollten passend zur tatsächlichen Installation in der Datenschutzerklärung beschrieben werden. diff --git a/server.ts b/server.ts index 3a45f7c..218e751 100644 --- a/server.ts +++ b/server.ts @@ -545,7 +545,7 @@ function validateProfile(profile: unknown): string | null { return "Mindestens eine Bild-URL ist ungültig."; } if (value.contactEmail && (value.contactEmail.length > 320 || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value.contactEmail))) return "Die Kontakt-E-Mail-Adresse ist ungültig."; - if (!isSafeContentUrl(value.instagramUrl) || !isSafeContentUrl(value.threadsUrl)) return "Mindestens ein Social-Media-Link ist ungültig."; + if (!isSafeContentUrl(value.instagramUrl) || !isSafeContentUrl(value.threadsUrl) || !isSafeContentUrl(value.discordUrl)) return "Mindestens ein Social-Media-Link ist ungültig."; if (value.fontFamily && !["sans", "serif", "mono"].includes(value.fontFamily)) return "Die Schriftart ist ungültig."; for (const project of value.projects) { if (!project || typeof project.id !== "string" || typeof project.title !== "string" || project.title.length > 500 || diff --git a/src/components/AdminPanel.tsx b/src/components/AdminPanel.tsx index c80cdf3..cbd85ac 100644 --- a/src/components/AdminPanel.tsx +++ b/src/components/AdminPanel.tsx @@ -666,7 +666,7 @@ export default function AdminPanel({ onLogout }: AdminPanelProps) {
Diese drei Kacheln erscheinen unter der Biografie. Sie können die Kategoriename (z.B. GENRE, TONALITÄT, FOKUS) und den zugehörigen Inhalt frei anpassen.
-Weitere Neuigkeiten, Einblicke und Kontaktmöglichkeiten.
@@ -426,6 +426,11 @@ export default function PortfolioPage({ data, legalDocuments = [], theme }: Port