import type { FastifyPluginAsync } from 'fastify'; import { ZodError } from 'zod'; import { createUserSchema, updateUserSchema, userParamsSchema, } from './users.schema'; import * as usersService from './users.service'; const usersRoutes: FastifyPluginAsync = async (fastify) => { /** GET /users — Lista todos os usuários */ fastify.get('/users', async (_request, reply) => { const result = await usersService.findAllUsers(); return reply.send({ data: result }); }); /** GET /users/:id — Busca um usuário pelo ID */ fastify.get<{ Params: { id: string } }>('/users/:id', async (request, reply) => { const { id } = userParamsSchema.parse(request.params); const user = await usersService.findUserById(id); if (!user) { return reply.status(404).send({ error: 'Usuário não encontrado.' }); } return reply.send({ data: user }); }); /** POST /users — Cria um novo usuário */ fastify.post('/users', async (request, reply) => { try { const body = createUserSchema.parse(request.body); const user = await usersService.createUser(body); return reply.status(201).send({ data: user }); } catch (err) { if (err instanceof ZodError) { return reply.status(400).send({ error: 'Dados inválidos.', details: err.errors }); } throw err; } }); /** PUT /users/:id — Atualiza um usuário (incluindo salário e override) */ fastify.put<{ Params: { id: string } }>('/users/:id', async (request, reply) => { try { const { id } = userParamsSchema.parse(request.params); const body = updateUserSchema.parse(request.body); const user = await usersService.updateUser(id, body); if (!user) { return reply.status(404).send({ error: 'Usuário não encontrado.' }); } return reply.send({ data: user }); } catch (err) { if (err instanceof ZodError) { return reply.status(400).send({ error: 'Dados inválidos.', details: err.errors }); } throw err; } }); /** DELETE /users/:id — Remove um usuário (cascade nos gastos) */ fastify.delete<{ Params: { id: string } }>('/users/:id', async (request, reply) => { const { id } = userParamsSchema.parse(request.params); const deleted = await usersService.deleteUser(id); if (!deleted) { return reply.status(404).send({ error: 'Usuário não encontrado.' }); } return reply.status(200).send({ data: deleted, message: 'Usuário removido com sucesso.' }); }); }; export default usersRoutes;