import cors from '@fastify/cors'; import helmet from '@fastify/helmet'; import rateLimit from '@fastify/rate-limit'; import sensible from '@fastify/sensible'; import Fastify, { type FastifyInstance } from 'fastify'; import { env } from './config/env.js'; import { dbRoutes } from './modules/db/db.routes.js'; import { healthRoutes } from './modules/health/health.routes.js'; import { meRoutes } from './modules/me/me.routes.js'; import { authPlugin } from './plugins/auth.js'; import { prismaPlugin } from './plugins/prisma.js'; export async function buildApp(): Promise { const app = Fastify({ logger: { level: env.LOG_LEVEL, ...(env.NODE_ENV === 'development' ? { transport: { target: 'pino-pretty', options: { translateTime: 'HH:MM:ss', ignore: 'pid,hostname' }, }, } : {}), }, disableRequestLogging: env.NODE_ENV === 'production', }); await app.register(helmet, { global: true }); await app.register(cors, { origin: env.CORS_ORIGINS, credentials: true, }); await app.register(rateLimit, { max: 100, timeWindow: '1 minute', }); await app.register(sensible); await app.register(prismaPlugin); await app.register(authPlugin); await app.register(healthRoutes); await app.register(dbRoutes); await app.register(meRoutes); return app; }