eletrotupi / tcc/ api/src/createApp.ts58de486423eec87d0c5bb7771fcc5a53f7bb4618
2.6 KB | 90 lines Raw
1
import express from "express";
2
import cors from "cors";
3
import bodyParser from "body-parser";
4
import mainRouter from "@app/routes/main";
5
import userRouter from "@app/routes/users";
6
import authRouter from "@app/routes/auth";
7
import moodRouter from "@app/routes/moods";
8
import triggerRouter from "@app/routes/triggers";
9
import sleepRecordRouter from "@app/routes/sleepRecords";
10
import insightRouter from "@app/routes/insights";
11
import careActionsRouter from "@app/routes/careActions";
12
import medicineRegimensRouter from "@app/routes/medicineRegimens";
13
import exportsRouter from "@app/routes/exports";
14
import reportRouter from "@app/reports/report.router";
15
import { errorHandler } from "@app/middleware/errorHandler";
16
import { logger } from "@app/lib/logger";
17
import { PrismaClient } from "@prisma/client";
18
import {
19
  bootWorkers,
20
  closeAllWorkers,
21
  closeAllQueues,
22
  scheduleInsights,
23
} from "@app/lib/queue";
24

25
import pinoHttp from "pino-http";
26
import { randomUUID } from "crypto";
27
import path from "path";
28

29
export function createApp() {
30
  const app = express();
31
  bootWorkers();
32
  scheduleInsights();
33

34
  // Use pino-http for HTTP logging (better than Morgan for structured logs)
35
  // Registered before the rest so every request has a logger attached,
36
  // including errors raised by the CORS and body-parsing middleware below
37
  app.use(
38
    pinoHttp({
39
      logger,
40
      genReqId: (req, res) => {
41
        const header = req.headers["x-request-id"];
42
        const requestId =
43
          (Array.isArray(header) ? header[0] : header) || randomUUID();
44

45
        res.setHeader("X-Request-Id", requestId);
46

47
        return requestId;
48
      },
49
    }),
50
  );
51

52
  // Configure CORS
53
  app.use(
54
    cors({
55
      origin: process.env.FRONTEND_URL || "*",
56
      credentials: true,
57
    }),
58
  );
59

60
  app.use(bodyParser.json());
61

62
  app.use("/users", userRouter);
63
  app.use("/auth", authRouter);
64
  app.use("/moods", moodRouter);
65
  app.use("/sleep_records", sleepRecordRouter);
66
  app.use("/triggers", triggerRouter);
67
  app.use("/insights", insightRouter);
68
  app.use("/care-actions", careActionsRouter);
69
  app.use("/medicine-regimens", medicineRegimensRouter);
70
  app.use("/exports", exportsRouter);
71
  app.use("/reports", reportRouter);
72

73
  app.use(errorHandler); // always last
74

75
  // TODO: flesh the actual page here
76
  app.use(express.static(path.join(__dirname, "./static")));
77
  app.get(/.*/, (req, res) => {
78
    res.sendFile(path.join(__dirname, "./static/index.html"));
79
  });
80

81
  process.on("SIGTERM", shutdown);
82
  process.on("SIGINT", shutdown);
83

84
  return app;
85
}
86

87
const shutdown = async () => {
88
  await Promise.all([closeAllWorkers(), closeAllQueues()]);
89
  process.exit(0);
90
};