eletrotupi / tcc/ api/src/createApp.tsa772f94df9c0c9031e8dab16598a675e26df835e
2.1 KB | 79 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 { errorHandler } from "@app/middleware/errorHandler";
13
import { PrismaClient } from "@prisma/client";
14
import {
15
  bootWorkers,
16
  closeAllWorkers,
17
  closeAllQueues,
18
  scheduleInsights,
19
} from "@app/lib/queue";
20

21
import pino from "pino";
22
import pinoHttp from "pino-http";
23
import path from "path";
24

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

30
  // Configure CORS
31
  app.use(cors({
32
    origin: process.env.FRONTEND_URL || '*',
33
    credentials: true
34
  }));
35

36
  app.use(bodyParser.json());
37

38
  const isDev = process.env.NODE_ENV !== 'production';
39

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

54
  // Use pino-http for HTTP logging (better than Morgan for structured logs)
55
  app.use(pinoHttp({ logger }));
56

57
  app.use("/users", userRouter);
58
  app.use("/auth", authRouter);
59
  app.use("/moods", moodRouter);
60
  app.use("/sleep_records", sleepRecordRouter);
61
  app.use("/triggers", triggerRouter);
62

63
  app.use(errorHandler); // always last
64

65
  // TODO: flesh the actual page here
66
  app.use(express.static(path.join(__dirname, './static')));
67
  app.get(/.*/, (req, res) => {
68
    res.sendFile(path.join(__dirname, './static/index.html')); });
69

70
  process.on('SIGTERM', shutdown);
71
  process.on('SIGINT', shutdown);
72

73
  return app;
74
}
75

76
const shutdown = async () => {
77
  await Promise.all([closeAllWorkers(), closeAllQueues()]);
78
  process.exit(0);
79
};