/** * tickets.routes.ts * * Plugin Fastify com todas as rotas do módulo de tickets. * Registrado no server.ts com prefixo '/api/v1/tickets'. * * Rotas disponíveis: * POST /api/v1/tickets → abre novo chamado * GET /api/v1/tickets → lista chamados (com filtros e paginação) * GET /api/v1/tickets/:id → busca chamado por ID */ import type { FastifyInstance } from 'fastify'; import { createTicketBodySchema, listTicketsQuerySchema, ticketParamsSchema, } from './tickets.schema.js'; import { createTicketHandler, listTicketsHandler, getTicketByIdHandler, deleteTicketHandler, } from './tickets.controller.js'; async function ticketsRoutes(fastify: FastifyInstance): Promise { // ── POST /api/v1/tickets ────────────────────────────────────────────────── fastify.post('/', { schema: { tags: ['Tickets'], summary: 'Cria um novo chamado', description: 'Cria um novo chamado, definindo o criador como o usuário logado.', body: createTicketBodySchema, }, preHandler: [fastify.authenticate], handler: createTicketHandler, }); // ── GET /api/v1/tickets ─────────────────────────────────────────────────── fastify.get('/', { schema: { tags: ['Tickets'], summary: 'Lista os chamados', description: 'Retorna a lista de chamados, suportando filtros e paginação.', querystring: listTicketsQuerySchema, }, preHandler: [fastify.authenticate], handler: listTicketsHandler, }); // ── GET /api/v1/tickets/:id ─────────────────────────────────────────────── fastify.get('/:id', { schema: { tags: ['Tickets'], summary: 'Busca um chamado pelo ID', params: ticketParamsSchema, }, preHandler: [fastify.authenticate], handler: getTicketByIdHandler, }); // ── DELETE /tickets/:id ──────────────────────────────────────────────────── fastify.delete('/:id', { schema: { tags: ['Tickets'], summary: 'Exclui um chamado pelo ID', params: ticketParamsSchema, }, preHandler: [fastify.authenticate], handler: deleteTicketHandler, }); } export default ticketsRoutes;