API em NestJS voltada para gestão de saldos e solicitações de resgate de planos de previdência privada.
- Permitir que um chatbot consulte o saldo total do participante e o saldo disponível para resgate.
- Atender solicitações de resgate total ou parcial, respeitando saldo disponível, regras de carência e demais restrições do produto.
A solução foi construída em TypeScript utilizando o framework NestJS para expor uma API REST modular, com camadas bem definidas seguindo princípios de Clean Architecture e DDD. A aplicação é containerizada com Docker e Docker Compose, facilitando execução local e implantação. O projeto já considera observabilidade (Prometheus/Grafana) e testes automatizados, preparando o terreno para escalar horizontalmente com múltiplas réplicas da API e serviços de suporte compartilhados.
- Node.js 20 + NestJS 11
- PostgreSQL 16
- Prometheus + Grafana (monitoramento)
- TypeScript, ESLint (PSR-like), Prettier
- Docker e Docker Compose para orquestração local
- Node.js 20 e npm 10 (ou superior)
- Docker 24+ e Docker Compose v2 (opcional, para ambiente containerizado)
- Camada de domínio (
src/domain): concentra regras de negócio puras e independentes de frameworks. - Camada de aplicação (
src/application): orquestra casos de uso, serviços e eventos (CQRS). - Camada de infraestrutura (
src/infrastructure): implementa adapters (TypeORM, persistência de resgates, monitoramento). - Apresentação (
src/presentation): controllers REST que expõem a API. - Observabilidade: métricas expostas em
/metricse coletadas pelo Prometheus, visualizadas no Grafana.
- Banco relacional: tabelas
users,contributions,withdrawals,withdrawal_items,user_balancesecontribution_vestings. - Domínio: entidades (
Contribution,WithdrawalRequest,User), objetos de valor (Money,CarencyDate), serviços (BalanceCalculatorService,WithdrawalValidatorService) e exceções específicas. - Liberação parcial: cada
Contributionpode carregar curvas de vesting (contribution_vestings), permitindo cálculo do saldo disponível por lotes liberados ao longo do tempo. - Infraestrutura: repositórios TypeORM, serviço de persistência de resgates, projeção
UserBalanceProjector.
Fluxo de alto nível:
- Controllers validam entradas e chamam os casos de uso.
- Casos de uso consultam o domínio e persistência para calcular saldos ou aprovar resgates.
- Eventos CQRS recalculam projeções de saldo após contribuições ou resgates.
- Métricas de sucesso/erro são expostas em
/metricspara monitoramento.
-
Consulta de saldo
GET /users/:userId/balance- Validação e delegação ao
GetBalanceUseCase - Busca projeção materializada ou calcula dinamicamente
- Atualiza projeção (quando necessário) e retorna totais
-
Solicitação de resgate
POST /users/:userId/withdrawals- Validação de payload (
RequestWithdrawalUseCase) - Validação de regras de negócio (
WithdrawalValidatorService) - Persistência do resgate e disparo de eventos para atualizar projeções
- Resposta com valor aprovado e saldo remanescente
| Método | Rota | Descrição |
|---|---|---|
| GET | /users/:userId/balance |
Consulta saldo total e disponível |
| POST | /users/:userId/withdrawals |
Solicita resgate total ou parcial |
| GET | /metrics |
Exposição de métricas Prometheus |
- Instale dependências:
npm install
- Configure variáveis de ambiente em
.env(ou diretamente no ambiente):DATABASE_HOST=localhost DATABASE_PORT=5432 DATABASE_USER=previdencia DATABASE_PASSWORD=previdencia DATABASE_NAME=previdencia
- Desenvolvimento com reload:
npm run start:dev
- Produção (build + execução):
npm run build npm run start:prod
- Construa as imagens:
docker compose build
- Copie
env.samplepara.enve ajuste as credenciais antes de subir:cp env.sample .env
- Suba os serviços (API, PostgreSQL e monitoramento):
docker compose up -d
- A API ficará disponível em
http://localhost:3000. O banco usa credenciais do.env. - Monitoramento:
- Prometheus em
http://localhost:9090 - Grafana em
http://localhost:3001(login conforme variáveisGRAFANA_*) - Métricas da API em
http://localhost:3000/metrics
- Prometheus em
Para encerrar:
docker compose down- Testes unitários:
npm run test - Testes e2e:
npm run test:e2e
- Cobertura:
npm run test:cov
- Métricas Prometheus em
/metrics, incluindo contadores de leituras de saldo e solicitações de resgate (sucesso/erro). - Prometheus configurado no
docker-compose.ymlcom scrape automático da API. - Grafana acessível no serviço
grafanae apontando parahttp://prometheus:9090como fonte de dados. - Dashboard inicial sugerido: Prometheus Stats (ID 3662), além de gráficos personalizados para as métricas
previdencia_balance_reads_totaleprevidencia_withdrawal_requests_total.
