Chat: Bilder, Kamerafoto, Dateien und Sprachnachrichten

- Kundenbereich und Admin-Chat: Bueroklammer-Menue (Bild, Kamera, Datei),
  Mikrofon fuer Sprachnachrichten, Vorschau vor dem Senden mit
  Upload-Fortschritt, Einfuegen (Strg+V) und Hineinziehen von Dateien
- Kamera: am Handy/Tablet die Kamera-App, am Rechner die Kamera im Browser
  mit Vorschau, Kamerawechsel und "Nochmal"
- Sprachnachricht: Aufnahme mit Zeit und Pegel, vorher anhoerbar oder
  direkt senden, hoechstens 5 Minuten
- Verlauf: Bilder (einzeln bzw. Raster, Grossansicht), Player fuer
  Sprachnachrichten, Datei-Kacheln mit Download
- Server: jede Datei einzeln roh hochgeladen (max. 25 MB, 10 je Nachricht,
  max. 3 gleichzeitig), Typ aus dem Inhalt, nur erlaubte Endungen, keine
  Programme; Ablage unter upload-data/chat/<Kunde>/ ausserhalb von public/,
  Auslieferung nur mit Login; Bilder, Audio und PDF inline, alles andere
  als Download (nosniff, CSP sandbox)
- Nicht gesendete Anhaenge werden nach 24 Stunden geloescht
- Benachrichtigungs-Mail nennt nur Art und Namen der Anhaenge
- Appwrite: neues Attribut portalMessages.attachments
  (scripts/setup-chat-collection.mjs, vor dem Deploy ausfuehren)
- Datenschutzerklaerung Abschnitt 6 ergaenzt (Stand 26.09.2026), PDF neu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-09-26 14:01:17 +00:00
1 parent 6e18a70a5d
commit 35d98da977
15 files changed
+2086 -107

No files matched your search

+4 -1
View File
@@ -1,7 +1,8 @@
#!/usr/bin/env node
/**
* Legt die Collection portalMessages (Kunde-Admin-Chat) in woms-database an.
* Idempotent: existierende Collection/Attribute/Indexe werden uebersprungen.
* Idempotent: existierende Collection/Attribute/Indexe werden uebersprungen
* (also auch zum Nachruesten neuer Attribute wie `attachments` geeignet).
* Usage: APPWRITE_API_KEY=... node scripts/setup-chat-collection.mjs
*/
const endpoint = (process.env.APPWRITE_ENDPOINT || 'https://ticket.webklar.com/v1').replace(/\/$/, '')
@@ -78,6 +79,8 @@ const attributes = [
{ kind: 'string', key: 'sender', size: 16, required: true },
{ kind: 'string', key: 'senderName', size: 128, required: false },
{ kind: 'string', key: 'text', size: 4000, required: true },
// JSON-Liste der Anhaenge (Bilder, Dateien, Sprachnachrichten); Dateien selbst liegen auf dem Server
{ kind: 'string', key: 'attachments', size: 20000, required: false },
{ kind: 'boolean', key: 'readByAdmin', required: false },
{ kind: 'boolean', key: 'readByCustomer', required: false },
{ kind: 'datetime', key: 'createdAt', required: true },