Files
Documentos-Unicos/projetos/newwhats.clube67.com/wasabi-midias.md
T
VPS 4 Builder 9bbd170626 docs(newwhats): tarefas, wasabi/mídias, ativação inteligente e regra bidirecional
- 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>
2026-06-28 14:43:43 +02:00

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 no messages).
  • 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) — evita listObjects caro.
  • 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 deleteObjects em lote (S3 aceita até 1000/req) além do deletePrefix.
  • Endpoint admin protegido + dry-run (retorna contagem antes de apagar).

3. Retenção

  • Após messages.transcription salva, 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.