import Fastify from 'fastify'; import cors from '@fastify/cors'; import jwt from '@fastify/jwt'; import multipart from '@fastify/multipart'; import swagger from '@fastify/swagger'; import swaggerUi from '@fastify/swagger-ui'; import { prismaPlugin } from './plugins/prisma'; import { authPlugin } from './plugins/auth'; import { registerRoutes } from './routes'; export async function buildApp() { const app = Fastify({ logger: { transport: process.env.NODE_ENV !== 'production' ? { target: 'pino-pretty', options: { colorize: true } } : undefined, }, }); await app.register(cors, { origin: (origin, cb) => cb(null, true), credentials: true, }); await app.register(jwt, { secret: process.env.JWT_SECRET ?? 'dev-secret-change-me-in-prod', sign: { expiresIn: '7d' }, }); await app.register(multipart, { limits: { fileSize: 10 * 1024 * 1024 }, }); await app.register(swagger, { openapi: { info: { title: 'Insurance API', version: '1.0.0' }, components: { securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' }, }, }, }, }); await app.register(swaggerUi, { routePrefix: '/docs' }); await app.register(prismaPlugin); await app.register(authPlugin); app.get('/health', async () => ({ ok: true, ts: Date.now() })); await registerRoutes(app); return app; }