/** * categories.routes.ts * * CRUD de categorias com controle de acesso por role: * GET /api/v1/categories → lista todas (qualquer autenticado) * GET /api/v1/categories/:id → busca por ID (qualquer autenticado) * POST /api/v1/categories → cria (admin) * PATCH /api/v1/categories/:id → atualiza (admin) * DELETE /api/v1/categories/:id → exclui (admin) */ import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'; import { categoryParamsSchema, createCategoryBodySchema, updateCategoryBodySchema, } from './categories.schema.js'; import { listCategoriesHandler, getCategoryHandler, createCategoryHandler, updateCategoryHandler, deleteCategoryHandler, } from './categories.controller.js'; // ─── Guard de role ──────────────────────────────────────────────────────────── // Verificação de permissão após autenticação async function requireAdmin(request: FastifyRequest, reply: FastifyReply) { if (request.user.role !== 'admin') { await reply.forbidden('Apenas administradores podem gerenciar categorias.'); } } async function categoriesRoutes(fastify: FastifyInstance): Promise { // ── GET /categories ──────────────────────────────────────────────────────── fastify.get('/', { schema: { tags: ['Categorias'], summary: 'Lista todas as categorias', }, preHandler: [fastify.authenticate], handler: listCategoriesHandler, }); // ── GET /categories/:id ──────────────────────────────────────────────────── fastify.get('/:id', { schema: { tags: ['Categorias'], summary: 'Busca uma categoria pelo ID', params: categoryParamsSchema, }, preHandler: [fastify.authenticate], handler: getCategoryHandler, }); // ── POST /categories ─────────────────────────────────────────────────────── fastify.post('/', { schema: { tags: ['Categorias'], summary: 'Cria uma nova categoria (admin)', body: createCategoryBodySchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: createCategoryHandler, }); // ── PATCH /categories/:id ────────────────────────────────────────────────── fastify.patch('/:id', { schema: { tags: ['Categorias'], summary: 'Atualiza uma categoria (admin)', params: categoryParamsSchema, body: updateCategoryBodySchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: updateCategoryHandler, }); // ── DELETE /categories/:id ───────────────────────────────────────────────── fastify.delete('/:id', { schema: { tags: ['Categorias'], summary: 'Exclui uma categoria (admin)', params: categoryParamsSchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: deleteCategoryHandler, }); } export default categoriesRoutes;