import type { FastifyInstance } from 'fastify'; import { createUserByAdminBodySchema, updateUserBodySchema, userIdParamsSchema } from './users.schema.js'; import { listUsersHandler, createUserHandler, updateUserHandler, deleteUserHandler } from './users.controller.js'; export default async function usersRoutes(fastify: FastifyInstance) { // Middleware customizado para garantir que apenas admins possam acessar const requireAdmin = async (request: any, reply: any) => { if (request.user?.role !== 'admin') { return reply.forbidden('Apenas administradores podem gerenciar usuários.'); } }; // ── GET /users ───────────────────────────────────────────────────────────── fastify.get('/', { schema: { tags: ['Users'], summary: 'Lista todos os usuários (admin)', }, preHandler: [fastify.authenticate, requireAdmin], handler: listUsersHandler, }); // ── POST /users ──────────────────────────────────────────────────────────── fastify.post('/', { schema: { tags: ['Users'], summary: 'Cria um novo usuário (admin)', body: createUserByAdminBodySchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: createUserHandler, }); // ── PATCH /users/:id ─────────────────────────────────────────────────────── fastify.patch('/:id', { schema: { tags: ['Users'], summary: 'Atualiza um usuário (admin)', params: userIdParamsSchema, body: updateUserBodySchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: updateUserHandler, }); // ── DELETE /users/:id ────────────────────────────────────────────────────── fastify.delete('/:id', { schema: { tags: ['Users'], summary: 'Exclui um usuário (admin)', params: userIdParamsSchema, }, preHandler: [fastify.authenticate, requireAdmin], handler: deleteUserHandler, }); }