eletrotupi / tcc/ api/src/createApp.ts28732dacf338736ff715e446361d399eb6954507
1.9 KB | 68 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 { errorHandler } from '@app/middleware/errorHandler';
12
import { PrismaClient } from '@prisma/client';
13
import { bootWorkers, closeAllWorkers, closeAllQueues } from '@app/lib/queue';
14
import pino from 'pino';
15
import pinoHttp from 'pino-http';
16
import path from 'path';
17

18
export function createApp() {
19
  const app = express();
20
  bootWorkers();
21

22
  // Configure CORS
23
  app.use(cors({
24
    origin: process.env.FRONTEND_URL || '*',
25
    credentials: true
26
  }));
27

28
  app.use(bodyParser.json());
29

30
  // Create Pino logger
31
  const logger = pino({
32
    level: process.env.LOG_LEVEL || 'info',
33
    transport: {
34
      target: 'pino-pretty', // Human-readable in development
35
      options: {
36
        colorize: true,
37
        singleLine: false,
38
        messageFormat: '{if levelLabel}{levelLabel} - {end}{msg}',
39
      },
40
    },
41
  });
42

43
  // Use pino-http for HTTP logging (better than Morgan for structured logs)
44
  app.use(pinoHttp({ logger }));
45

46
  app.use("/users", userRouter);
47
  app.use("/auth", authRouter);
48
  app.use("/moods", moodRouter);
49
  app.use("/sleep_records", sleepRecordRouter);
50
  app.use("/triggers", triggerRouter);
51

52
  app.use(errorHandler); // always last
53

54
  // TODO: flesh the actual page here
55
  app.use(express.static(path.join(__dirname, './static')));
56
  app.get(/.*/, (req, res) => {
57
    res.sendFile(path.join(__dirname, './static/index.html')); });
58

59
  process.on('SIGTERM', shutdown);
60
  process.on('SIGINT', shutdown);
61

62
  return app;
63
}
64

65
const shutdown = async () => {
66
  await Promise.all([closeAllWorkers(), closeAllQueues()]);
67
  process.exit(0);
68
};