Exibição de arquivos, imagens - IMPLEMENTAÇÃO #11
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Analisar e corrigir a exibição de:
Imagens
Videos
Previa de Link - aplicar segurança de abertura para evitar invasão ao servidor
Arquivos PDF - implementar visualizador sem precisar baixar, usar algo profissional para o usuario ver o pdf direto no nosso app
Proibir o download de arquivos zipados ou executaveis ou .sh ou .py
https://clube67.com/api/media/82193218-0558-44c3-a34a-b257a9db3e1a/b6434831-9d17-4656-8494-4964d389b230.jpg
Cannot GET /api/media/82193218-0558-44c3-a34a-b257a9db3e1a/b6434831-9d17-4656-8494-4964d389b230.jpg
🖥️ [VPS 1 - App Server]: Investigação completa + Wasabi implantado
✅ O que foi realizado localmente
1. Causa raiz do
Cannot GET /api/media/...— identificadaArquivo afetado:
frontend/utils/mediaUtils.ts(funçãogetMediaUrl())O frontend constrói a URL de mídia como:
nginx roteia
/api/→backend:8008. Express temapp.use('/media', express.static('./media'))sem o prefixo/api. Resultado:GET /api/media/...não tem handler → 404.Fix necessário em
backend/src/server.ts(adicionar alias):2. Mídia perdida em rebuild — causa identificada
Arquivo afetado:
docker-compose.ymlO diretório
/app/media/dentro do container não tem volume mount. Todo arquivo salvo localmente é perdido ao recriar o container.Fix necessário em
docker-compose.yml(serviçonewwhats-backend):E criar o diretório:
mkdir -p /home/deploy/newwhats-media3. ✅ Wasabi storage — operacional
whatsbasemidia, endpoints3.wasabisys.com)whatsapp/{usuarioSis}/{sessionJID}/{timestamp}-{arquivo}UnifiedStorageProvideragora inicializa corretamente com credenciais do DragonflyDBLog de boot confirmado:
4. ✅ Sistema de alertas de saúde do Wasabi — implantado
Novos arquivos/endpoints:
GET /api/admin/plugins/storage/health— retorna status detalhado com 8 razões:ok,not_configured,needs_restart,auth_error,billing_error,bucket_not_found,network_error,unknown5. ✅
.dockerignorecriadoBuilds futuros do backend passaram de contexto 623 MB → 7 KB (exclui
node_modules/,dist/,sessions/, etc.)⏭️ [AÇÃO REQUERIDA NA VPS 1 — mesmo servidor, próximo agente]
Implementar os 5 itens restantes do issue:
A. Fix crítico —
/api/media/404 (1 linha emserver.ts) — ver item 1 acimaB. Volume de mídia (1 linha em
docker-compose.yml+ mkdir) — ver item 2 acimaC. Link Preview com SSRF protection:
http/https<og:title>,<og:description>,<og:image>LinkPreview.tsx) já chama este endpointD. Bloqueio de tipos perigosos no upload:
plugins/uploads/index.ts(handler multer).zip,.exe,.sh,.py,.bat,.cmd,.ps1,.jar,.msiE. Player inline de vídeo + visualizador PDF:
MessageBubble.tsx: detectarmimetype.startsWith('video/')→<video controls src="/api/storage/view/{path}">MessageBubble.tsx: detectarmimetype === 'application/pdf'→<iframe src="/api/storage/view/{path}">/api/storage/view/*já existe no pluginUnifiedStorageProvidere faz proxy do Wasabi🚦 [STATUS]:
[Aguardando Homologação do Usuário]nome do arquivo esta como
Documento
FILE . N/A
NO nosso sistema, tbm esta abrindo em outra pagina!
enquanto no whatsapp oficial abre dentro do sistema e esta:
Icone que reflete que o arquivo é um pdf -> PDF - nome do arquivo.pdf -> pdf . 140 KB
replicar em outros formatos
Em anexo esta como o whatsapp oficial trata o pdf, gravando audio, audio recebido antes de ler com detalhes verdes, audio ouvido em detalhes azul, opção de aumentar velocidade de reprodução 1x , quando clica ele muda para 1,5x ou 2x
analise os detalhes das imagens anexadas, para replicar exatamente em nosso sistema
🖥️ [VPS 1 - App Server]: Implementação de player de áudio, visualizador de documentos e PDF inline
Resposta ao comentário #42
✅ O que foi implementado
Documento (
case 'document') —DocumentBubbleAntes:
Documento / FILE · N/A, abre em outra abaAgora:
textou extraído da URL)PDF · 140 KB(extensão + tamanho real)<iframe>) — sem sair da páginaÁudio/PTT (
case 'audio'/case 'ptt') —AudioBubble<audio>) — sem precisar sairInputBarjá tinha indicador de gravação "GRAVANDO 0:00" — não alterado🚀 Deploy
clube67-newwhats-frontend:ed351e7e6ca7)🚦 [STATUS]:
[Aguardando Homologação do Usuário]