import Fastify, { FastifyInstance } from 'fastify' import Database from 'better-sqlite3' import cookie from '@fastify/cookie' import type { Config } from './config.js' import { SerialQueue } from './queue.js' import { registerAuthRoutes } from './routes/authRoutes.js' import { registerSettingsRoutes } from './routes/settingsRoutes.js' import { registerLookupRoutes } from './routes/lookupRoutes.js' declare module 'fastify' { interface FastifyInstance { db: Database.Database config: Config fetchImpl: typeof fetch discogsQueue: SerialQueue } interface FastifyRequest { user?: import('./auth.js').UserRow } } export interface AppOptions { db: Database.Database config: Config fetchImpl?: typeof fetch } export async function buildApp(opts: AppOptions): Promise { const app = Fastify({ logger: false }) app.decorate('db', opts.db) app.decorate('config', opts.config) app.decorate('fetchImpl', opts.fetchImpl ?? fetch) app.decorate('discogsQueue', new SerialQueue({ minIntervalMs: 1100 })) await app.register(cookie) await registerAuthRoutes(app) await registerSettingsRoutes(app) await registerLookupRoutes(app) app.get('/api/health', async () => ({ ok: true })) return app }