Kundenkonten sind jetzt genauso echt wie die PayPal-Zahlung: server-geprüftes OAuth 2.0 mit PKCE für Google und "Log in with PayPal" (functions/_shared/oauth.js, oauth-handlers.js), neue D1-Tabelle "customers" (bewusst ohne Passwort-Feld), eigene von der Zugangscode-Schranke getrennte Sitzungs-Logik (customer-auth.js). Echte DSGVO-Rechte direkt im Kontobereich: Daten herunterladen (Art. 15/20) und Konto unwiderruflich löschen (Art. 17), Bestellungen bleiben aus gesetzlichen Gründen erhalten. Datenschutzerklärung entsprechend ergänzt. Ohne echte Google-/PayPal-Zugangsdaten zeigt der Login-Button ehrlich einen "noch nicht eingerichtet"-Hinweis statt eine Anmeldung vorzutäuschen. Co-Authored-By: Claude Sonnet 5 <[email protected]>
39 lines
1.5 KiB
JavaScript
39 lines
1.5 KiB
JavaScript
/* =====================================================================
|
|
GET /api/account/export — liefert alle über dieses Konto gespeicherten Daten als JSON-Datei
|
|
zum Download (DSGVO Art. 15 "Auskunftsrecht" + Art. 20 "Recht auf Datenübertragbarkeit").
|
|
Echtes Selbstbedienungs-Werkzeug statt eines manuellen Prozesses. ===================================================================== */
|
|
|
|
import { getCustomer } from "../../_shared/customer-auth.js";
|
|
|
|
export async function onRequestGet(context) {
|
|
const { request, env } = context;
|
|
const customer = await getCustomer(request, env);
|
|
if (!customer) {
|
|
return new Response(JSON.stringify({ ok: false, error: "Nicht angemeldet." }), {
|
|
status: 401,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
const daten = {
|
|
konto: {
|
|
email: customer.email,
|
|
name: customer.name,
|
|
anmeldeart: customer.provider,
|
|
erstelltAm: customer.created_at,
|
|
},
|
|
hinweis:
|
|
"Dies sind alle Daten, die Van's DIY & Bastelbedarf zu deinem Kundenkonto speichert. " +
|
|
"Bereits aufgegebene Bestellungen werden getrennt davon aus gesetzlichen Aufbewahrungsgründen " +
|
|
"weiter gespeichert (siehe Datenschutzerklärung, Abschnitt Bestellabwicklung).",
|
|
};
|
|
|
|
return new Response(JSON.stringify(daten, null, 2), {
|
|
status: 200,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Content-Disposition": 'attachment; filename="meine-daten.json"',
|
|
},
|
|
});
|
|
}
|