Files
Webklar-Kundenbereich/server/services/shop/kundenLoeschung.js
T
ClaudeandClaude Opus 5.5 b8055b336c Shop J3: Tagesjob und Stundenjob, Löschfristen, Kundenlöschung
- shop/jobs.js: taeglicherJob (Käuferdaten bezahlter Bestellungen und Widerrufe 3 Jahre nach Ende des Bestelljahres anonymisieren, Grenze 1. Januar Berlin; unbezahlte/stornierte Bestellungen nach 30 Tagen löschen; Shops seit 90 Tagen disabled samt Artikeln, Bestellungen, Widerrufen, Bildern und shopConfig löschen, Funktionsdokument bleibt disabled mit Vermerk), seitenweise mit Deckel je Lauf, Schritte und Dokumente einzeln abgesichert; stuendlicherJob räumt nie beanspruchte Bilder auf
- shop/loeschen.js: gemeinsamer Baustein zum Löschen aller Daten eines Shops (Tagesjob und Löschfristen)
- shop/kundenLoeschung.js + customerAdmin.js: Kundenlöschung schaltet den Webshop ab (kunde_geloescht) und schließt die Shops
- retention.js: fällige Kunden verlieren auch ihre Shopdaten (vor den Abo-Dokumenten, bei Fehler held)
- server/index.js: Minuten- (75 s), Stunden- (130 s) und Tagesjob (200 s) registriert
- Tests: shopJobs.test.js, retention.test.js erweitert

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 09:15:20 +00:00

27 lines
1.1 KiB
JavaScript

import { config } from '../../config.js'
import { listAllDocuments, Query, updateDocument } from '../appwriteAdmin.js'
import { leereCache } from './kontext.js'
/**
* Kundenloeschung (Plan 2026-10-05-webshop.md, J3): schliesst alle Shops des Kunden (shopConfig.geoeffnet=false) und leert den
* Speicher der oeffentlichen Schnittstelle. Die Funktion selbst schaltet disableCustomerFeatures ab; die Daten loescht der Tagesjob
* (shop/jobs.js) 90 Tage nach dem Abschalten. Scheitert ein Shop, werden die uebrigen trotzdem geschlossen und der erste Fehler weitergereicht.
* @returns {Promise<number>} Zahl der geschlossenen Shops
*/
export async function schliesseShopsVonKunde(customerId) {
const shops = await listAllDocuments(config.collections.shopConfig, [Query.equal('customerId', customerId)])
let geschlossen = 0
let erster = null
for (const shop of shops) {
try {
if (shop.geoeffnet !== false) await updateDocument(config.collections.shopConfig, shop.$id, { geoeffnet: false })
geschlossen += 1
} catch (err) {
erster ||= err
}
leereCache(shop.siteKey || undefined)
}
if (erster) throw erster
return geschlossen
}