9bbd170626
- tarefas.md: checklist mestre de pendências (fases 3-5, wasabi, ativação) - wasabi-midias.md: estado + index/delete em lote (DB↔Wasabi, retenção) - ativacao-whatsapp.md: trajeto inteligente de provisionamento no motor - integracao-satelites.md: regra de registro bidirecional + plugin único por projeto Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.3 KiB
2.3 KiB
newwhats.clube67.com — Wasabi & mídias (index + delete em lote)
Estado atual + desenho do que falta. Storage = Wasabi (S3-compatível) via
StorageProvider(backend/src/core/StorageProvider.ts). Última revisão: 28/jun/2026.
Como funciona hoje
- Upload (
uploadFile): fire-and-forget após receber a mídia/avatar; grava no bucket e salva no DB apenas o path relativo (ex.: avatar →contact.avatarUrl; mídia de mensagem → caminho nomessages). - Leitura: proxy público no
server.ts(sem authMiddleware, pois<img>/<audio>/ <video>não mandam header) → busca bytes no Wasabi; se não houver, faz fallback ao CDN do WhatsApp e re-persiste. - Delete: só
StorageProvider.deletePrefix(prefix)→{ deleted }. Apaga por prefixo (ex.: tudo de uma instância). Não há listagem nem delete seletivo.
Convenção de path (prefixos)
Os paths são hierárquicos por tenant/instância/..., o que permite delete em lote
por prefixo. Confirmar o layout exato no StorageProvider antes de implementar
(avatar usa avatarWasabiPath(tenantId, instanceId, jid)).
O que falta (pendência)
1. Index de mídias
Listagem/auditoria das mídias por tenant / instância / chat / período:
- Fonte primária: tabela
messages(path + metadados) — evitalistObjectscaro. - Endpoint admin:
GET /admin/media?instanceId=&chatId=&from=&to=→ paginação, tamanho total, contagem por tipo. - Reconciliação opcional DB ↔ bucket para achar órfãos (no bucket sem registro).
2. Delete em lote
- Por instância (offboarding), por período (retenção), por chat (LGPD).
- Coordenado DB ↔ Wasabi: apagar registro e objeto na mesma operação lógica; nunca deixar órfão nem link quebrado.
- Implementar
deleteObjectsem lote (S3 aceita até 1000/req) além dodeletePrefix. - Endpoint admin protegido + dry-run (retorna contagem antes de apagar).
3. Retenção
- Após
messages.transcriptionsalva, o áudio pode ser arquivado/descartado (a Secretária já "entende" pelo texto). Job de retenção por idade/tamanho.
Cuidados
- Delete é destrutivo e externo (Wasabi) — sempre dry-run + confirmação.
- Não apagar avatar/mídia ainda referenciada por outra mensagem (dedup por path).
- Operações em lote: throttle para não estourar limites do S3.