- Passa file.originalname ao sendMediaMessage no controller
- Adiciona filename ao payload da Meta API para documentos
- Usa filename como bodyText quando não há legenda
- Emite mediaFilename via gateway Socket.IO
- Persiste media_filename no banco (migration 028)
- Adiciona mediaFilename ao repositório de mensagens
- fileFilter no Multer rejeita tipos não suportados antes de bufferizar
- Limite por tipo: imagem 5 MB, áudio/vídeo 16 MB, documento 100 MB
- Erro retornado ao frontend em caso de violação
- Upload do arquivo para Meta API (multipart) para obter media_id
- Armazenamento local via MediaStorageService antes do envio
- Suporte a image, audio, video e document via mimeTypeToMediaType
- Salva mensagem no banco com media_path e media_mime_type
- Emite via Socket.IO para atualizar o chat em tempo real
- Detecta mensagens de mídia (image, audio, video, document, sticker)
- downloadMetaMedia() busca URL temporária na Meta e baixa o binário
- Salva via MediaStorageService antes de persistir e emitir
- Socket.IO passa mediaUrl e mediaMimeType ao invés de media: null
- Falha no download loga erro mas não bloqueia o salvamento da mensagem
- MediaStorageService com interface upload/getUrl/delete
- LocalDiskAdapter salva em /uploads/media/ com UUID + extensão por mimetype
- Cria o diretório automaticamente no boot
- BASE_URL adicionado ao .env.example
- MediaStorageService e LocalDiskAdapter registrados no WhatsappModule
- Adiciona waba_id ao WhatsappConfigService/Repository/DTO
- Reescreve WhatsappTemplateRepository com colunas HSM (language,
meta_template_name, header, footer, buttons, body_variables)
- Reescreve WhatsappTemplateService: submitToMeta(), syncFromMeta(),
handleTemplateStatusUpdate() para webhook automático
- Adiciona endpoints POST /whatsapp/templates/:id/submit-meta e
POST /whatsapp/templates/sync-meta no controller
- WhatsappService.startAttendance() envia como type=template quando
meta_status=APPROVED; sendTemplateMessage() com body parameters
- Webhook message_template_status_update atualiza status no banco
automaticamente sem precisar sincronizar manualmente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O frontend exige IDs no formato 5511999@c.us (verifica includes('@')
antes de carregar mensagens e usa split('@')[0] para exibir o nome).
Adicionados helpers cleanPhone/toWaId: DB continua com números limpos,
interface pública expõe @c.us. Corrige mensagens não carregando ao
abrir um chat e socket real-time mapeando o contato correto.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
O frontend bloqueia loadChats() quando whatsappStatus !== 'CONNECTED'.
Com a Meta API, getStatus() retornava 'META_API', zerando a lista de
conversas a cada refresh. Corrigido para retornar 'CONNECTED' e o gateway
agora emite o status ao conectar para atualizar o frontend via socket.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implementação do método sendMessage para enviar mensagens via Meta Graph API.
- Atualização do método reply para utilizar o sendMessage ao invés de apenas logar a mensagem
- Criado módulo agent para presença e notas do atendente
- Removidas responsabilidades de agente do módulo admin
- Movido SQL de presença e notas para repositories
- Adicionados DTOs para rotas de agente
- Presença e notas passam a usar usuário autenticado via JWT
- Mantida compatibilidade com userId legado do frontend
- Atualizada wiki backend de Admin, Agent e WhatsApp
- Criado módulo de contatos para centralizar a gestão dos contatos dos clientes.
- Movidos arquivos relacionados a contatos do módulo admin para o novo módulo de contatos.
- Atualizadas as importações e dependências para refletir a nova estrutura do módulo.
- Criado DTO para contato e repositório para gerenciar as operações de banco de dados relacionadas a contatos.
- Templates de WhatsApp agora são gerenciados por um repositório e serviçodedicado.
- DTOS para WhatsApp foram criados para melhor estruturação dos dados.
- AtteandanceAssigmentRepository foi criado para gerenciar as atribuições de atendimento.
- Db Query focados apenas em repositorios, deixando os serviços mais limpos e focados na lógica de negócio.
- Encodings corrigidos.
- Movido fluxo do bot para módulo próprio knowledge-base
- Mantido contrato HTTP em /admin/knowledge por compatibilidade
- Criado KnowledgeBaseRepository para concentrar SQL
- Service agora fica responsável por regra de negócio e orquestração
- Removida criação de schema em runtime do fluxo do bot
- Atualizada documentação do módulo e wiki backend
- Liberado /admin/access/options para Agente, Supervisor e Admin
- Criados DTOs para validação dos payloads administrativos
- Extraído SQL do AdminAccessService para AdminAccessRepository
- Removida criação de schema em runtime do módulo Admin
- Auditoria passa a usar usuário autenticado via JWT
- Substituídos erros genéricos por exceptions HTTP
- Atualizada documentação do módulo Admin/access
- Adicionado JwtAuthGuard global para validar tokens nas rotas privadas
- Adicionados decorators Public e Roles para separar rotas públicas e permissões
- Adicionado RolesGuard para proteger rotas administrativas por perfil
- Rotas privadas passam a exigir Authorization Bearer Token
- WebSocket do WhatsApp passa a exigir JWT no handshake
- Adicionado rate limit global com @nestjs/throttler
- Adicionado LoginDto e ValidationPipe para validar payload de login
- Extraído SQL de acesso do usuário para UserAccessRepository
- Melhorados logs de login LDAP/Microsoft sem expor dados sensíveis