metatrondelivery/app/routes/webhooks.customers.redact.tsx
metatroncubeswdev e6b8b710c4
Some checks failed
CI / Lint, Unit & Integration Tests (push) Has been cancelled
feat(phase-8): implement GDPR compliance webhook handlers
Replace the customers/data_request, customers/redact, and shop/redact
stubs with real logic in app/services/gdpr.server.ts: compile a
customer's Booking history, anonymize customerEmail/customerPhone on
redact, and purge every shopDomain-scoped row on shop uninstall
(Booking before Location, relying on Location's cascade for
SlotTemplate/SlotOverride/BlackoutDate/Zone/Rate). Covered by a new
tests/integration/gdpr.test.ts against live Postgres to verify the
FK deletion order actually works, not just typechecks.

Still commented out in shopify.app.toml pending Protected customer
data access approval in the Partner Dashboard — unrelated to code
readiness.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 09:20:16 -04:00

21 lines
910 B
TypeScript

import type { ActionFunctionArgs } from "@remix-run/node";
import { authenticate } from "../shopify.server";
import { redactCustomerData, type CustomerWebhookPayload } from "../services/gdpr.server";
// GDPR: erase a specific customer's data (fires 10 days after a customer's
// data erasure request, or 6 months after their last order on the shop).
// Bookings are kept for the shop's own revenue/utilization history — only
// the customer-identifying fields (email/phone) are anonymized.
export const action = async ({ request }: ActionFunctionArgs) => {
const { shop, topic, payload } = await authenticate.webhook(request);
const { customer } = payload as CustomerWebhookPayload;
const { count } = await redactCustomerData(shop, customer);
console.log(
`[gdpr] ${topic} for ${shop}: customer ${customer?.id ?? "unknown"} — redacted ${count} booking(s)`,
);
return new Response();
};