import { sellerSettingsSchema } from '@pokemon-inventory/validation/settings'; import { createApplicationError } from '../../../shared/errors/application-error.js'; export async function registerAdminSettingsRoutes(app, options) { const { authenticateAdmin = async () => { throw createApplicationError('UNAUTHORIZED', 'Authentication is required.', 401); }, authorizeUnsafeRequest, sessionCookieName = 'pokemon_inventory_session', sellerSettingsService, } = options; app.addHook('preHandler', async (request) => { const admin = await authenticateAdmin(request); if (!admin?.sellerId) { throw createApplicationError('UNAUTHORIZED', 'Authentication is required.', 401); } request.admin = admin; }); app.get('/settings', async (request) => ({ data: await sellerSettingsService.get({ sellerId: request.admin.sellerId }), })); app.patch('/settings', async (request, reply) => { await authorizeUnsafeRequest?.( request.cookies[sessionCookieName], request.headers['x-csrf-token'], ); const result = sellerSettingsSchema.safeParse(request.body); if (!result.success) { return reply.code(400).send({ error: { code: 'VALIDATION_ERROR', message: 'Request validation failed.', details: result.error.issues.map(({ message, path }) => ({ message, path })), }, }); } return reply.send({ data: await sellerSettingsService.update({ sellerId: request.admin.sellerId, settings: result.data, }), }); }); }