import express from "express"; import cors from "cors"; import helmet from "helmet"; import morgan from "morgan"; import { config } from "./src/config/index.js"; import { db } from "./src/db/knex.js"; import { qdrant } from "./src/services/qdrantClient.js"; import { authMiddleware } from "./src/middleware/auth.js"; import { rateLimitMiddleware } from "./src/middleware/rateLimit.js"; import { errorHandler } from "./src/middleware/errorHandler.js"; import { apiRouter } from "./src/routes/index.js"; export function createApp() { 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 }); }); app.use("/api", rateLimitMiddleware, authMiddleware, apiRouter); app.use(errorHandler); return app; }