app.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import express from "express";
  2. import cors from "cors";
  3. import helmet from "helmet";
  4. import morgan from "morgan";
  5. import { config } from "./src/config/index.js";
  6. import { db } from "./src/db/knex.js";
  7. import { qdrant } from "./src/services/qdrantClient.js";
  8. import { authMiddleware } from "./src/middleware/auth.js";
  9. import { rateLimitMiddleware } from "./src/middleware/rateLimit.js";
  10. import { errorHandler } from "./src/middleware/errorHandler.js";
  11. import { apiRouter } from "./src/routes/index.js";
  12. export function createApp() {
  13. const app = express();
  14. app.disable("x-powered-by");
  15. app.use(helmet());
  16. app.use(
  17. cors({
  18. origin: config.corsOrigin,
  19. credentials: true
  20. })
  21. );
  22. app.use(express.json({ limit: "10mb" }));
  23. app.use(morgan("dev"));
  24. app.get("/health", async (_req, res) => {
  25. const checks = { api: true, db: false, qdrant: false, ollama: false };
  26. try {
  27. await db.raw("SELECT 1");
  28. checks.db = true;
  29. } catch {}
  30. try {
  31. await qdrant.getCollections();
  32. checks.qdrant = true;
  33. } catch {}
  34. try {
  35. const r = await fetch(`${config.ollama.url}/api/tags`, { signal: AbortSignal.timeout(3000) });
  36. checks.ollama = r.ok;
  37. } catch {}
  38. const ok = Object.values(checks).every(Boolean);
  39. res.status(ok ? 200 : 503).json({ ok, checks });
  40. });
  41. app.use("/api", rateLimitMiddleware, authMiddleware, apiRouter);
  42. app.use(errorHandler);
  43. return app;
  44. }