Rafael Melgaço and Claude Opus 4.7
9f6a73bda5
feat(EPIC-08): lgpd-redact-worker [wave 5]
...
Cascade SQL transacional via RPC fn_lgpd_cascade_redact_contact (security
definer, search_path=public, atomic per contact). 7 mutations dentro de
1 TX:
1. contacts → is_anonymized=true, name='Cliente Anonimizado #...',
email/phone/cpf/birthdate nulled, consent={}, tags=[] (L-04 irreversível)
2. conversations.metadata = {}
3. messages: body='[mensagem anonimizada]', media_url=null, metadata={}
4. crm_lead_activities.metadata = {}
5. crm_leads.title anonimizado + metadata pessoal stripped
6. orders: PRESERVADOS (valor histórico fiscal, Spec 06 §7.1) — apenas
metadata personal-fields stripped
7. storage_redaction_queue: media URLs enfileiradas pra deleção async
8. api_audit_log: lgpd.redact_executed com cascaded_to counts + bypassed_rls
Worker:
- scope='contact': 1 RPC call; idempotente (already_anonymized short-circuit)
- scope='tenant' (emergency=true): batches de 100 com checkpoint em
request_payload.progress (resumível); ao final flips
organizations.status='redacted'
- Tenta callback NuvemshopAdapter.redactCustomer (stub se adapter ausente)
- Status flow received → processing → completed | failed | partial_failure
- attempts capped at 3
- Emit lgpd.redact_applied + lgpd.redact_failed; audit dense; zero PII em logs
Storage cleanup worker drena storage_redaction_queue async (cron-friendly).
Migrations:
- 0018_lgpd_redaction_queue: tabela storage_redaction_queue + RLS
- 0019_lgpd_cascade_redact_rpc: function fn_lgpd_cascade_redact_contact
L-01/L-04/L-06 enforced. Spec 01 §8.2 + Spec 06 §7.1 implementados.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-29 12:06:09 -03:00