Backend Integration — Workflow para ruta-araucaria | Skills Pool
스킬 파일
Backend Integration — Workflow para ruta-araucaria
Adapta funcionalidades del backend de transportes-araucaria (Node.js/Express/MySQL) al proyecto ruta-araucaria (React + TypeScript + Vite). Usa cuando: integrar un nuevo endpoint de la API, manejar reservas, verificar disponibilidad, aplicar códigos de descuento, sincronizar destinos desde la DB. Para flujos de pago completos (Flow/MercadoPago), usar el skill payment-gateway. NO usar para: cambios de UI, estilos Tailwind, componentes shadcn.
Usuario → create-payment → Flow checkout
↓ (Flow redirige por POST)
Backend /api/payment-result → redirige a frontend /flow-return?token=...&status=...&amount=...
↓
Frontend polling: GET /api/payment-status?token=TOKEN o ?reserva_id=ID
Response: { pagado: bool, status: "pagado"|"pendiente"|"rechazado", monto }
En ruta-araucaria: escuchar el retorno
// Al regresar desde Flow (detectar query params en la URL)
const params = new URLSearchParams(window.location.search);
const flowToken = params.get("token");
const flowStatus = params.get("status");
const amount = params.get("amount");
const reservaId = params.get("reserva_id");
if (flowToken && flowStatus === "success") {
// Mostrar resumen del pago exitoso
} else if (flowStatus === "pending") {
// Hacer polling a /api/payment-status
}
Flujo de pago MercadoPago
Usuario → /api/create-payment-mp → MP Checkout Pro init_point
↓ (MP redirige por GET)
Frontend /mp-return?status=success|pending|error&amount=...&reserva_id=...
↓
Webhook automático: POST /api/mp-confirmation (server-to-server, no requiere acción frontend)
Validar código de descuento
// GET /api/codigos/:codigo → valida si el código es aplicable
const resp = await fetch(`${getBackendUrl()}/api/codigos/${encodeURIComponent(codigo)}`);
const data = await resp.json();
// data: { descuento, tipo, descripcion, activo, limiteUsos, usosActuales, ... }
// Para incluir el descuento en la cotización, pasarlo a useCotizacion:
useCotizacion({ ..., codigoDescuento: codigo })
Destinos dinámicos desde DB
// GET /api/destinos?activos=true
const resp = await fetch(`${getBackendUrl()}/api/destinos?activos=true`);
const { destinos } = await resp.json();
// Cada destino: { id, nombre, precioIda, precioVuelta, precioIdaVuelta, activo, orden }
// IMPORTANTE: los destinos en src/data/destinos.ts son la fuente estática de verdad
// para minHorasAnticipacion, duracionIdaMinutos, maxPasajeros.
// Fusionar con los datos dinámicos de precios del backend.