import Fastify from 'fastify'; import cookie from '@fastify/cookie'; import multipart from '@fastify/multipart'; import { registerAuthRoutes } from '../modules/auth/routes/auth-routes.js'; import { registerAdminInventoryRoutes } from '../modules/inventory/routes/admin-inventory-routes.js'; import { registerAdminLookupRoutes } from '../modules/inventory/routes/admin-lookup-routes.js'; import { registerAdminImageRoutes } from '../modules/inventory/routes/admin-image-routes.js'; import { registerPublicInventoryRoutes } from '../modules/inventory/routes/public-inventory-routes.js'; import { registerPublicImageRoutes } from '../modules/inventory/routes/public-image-routes.js'; import { registerAdminListingRoutes } from '../modules/listings/routes/admin-listing-routes.js'; import { registerPublicListingRoutes } from '../modules/listings/routes/public-listing-routes.js'; import { registerAdminProductRoutes } from '../modules/products/routes/admin-product-routes.js'; import { registerPublicProductRoutes } from '../modules/products/routes/public-product-routes.js'; import { registerPublicSearchRoutes } from '../modules/search/routes/public-search-routes.js'; import { registerPublicSellerRoutes } from '../modules/sellers/routes/public-seller-routes.js'; import { registerPublicLookupRoutes } from '../modules/inventory/routes/public-lookup-routes.js'; import { registerAdminSaleRoutes } from '../modules/sales/routes/admin-sale-routes.js'; import { registerAdminAcquisitionRoutes } from '../modules/acquisitions/routes/admin-acquisition-routes.js'; import { registerAdminDashboardRoutes } from '../modules/dashboard/routes/admin-dashboard-routes.js'; import { registerAdminPricingRoutes } from '../modules/pricing/routes/admin-pricing-routes.js'; export function buildApp(dependencies) { const app = Fastify(); app.setErrorHandler((error, request, reply) => { const statusCode = error.statusCode ?? 500; const message = statusCode >= 500 ? 'Internal server error.' : error.message; if (statusCode >= 500) { request.log.error(error); } return reply.code(statusCode).send({ error: { code: error.code ?? 'INTERNAL_SERVER_ERROR', message, }, }); }); app.get('/health', async () => ({ data: { status: 'ok' } })); app.register(cookie); app.register(multipart, { limits: { fileSize: 10 * 1024 * 1024, files: 1 } }); app.register(registerAuthRoutes, { ...dependencies, prefix: '/api/v1/auth', }); app.register(registerAdminProductRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminInventoryRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminLookupRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminImageRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminListingRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminSaleRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminAcquisitionRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminDashboardRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerAdminPricingRoutes, { ...dependencies, prefix: '/api/v1/admin', }); app.register(registerPublicSearchRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicProductRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicListingRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicInventoryRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicImageRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicSellerRoutes, { ...dependencies, prefix: '/api/v1', }); app.register(registerPublicLookupRoutes, { ...dependencies, prefix: '/api/v1', }); return app; }