From d9d8597625c5580f83a6ca6759c374338820cdcd Mon Sep 17 00:00:00 2001 From: Tu Nombre <22030946@itcelaya.edu.mx> Date: Sat, 23 May 2026 02:05:32 -0600 Subject: [PATCH] =?UTF-8?q?feat:=20endpoint=20POST=20/reportes=20-=20buz?= =?UTF-8?q?=C3=B3n=20de=20incidencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/app.js | 14 +++-- backend/src/routes/reportes.routes.js | 80 +++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 backend/src/routes/reportes.routes.js diff --git a/backend/src/app.js b/backend/src/app.js index dfe4b26..4f438c0 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -1,7 +1,8 @@ -const express = require('express'); -const cors = require('cors'); -const authRoutes = require('./routes/auth.routes'); -const rutaRoutes = require('./routes/ruta.routes'); +const express = require('express'); +const cors = require('cors'); +const authRoutes = require('./routes/auth.routes'); +const rutaRoutes = require('./routes/ruta.routes'); +const reportesRoutes = require('./routes/reportes.routes'); const app = express(); @@ -9,8 +10,9 @@ app.use(cors()); app.use(express.json()); // ── Rutas ──────────────────────────────────────────────────────── -app.use('/auth', authRoutes); -app.use('/mi-ruta', rutaRoutes); // GET /mi-ruta/eta GET /mi-ruta/estado +app.use('/auth', authRoutes); +app.use('/mi-ruta', rutaRoutes); +app.use('/reportes', reportesRoutes); // ── Health check ───────────────────────────────────────────────── app.get('/health', (_req, res) => res.json({ status: 'ok' })); diff --git a/backend/src/routes/reportes.routes.js b/backend/src/routes/reportes.routes.js new file mode 100644 index 0000000..fe6777d --- /dev/null +++ b/backend/src/routes/reportes.routes.js @@ -0,0 +1,80 @@ +/** + * ================================================================ + * REPORTES - Buzón de incidencias del ciudadano + * + * POST /reportes → crea un reporte asociado al usuario y su ruta + * ================================================================ + */ + +const express = require('express'); +const pool = require('../config/db'); +const { verificarToken } = require('../middleware/auth.middleware'); + +const router = express.Router(); + +router.use(verificarToken); + +// Tipos de reporte válidos +const TIPOS_VALIDOS = ['no_paso', 'queja', 'calificacion', 'sugerencia']; + +// ================================================================ +// POST /reportes +// ================================================================ +router.post('/', async (req, res) => { + const { userId, domicilioId, routeId } = req.user; + const { tipo, descripcion, calificacion } = req.body; + + // ── Validaciones ─────────────────────────────────────────────── + if (!tipo || !TIPOS_VALIDOS.includes(tipo)) { + return res.status(400).json({ + error: `Tipo inválido. Valores permitidos: ${TIPOS_VALIDOS.join(', ')}`, + }); + } + + if (tipo === 'calificacion') { + if (!calificacion || calificacion < 1 || calificacion > 5) { + return res.status(400).json({ + error: 'Para calificación debes enviar un valor entre 1 y 5', + }); + } + } + + try { + // Obtener ruta_id a partir del routeId del JWT + let rutaId = null; + if (routeId) { + const { rows } = await pool.query( + 'SELECT id FROM rutas WHERE route_id = $1', + [routeId] + ); + rutaId = rows[0]?.id || null; + } + + const { rows: [reporte] } = await pool.query( + `INSERT INTO reportes + (user_id, domicilio_id, ruta_id, tipo, descripcion, calificacion) + VALUES ($1, $2, $3, $4, $5, $6) + RETURNING id, tipo, descripcion, calificacion, estado, creado_at`, + [userId, domicilioId || null, rutaId, tipo, + descripcion || null, calificacion || null] + ); + + return res.status(201).json({ + message: 'Reporte enviado correctamente. Gracias por tu retroalimentación.', + reporte: { + id: reporte.id, + tipo: reporte.tipo, + descripcion: reporte.descripcion, + calificacion:reporte.calificacion, + estado: reporte.estado, + creado_at: reporte.creado_at, + }, + }); + + } catch (err) { + console.error('❌ Error en POST /reportes:', err.message); + return res.status(500).json({ error: 'Error interno del servidor' }); + } +}); + +module.exports = router;