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}`);
});