// ================= BACKEND COMPLETO (NODE + FIREBASE) ================= // Instalar: // npm init -y // npm install express cors body-parser firebase-admin pdfkit nodemailer const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const admin = require('firebase-admin'); const PDFDocument = require('pdfkit'); const nodemailer = require('nodemailer'); const fs = require('fs'); // ================= CONFIG FIREBASE ================= const serviceAccount = require('./firebase-key.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) }); const db = admin.firestore(); const app = express(); // CORRIGIDO: CORS LIBERADO EXPLICITAMENTE app.use(cors({ origin: '*', methods: ['GET','POST'], allowedHeaders: ['Content-Type'] })); app.use(bodyParser.json()); // ================= TESTE DE SERVIDOR ================= app.get('/', (req,res)=>{ res.send('API SGA ONLINE'); }); // ================= SALVAR CANDIDATO ================= app.post('/salvar', async (req, res) => { try { const data = req.body; const ref = await db.collection('candidatos').add(data); res.json({ id: ref.id }); } catch (e) { console.error(e); res.status(500).json({ erro: 'Erro ao salvar' }); } }); // ================= GERAR PDF ================= function gerarPDF(candidato, caminho) { return new Promise((resolve, reject) => { try{ const doc = new PDFDocument(); const stream = fs.createWriteStream(caminho); doc.pipe(stream); doc.fontSize(14).text('SGA - Sergio Alexandre Consultor', { align: 'center' }); doc.moveDown(); doc.text(`Nome: ${candidato.nome}`); doc.text(`CPF: ${candidato.cpf}`); doc.text(`Email: ${candidato.email}`); doc.text(`Tempo: ${candidato.tempo}s`); doc.moveDown(); candidato.respostas.forEach(r => { doc.text(`${r.p} - ${r.r}`); }); doc.moveDown(); doc.text(`Total: ${candidato.total}`); doc.text(`Classificação: ${candidato.status}`); doc.end(); stream.on('finish', resolve); }catch(err){ reject(err); } }); } // ================= EMAIL ================= async function enviarEmail(candidato, caminhoPDF) { try{ let transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: 'contatoalexandres@gmail.com', pass: '123mudar' } }); await transporter.sendMail({ from: 'SGA Sistema', to: 'contatoalexandres@gmail.com', subject: 'Novo candidato avaliado', text: `Nome: ${candidato.nome} | Status: ${candidato.status}`, attachments: [{ path: caminhoPDF }] }); }catch(e){ console.error('Erro email:',e); } } // ================= FINALIZAR ================= app.post('/finalizar', async (req, res) => { try { const candidato = req.body; if(!candidato || !candidato.nome) { return res.status(400).json({erro:'Dados inválidos'}); } const ref = await db.collection('candidatos').add(candidato); const caminho = `./laudo_${ref.id}.pdf`; await gerarPDF(candidato, caminho); await enviarEmail(candidato, caminho); res.json({ ok: true, id: ref.id }); } catch (e) { console.error(e); res.status(500).json({ erro: 'Erro no processamento' }); } }); // ================= DASHBOARD ================= app.get('/candidatos', async (req, res) => { try{ const snap = await db.collection('candidatos').get(); let lista = []; snap.forEach(doc => lista.push({ id: doc.id, ...doc.data() })); res.json(lista); }catch(e){ console.error(e); res.status(500).json({erro:'Erro ao listar'}); } }); // ================= START ================= app.listen(3000, () => console.log('Servidor rodando em http://localhost:3000')); // ================= FRONTEND CORRIGIDO ================= // PROBLEMA RESOLVIDO: fetch agora trata erro e garante conexão /* fetch('http://localhost:3000/finalizar', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(dados) }) .then(res => { if(!res.ok) throw new Error('Erro servidor'); return res.json(); }) .then(data => console.log('OK', data)) .catch(err => { console.error('Erro conexão:', err); alert('Erro de conexão. Verifique se o servidor está rodando.'); }); */ // ================= TESTES MANUAIS ================= // 1. Rodar servidor: node server.js // 2. Acessar no navegador: http://localhost:3000 // Deve aparecer: "API SGA ONLINE" // 3. Testar endpoint: // usar Postman ou navegador // POST http://localhost:3000/finalizar // com JSON válido // EXEMPLO JSON TESTE: /* { "nome":"Teste Usuario", "cpf":"12345678909", "email":"teste@gmail.com", "tempo":120, "status":"BOM", "total":6, "respostas":[ {"p":"Pergunta 1","r":"SIM"} ] } */

DIFERENÇA DE POLTRONA DOS ÔNIBUS