Este projeto consiste em uma API RESTful desenvolvida com NestJS para gerenciar clientes e vendas de uma loja de brinquedos fictícia. A aplicação segue uma arquitetura modular, com foco em boas práticas, escalabilidade, segurança e testabilidade.
-
Arquitetura Modular: Organização em módulos (Auth, Users, Clients, Sales), aproveitando o sistema de Injeção de Dependência do NestJS para manter o código desacoplado e testável.
-
Interação com o Banco de Dados: Utilização do Prisma como ORM para garantir type-safety com PostgreSQL. Conexão gerenciada por um
PrismaServiceglobal. -
Autenticação e Segurança: JSON Web Tokens (JWT) com Passport.js. Rotas protegidas por
JwtAuthGuard. Senhas criptografadas com bcrypt. -
Filosofia de Testes:
- Testes de Unidade: Validação isolada da lógica de negócio dos Services, usando mocks.
- Testes End-to-End (E2E): Validação do fluxo HTTP completo, incluindo interação com banco de dados de teste.
- Framework: NestJS
- Linguagem: TypeScript
- Banco de Dados: PostgreSQL
- ORM: Prisma
- Autenticação: Passport.js (JWT)
- Testes: Jest & Supertest
- Validação: class-validator, class-transformer
- Segurança: bcrypt, helmet
| Módulo | Responsabilidade |
|---|---|
| Users | Gerenciamento de usuários, criação com senha criptografada. |
| Auth | Orquestra autenticação: valida credenciais e gera JWT. |
| Clients | CRUD de clientes. GET /clients formata JSON conforme requisito. |
| Sales | Registro de vendas e estatísticas (groupBy, $queryRaw para performance). |
- Node.js v18+
- npm ou yarn
- Instância PostgreSQL (local ou Docker)
-
Clone o repositório e acesse a pasta do projeto:
git clone [https://github.com/GabrielPrediger/toy-store-api.git](https://github.com/GabrielPrediger/toy-store-api.git) cd toy-store-api -
Instale as dependências:
npm install
-
Configure as variáveis de ambiente:
- Crie o arquivo
.envna raiz do projeto, baseando-se no.env.example:
DATABASE_URL="postgresql://USUARIO:SENHA@HOST:PORTA/NOME_BANCO?schema=public" JWT_SECRET="SEU_SEGREDO_SUPER_SECRETO" JWT_EXPIRES_IN=3600s
- Crie o arquivo
-
Execute as migrações do banco de dados e popule com os dados iniciais (
seed):# Aplica as migrações para criar as tabelas no banco npx prisma migrate dev # Executa o script para popular o banco com dados iniciais npx prisma db seed
- Usuário administrador criado pelo
seed:- Email:
[email protected] - Senha:
senha123
- Email:
- Usuário administrador criado pelo
Para iniciar o servidor em modo de desenvolvimento com hot-reload:
npm run start:devA API estará disponível em http://localhost:3000.
-
Configure o banco de teste:
- Crie um banco (ex:
test_db) e.env.testcomDATABASE_URLcorrespondente.
- Crie um banco (ex:
-
Prepare o banco de teste:
npm run test\:migratenpm run test\:seed- Rodar os testes:
npm testnpm run test:e2e| Método | Endpoint | Descrição | Protegido? | Body Exemplo |
|---|---|---|---|---|
| POST | /users |
Cria novo usuário administrador | Não | { "name": "Admin", "email": "[email protected]", "password": "123" } |
| POST | /auth/login |
Autentica usuário e retorna JWT | Não | { "email": "[email protected]", "password": "123" } |
| POST | /clients |
Cadastra novo cliente | Sim | { "name": "Ana", "email": "[email protected]", "birthDate": "1990-01-01" } |
| GET | /clients |
Lista clientes (aceita filtros ?name=Ana [email protected]) |
Sim | - |
| GET | /clients/:id |
Busca cliente por ID | Sim | - |
| PATCH | /clients/:id |
Atualiza dados do cliente | Sim | { "name": "Ana Silva" } |
| DELETE | /clients/:id |
Deleta cliente | Sim | - |
| POST | /sales |
Registra venda | Sim | { "value": 150.50, "clientId": 1, "saleDate": "2025-07-20" } |
| GET | /sales/stats/daily-totals |
Totais diários de vendas | Sim | - |
| GET | /sales/stats/top-clients |
Clientes com melhores estatísticas | Sim | - |