feat: CRUD de clientes e registro de compras (issues #8, #9, #12)
O que foi feito até agora com base nas issues #8, #9 e #12
#8 - API: Endpoint de Criação de Clientes
- Criei arquivo create-client.dto.ts com validações (@IsNotEmpty, @IsEmail, @MaxLength);
- Endpoint POST /api/clients implementado;
- Validação de unicidade de e-mail no Service, retornando 409 Conflict;
- Validações de campos retornando 400 Bad Request com mensagens claras.
#9 - API: Endpoints de Listagem, Busca e Exclusão de Clientes
- Endpoint GET /api/clients com paginação (page, size) e busca por nome;
- Resposta estruturada com data e meta (totalElements, totalPages);
- Endpoint DELETE /api/clients/:id retornando 204 No Content;
- Tratamento de integridade referencial: bloqueia exclusão de cliente com compras vinculadas (400 Bad Request).
#12 - API: Endpoint POST para Registro de Nova Compra
- Criei módulo purchase com controller, service e dto;
- Endpoint POST /api/purchases implementado;
- Validação de existência do cliente antes de registrar a compra (404 Not Found);
- Validações de valor positivo, data ISO8601 e produto obrigatório.
OBS: Criei Global Exception Filter (all-exceptions.filter.ts) padronizando todas as respostas de erro da API no formato { statusCode, error, message }
Problemas que encontrei durante os testes
Descobri que o Prisma 7 (com o adapter @prisma/adapter-pg) não lança mais um erro com code: 'P2003' em violações de chave estrangeira. O erro real chega como um erro genérico do driver, com o código do PostgreSQL (23001) dentro de error.cause.code. Considerando esse contexto, implementei um type guard (isForeignKeyViolation) no clients.service.ts para detectar corretamente essa violação com tipagem segura, evitando tanto o uso de any (rejeitado pelo lint) quanto um falso-negativo que retornava 500 em vez de 400 ao tentar excluir um cliente com compras vinculadas. Até agora funcionou.
Testes realizados
Todos os endpoints foram testados manualmente pelo Postman, incluindo:
- Criação de cliente com sucesso (201)
- Criação com e-mail duplicado (409)
- Criação com dados inválidos (400)
- Listagem com busca por nome (200)
- Exclusão de cliente sem compras (204)
- Exclusão de cliente com compras vinculadas (400) para validar a correção do bug de FK
- Exclusão de cliente inexistente (404)
- Registro de compra com sucesso (201)
- Registro de compra com cliente inexistente (404)