Este projeto é uma API RESTful desenvolvida em TypeScript com foco em boas práticas de engenharia de software, arquitetura limpa e escalabilidade.
A API fornece um serviço de gerenciamento de usuários com funcionalidades como cadastro (sign-up), criação, listagem paginada, busca por ID e atualização de perfil, além de contar com autenticação e autorização via JWT.
| Tecnologia | Finalidade |
|---|---|
| TypeScript | Linguagem principal, garantindo tipagem estática |
| Express | Framework HTTP para exposição dos endpoints REST |
| MongoDB / Mongoose | Banco de dados NoSQL e ODM para persistência |
| RabbitMQ (amqplib) | Message broker para comunicação assíncrona via consumers |
| JWT (jsonwebtoken) | Autenticação e geração de tokens |
| Joi / Zod | Validação de dados de entrada das requisições |
| tsyringe | Container de Inversão de Dependência (IoC/DI) |
| Winston | Logger estruturado da aplicação |
| Docker | Containerização para deploy |
O projeto segue princípios de Clean Architecture e Domain-Driven Design (DDD), organizado em camadas bem definidas:
src/application/— Ponto de entrada da aplicação (server.ts), adaptadores (Express), configurações (env, logger) e validators genéricos (Joi, Zod).src/core/— Núcleo da aplicação contendo classes base (Controller,Service), protocolos/interfaces, sistema de injeção de dependência, middlewares reutilizáveis (autenticação, autorização, validação, content-type) e tratamento padronizado de erros HTTP.src/data/— Camada de protocolos de dados, definindo contratos para broker servers, criptografia e banco de dados.src/domains/— Domínios de negócio versionados (v1/). O domínio de Users contém entidades, DTOs, controllers, services, repositories, use-cases, consumers, validators e subdomínios (autenticação).src/infra/— Implementações concretas de infraestrutura: conexão com MongoDB, servidor RabbitMQ e criptografia.src/routes/— Configuração centralizada de rotas.
- Inversão de Dependência (DI):
tsyringecom tokens para registrar e resolver dependências, desacoplando as camadas. - Repository Pattern: Interfaces genéricas (
FindByIdRepository,ListRepository,PaginateRepository,CreateRepository,UpdateRepository, etc.) garantem independência de implementação de banco. - Base Classes: Classes genéricas
Service<T>eControllerfornecem implementações reutilizáveis. - Middlewares encadeáveis: Autenticação, autorização, validação e content-type como middlewares composíveis nas rotas.
- Validação desacoplada: Suporte a múltiplas bibliotecas (Joi e Zod) através de uma interface
Validatorgenérica. - Event-driven: Integração com RabbitMQ para processamento assíncrono de eventos (ex:
UserCreatedConsumer). - Versionamento de API: Rotas organizadas sob
/v1/, permitindo evolução sem quebrar contratos. - Suporte a transações: Operações críticas executáveis de forma transacional no MongoDB.
- Docker-ready: Dockerfiles para produção e desenvolvimento.
| Método | Rota | Descrição | Auth |
|---|---|---|---|
POST |
/users/sign-up |
Cadastro público de usuário | ❌ |
POST |
/users |
Criação de usuário (transacional) | ✅ |
GET |
/users |
Listagem paginada de usuários (com cache) | ✅ |
GET |
/users/:userId |
Busca de usuário por ID | ✅ |
PUT |
/users/profile |
Atualização do perfil do usuário autenticado | ✅ |
Para rodar o projeto via docker, basta executar dois comandos. Os comandos devem ser executados a partir da raiz do projeto, sendo o primeiro para buildar a imagem:
docker build -t rest-api .
Na sequência basta executar o comando que vai levantar o container a partir da imagem criada:
docker run -e PORT=3001 -e JWT_SECRET=secret -e MONGO_DB_HOST=127.0.0.1:27017 -e MONGO_DB=users-api -d -p 3001:3001 rest-api