eletrotupi / tcc/ api/src/createApp.ts114be98ec7798e84a9f63b79b00cf224e5f3c8d8
2.4 KB | 89 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 reportRouter from "@app/reports/report.router";
15
import { errorHandler } from "@app/middleware/errorHandler";
16
import { PrismaClient } from "@prisma/client";
17
import {
18
  bootWorkers,
19
  closeAllWorkers,
20
  closeAllQueues,
21
  scheduleInsights,
22
} from "@app/lib/queue";
23

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

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

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

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

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

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

59
  // Use pino-http for HTTP logging (better than Morgan for structured logs)
60
  app.use(pinoHttp({ logger }));
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("/reports", reportRouter);
71

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

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

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

83
  return app;
84
}
85

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