import express from "express"; import cors from "cors"; import { authRequired } from "./lib/auth.ts"; import { authRouter } from "./routes/auth.ts"; import { businessRouter } from "./routes/business.ts"; import { clientsRouter } from "./routes/clients.ts"; import { appointmentsRouter } from "./routes/appointments.ts"; import { attendanceRouter } from "./routes/attendance.ts"; import { dayCloseRouter } from "./routes/dayClose.ts"; import { adminRouter } from "./routes/admin.ts"; import { crmRouter } from "./routes/crm.ts"; import { messagesRouter } from "./routes/messages.ts"; import { arrancarWorker } from "./crm/worker.ts"; export function createApp() { const app = express(); app.use(cors()); app.use(express.json({ limit: "1mb" })); app.use("/api/auth", authRouter); app.use("/api/business", authRequired, businessRouter); app.use("/api/clients", authRequired, clientsRouter); // Va ANTES que el router de citas: si se monta después, el `/:id` de // appointments se traga la ruta y `/attendance` nunca llega aquí. app.use("/api/appointments/:id/attendance", authRequired, attendanceRouter); app.use("/api/appointments", authRequired, appointmentsRouter); app.use("/api/day-close", authRequired, dayCloseRouter); app.use("/api/admin", authRequired, adminRouter); app.use("/api/crm", authRequired, crmRouter); app.use("/api/messages", authRequired, messagesRouter); // Traductor final de errores: sin esto, un rechazo dentro de un handler async // devuelve el HTML de stack de Express y el cliente no puede leer el mensaje. app.use( ( e: any, _req: express.Request, res: express.Response, _next: express.NextFunction ) => { console.error("[platform]", e); res.status(e?.status ?? 500).json({ error: e?.error ?? "Error interno del servidor" }); } ); return app; } const invoked = process.argv[1]?.replace(/\\/g, "/") ?? ""; if (invoked.endsWith("platform/index.ts")) { const port = Number(process.env.PLATFORM_PORT) || 3100; createApp().listen(port, () => console.log(`[platform] escuchando en :${port}`)); // Despacha la bandeja hacia el CRM. No se arranca en `createApp()` para que // las pruebas no salgan a la red por su cuenta. arrancarWorker(60_000); }