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>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# 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.
|
||||
</content>
|
||||
Reference in New Issue
Block a user