import express from "express"; import cors from "cors"; import helmet from "helmet"; import morgan from "morgan"; import { config } from "../config/index.js"; import { port } from "../config/server.js"; import { db } from "../config/db.config.js"; import { qdrant } from "../services/qdrantClient.js"; import { errorHandler } from "../middleware/ErrorHandler.js"; import { Roteamento } from "../routes/index.js"; import { scheduleCleanup } from "../jobs/cleanupTokens.js"; export class ServerFactory { static Iniciar() { const app = express(); app.disable("x-powered-by"); app.use(helmet()); app.use( cors({ origin: config.corsOrigin, credentials: true }) ); app.use(express.json({ limit: "10mb" })); app.use(morgan("dev")); app.get("/health", async (_req, res) => { const checks = { api: true, db: false, qdrant: false, ollama: false }; try { await db.raw("SELECT 1"); checks.db = true; } catch {} try { await qdrant.getCollections(); checks.qdrant = true; } catch {} try { const r = await fetch(`${config.ollama.url}/api/tags`, { signal: AbortSignal.timeout(3000) }); checks.ollama = r.ok; } catch {} const ok = Object.values(checks).every(Boolean); res.status(ok ? 200 : 503).json({ ok, checks }); }); Roteamento.IniciarRoteamento(app); app.use(errorHandler); const server = app.listen(port, () => { process.stdout.write(`API listening on http://localhost:${port}\n`); scheduleCleanup(); }); this.app = app; return server; } } export default ServerFactory;