import express from "express"; import { addSseClient, removeSseClient } from "../../shared/sse.js"; import { makeGetConversations } from "../../0-ui/controllers/conversations.js"; import { makeListRuns, makeGetRunById } from "../../0-ui/controllers/runs.js"; import { makeSimSend } from "../controllers/sim.js"; import { makeGetConversationState } from "../../0-ui/controllers/conversationState.js"; import { makeListMessages } from "../../0-ui/controllers/messages.js"; import { makeSearchProducts, makeListProducts, makeGetProduct, makeSyncProducts } from "../../0-ui/controllers/products.js"; import { makeListAliases, makeCreateAlias, makeUpdateAlias, makeDeleteAlias } from "../../0-ui/controllers/aliases.js"; import { makeListRecommendations, makeGetRecommendation, makeCreateRecommendation, makeUpdateRecommendation, makeDeleteRecommendation } from "../../0-ui/controllers/recommendations.js"; import { makeDeleteConversation, makeDeleteUser, makeListUsers, makeRetryLast } from "../../0-ui/controllers/admin.js"; function nowIso() { return new Date().toISOString(); } /** * Endpoints consumidos por el frontend (UI / simulador). * Mantiene exactamente los mismos paths que existían en `index.js`. */ export function createSimulatorRouter({ tenantId }) { const router = express.Router(); const getTenantId = () => tenantId; /** * --- SSE endpoint --- */ router.get("/stream", (req, res) => { res.setHeader("Content-Type", "text/event-stream"); res.setHeader("Cache-Control", "no-cache"); res.setHeader("Connection", "keep-alive"); res.flushHeaders?.(); res.write(`event: hello\ndata: ${JSON.stringify({ ts: nowIso() })}\n\n`); addSseClient(res); req.on("close", () => { removeSseClient(res); res.end(); }); }); /** * --- UI data endpoints --- */ router.post("/sim/send", makeSimSend()); router.get("/conversations", makeGetConversations(getTenantId)); router.get("/conversations/state", makeGetConversationState(getTenantId)); router.delete("/conversations/:chat_id", makeDeleteConversation(getTenantId)); router.post("/conversations/:chat_id/retry-last", makeRetryLast(getTenantId)); router.get("/messages", makeListMessages(getTenantId)); router.get("/products", makeListProducts(getTenantId)); router.get("/products/search", makeSearchProducts(getTenantId)); router.get("/products/:id", makeGetProduct(getTenantId)); router.post("/products/sync", makeSyncProducts(getTenantId)); router.get("/aliases", makeListAliases(getTenantId)); router.post("/aliases", makeCreateAlias(getTenantId)); router.put("/aliases/:alias", makeUpdateAlias(getTenantId)); router.delete("/aliases/:alias", makeDeleteAlias(getTenantId)); router.get("/recommendations", makeListRecommendations(getTenantId)); router.get("/recommendations/:id", makeGetRecommendation(getTenantId)); router.post("/recommendations", makeCreateRecommendation(getTenantId)); router.put("/recommendations/:id", makeUpdateRecommendation(getTenantId)); router.delete("/recommendations/:id", makeDeleteRecommendation(getTenantId)); router.get("/users", makeListUsers(getTenantId)); router.delete("/users/:chat_id", makeDeleteUser(getTenantId)); router.get("/runs", makeListRuns(getTenantId)); router.get("/runs/:run_id", makeGetRunById(getTenantId)); return router; }