import { schemas } from '../schemas.js'; import { translateSqliteError } from '../sqlite-errors.js'; export default async function serverTypesRoutes(fastify) { const { db } = fastify; fastify.get('/', { schema: { response: { 200: { type: 'array', items: schemas.lookupResponse } } }, }, async () => db.serverTypes.list()); fastify.get('/:id', { schema: { params: schemas.idParam, response: { 200: schemas.lookupResponse } }, }, async (req) => { const row = db.serverTypes.get(req.params.id); if (!row) throw fastify.httpErrors.notFound('server type not found'); return row; }); fastify.post('/', { schema: { body: schemas.lookupBody, response: { 201: schemas.lookupResponse } }, }, async (req, reply) => { try { const row = db.serverTypes.create(req.body.name); reply.code(201); return row; } catch (err) { translateSqliteError(err, fastify, { uniqueMessage: 'a server type with that name already exists' }); } }); fastify.put('/:id', { schema: { params: schemas.idParam, body: schemas.lookupBody, response: { 200: schemas.lookupResponse } }, }, async (req) => { try { const row = db.serverTypes.update(req.params.id, req.body.name); if (!row) throw fastify.httpErrors.notFound('server type not found'); return row; } catch (err) { if (err.statusCode) throw err; translateSqliteError(err, fastify, { uniqueMessage: 'a server type with that name already exists' }); } }); fastify.delete('/:id', { schema: { params: schemas.idParam }, }, async (req, reply) => { try { const removed = db.serverTypes.delete(req.params.id); if (!removed) throw fastify.httpErrors.notFound('server type not found'); reply.code(204); return null; } catch (err) { if (err.statusCode) throw err; translateSqliteError(err, fastify, { foreignKeyMessage: 'cannot delete: hosts still reference this server type' }); } }); }