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

23
import pino from "pino";
24
import pinoHttp from "pino-http";
25
import path from "path";
26

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

32
  // Configure CORS
33
  app.use(
34
    cors({
35
      origin: process.env.FRONTEND_URL || "*",
36
      credentials: true,
37
    }),
38
  );
39

40
  app.use(bodyParser.json());
41

42
  const isDev = process.env.NODE_ENV !== "production";
43

44
  const logger = pino({
45
    level: process.env.LOG_LEVEL || "info",
46
    ...(isDev && {
47
      transport: {
48
        target: "pino-pretty",
49
        options: {
50
          colorize: true,
51
          singleLine: false,
52
          messageFormat: "{if levelLabel}{levelLabel} - {end}{msg}",
53
        },
54
      },
55
    }),
56
  });
57

58
  // Use pino-http for HTTP logging (better than Morgan for structured logs)
59
  app.use(pinoHttp({ logger }));
60

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

70
  app.use(errorHandler); // always last
71

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

78
  process.on("SIGTERM", shutdown);
79
  process.on("SIGINT", shutdown);
80

81
  return app;
82
}
83

84
const shutdown = async () => {
85
  await Promise.all([closeAllWorkers(), closeAllQueues()]);
86
  process.exit(0);
87
};