147 lines
4.4 KiB
JavaScript
147 lines
4.4 KiB
JavaScript
// 1. IMPORTAÇÕES
|
|
require('dotenv').config(); // Carrega as variáveis do arquivo .env
|
|
const express = require('express');
|
|
const cors = require('cors');
|
|
const axios = require('axios'); // Importa o axios
|
|
|
|
// 2. INICIALIZAÇÃO DO APP
|
|
const app = express();
|
|
const PORT = 3001;
|
|
|
|
// 3. MIDDLEWARE
|
|
app.use(cors());
|
|
app.use(express.json());
|
|
|
|
// 4. DADOS MOCK - Adicionamos o patientPhone
|
|
let conversationsData = [
|
|
{
|
|
id: 1,
|
|
patientName: 'Ana Costa',
|
|
// Coloque seu número de WhatsApp verificado aqui!
|
|
// Formato: 55 + DDD + NUMERO (tudo junto)
|
|
patientPhone: '5575988104585',
|
|
avatarUrl: 'https://placehold.co/100x100/E2D9FF/6B46C1?text=AC',
|
|
lastMessage: 'Ok, doutor. Muito obrigada!',
|
|
timestamp: '10:45',
|
|
unread: 2,
|
|
messages: [
|
|
{ id: 1, sender: 'Ana Costa', text: 'Boa tarde, doutor.', time: '09:15' },
|
|
],
|
|
},
|
|
{
|
|
id: 2,
|
|
patientName: 'Carlos Andrade',
|
|
patientPhone: '5511888888888', // Número de exemplo
|
|
avatarUrl: 'https://placehold.co/100x100/D1E7DD/146C43?text=CA',
|
|
lastMessage: 'Amanhã, às 14h, está ótimo.',
|
|
timestamp: 'Ontem',
|
|
unread: 0,
|
|
messages: [
|
|
{ id: 1, sender: 'Carlos Andrade', text: 'Doutor, preciso remarcar.', time: 'Ontem' },
|
|
],
|
|
},
|
|
];
|
|
|
|
// 5. FUNÇÃO PARA ENVIAR MENSAGEM VIA WHATSAPP
|
|
async function sendWhatsAppMessage(phoneNumber, messageText) {
|
|
const WHATSAPP_TOKEN = process.env.WHATSAPP_TOKEN;
|
|
const WHATSAPP_PHONE_NUMBER_ID = process.env.WHATSAPP_PHONE_NUMBER_ID;
|
|
|
|
// URL da API do WhatsApp
|
|
const url = `https://graph.facebook.com/v19.0/${WHATSAPP_PHONE_NUMBER_ID}/messages`;
|
|
|
|
// Corpo da requisição
|
|
const data = {
|
|
messaging_product: 'whatsapp',
|
|
to: phoneNumber,
|
|
type: 'text',
|
|
text: {
|
|
body: messageText
|
|
}
|
|
};
|
|
|
|
// Cabeçalhos com a autorização
|
|
const headers = {
|
|
'Authorization': `Bearer ${WHATSAPP_TOKEN}`,
|
|
'Content-Type': 'application/json'
|
|
};
|
|
|
|
try {
|
|
console.log(`Enviando mensagem para ${phoneNumber}...`);
|
|
await axios.post(url, data, { headers: headers });
|
|
console.log('✅ Mensagem enviada com sucesso para a API do WhatsApp!');
|
|
} catch (error) {
|
|
console.error('❌ Erro ao enviar mensagem para o WhatsApp:');
|
|
// A resposta de erro da Meta geralmente está em error.response.data
|
|
if (error.response) {
|
|
console.error(JSON.stringify(error.response.data, null, 2));
|
|
} else {
|
|
console.error(error.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// 6. ROTAS DA API
|
|
|
|
app.get('/api/conversations', (req, res) => {
|
|
const conversationList = conversationsData.map(({ messages, ...convo }) => convo);
|
|
res.json(conversationList);
|
|
});
|
|
|
|
app.get('/api/conversations/:id', (req, res) => {
|
|
const conversationId = parseInt(req.params.id);
|
|
const conversation = conversationsData.find(c => c.id === conversationId);
|
|
if (conversation) {
|
|
res.json(conversation);
|
|
} else {
|
|
res.status(404).json({ message: 'Conversa não encontrada' });
|
|
}
|
|
});
|
|
|
|
// 7. ROTA DE ENVIO DE MENSAGEM ATUALIZADA
|
|
app.post('/api/conversations/:id/messages', async (req, res) => { // A rota agora é async
|
|
const conversationId = parseInt(req.params.id);
|
|
const { text } = req.body;
|
|
|
|
const conversation = conversationsData.find(c => c.id === conversationId);
|
|
|
|
if (!conversation) {
|
|
return res.status(404).json({ message: 'Conversa não encontrada.' });
|
|
}
|
|
if (!text) {
|
|
return res.status(400).json({ message: 'O texto da mensagem é obrigatório.' });
|
|
}
|
|
|
|
// Envia para o WhatsApp primeiro
|
|
await sendWhatsAppMessage(conversation.patientPhone, text);
|
|
|
|
// Depois, salva localmente (como antes)
|
|
const newMessage = {
|
|
id: Date.now(),
|
|
sender: 'Você',
|
|
text: text,
|
|
time: new Date().toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }),
|
|
};
|
|
|
|
conversationsData = conversationsData.map(convo => {
|
|
if (convo.id === conversationId) {
|
|
return {
|
|
...convo,
|
|
messages: [...convo.messages, newMessage],
|
|
lastMessage: text,
|
|
timestamp: 'Agora'
|
|
};
|
|
}
|
|
return convo;
|
|
});
|
|
|
|
res.status(201).json(newMessage);
|
|
});
|
|
|
|
|
|
// 8. INICIANDO O SERVIDOR
|
|
app.listen(PORT, () => {
|
|
console.log(`🚀 Servidor backend rodando na porta ${PORT}`);
|
|
});
|