A API de Transações é uma aplicação Node.js que fornece endpoints para gerenciar transações financeiras armazenadas no Amazon DynamoDB. A API permite aos usuários registrar transações, listar transações por usuário e calcular saldos mensais. Construída com TypeScript, Express e AWS SDK, oferece uma solução abrangente para gerenciamento de transações com integração em nuvem.
- Gerenciamento de Transações: Criar, recuperar e analisar transações financeiras
- Filtragem por Usuário: Acessar transações de usuários específicos
- Cálculo de Saldo Mensal: Calcular saldo para um mês específico
- Integração com AWS: Implantado como funções Lambda com API Gateway
- Streaming de Dados: Replicação automática de dados de transações do DynamoDB para o RDS MySQL
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ API │ │ DynamoDB │ │ RDS │
│ Gateway │────►│ Transactions│────►│ MySQL │
└─────────────┘ └─────────────┘ └─────────────┘
▲ │
│ │
┌─────────────┐ ┌─────────────┐
│ Lambda │ │ Lambda │
│ Transaction │ │ StreamToRDS │
│ API │ │ │
└─────────────┘ └─────────────┘
POST /api/transactions
Corpo da Requisição:
{
"userId": "123",
"amount": 100,
"description": "Pagamento"
}Exemplo de Uso:
curl -X POST https://your-api-endpoint.com/prod/api/transactions \
-H "Content-Type: application/json" \
-d '{"userId":"123","amount":100,"description":"Pagamento"}'Resposta:
{
"id": "valor-uuid",
"userId": "123",
"amount": 100,
"description": "Pagamento",
"createdAt": "valor-timestamp"
}GET /api/transactions/:userId
Exemplo de Uso:
curl https://your-api-endpoint.com/prod/api/transactions/123Resposta:
{
"items": [
{
"id": "valor-uuid",
"userId": "123",
"amount": 100,
"description": "Pagamento",
"createdAt": "valor-timestamp"
}
// Transações adicionais se disponíveis
],
"lastEvaluatedKey": null
}GET /api/balance/:userId?month=YYYY-MM
Exemplo de Uso:
curl https://your-api-endpoint.com/prod/api/balance/123?month=2025-04Resposta:
{
"userId": "123",
"month": "2025-04",
"balance": 100
}- Node.js v18 ou superior
- Docker e Docker Compose
- AWS CLI (opcional, para depuração do DynamoDB Local)
- Terraform (para implantação da infraestrutura)
- Credenciais AWS configuradas
# Opção 1: Configuração interativa
aws configure
# Forneça seu Access Key ID, Secret Access Key e região (ex.: sa-east-1)
# Opção 2: Variáveis de ambiente
export AWS_ACCESS_KEY_ID="sua-access-key"
export AWS_SECRET_ACCESS_KEY="sua-secret-key"
export AWS_DEFAULT_REGION="sa-east-1"# Clone o repositório
git clone <url-do-repositorio>
cd <diretorio-do-repositorio>
code .Isso abrira o vscode no projeto. Com isso, pressione ctrl + shift + p, e digite Reopen in container
# Execute todos os testes
npm test# Sobe o projeto na porta 3000
npm run start# Para criar uma nova transacao
curl -X POST http://localhost:3000/transactions \
-H "Content-Type: application/json" \
-d '{
"userId": "user123",
"amount": 100.50,
"description": "Pagamento de serviço"
}'# Para listar as transacoes de um usuario
curl -X GET "http://localhost:3000/transactions/user123?limit=5"# Para listar as transacoes de um usuario com paginacao
curl -X GET "http://localhost:3000/transactions/user123?limit=5&lastEvaluatedKey=VALOR_RETORNADO_DA_CONSULTA_ANTERIOR"# Para retornar o saldo de um usuario
curl -X GET "http://localhost:3000/balance/user123?month=2023-06"A API está implantada na AWS usando Lambda, API Gateway, DynamoDB e RDS.
A API de produção está disponível em:
https://your-api-endpoint.com/prod/api
# Registrar uma transação
curl -X POST https://your-api-endpoint.com/prod/api/transactions \
-H "Content-Type: application/json" \
-d '{"userId":"123","amount":100,"description":"Pagamento"}'
# Listar transações de um usuário
curl -X GET https://your-api-endpoint.com/prod/api/transactions/123
# Consultar saldo mensal
curl -X GET https://your-api-endpoint.com/prod/api/balance/123?month=2025-04O sistema replica automaticamente os dados de transações do DynamoDB para um banco de dados MySQL RDS usando DynamoDB Streams e uma função Lambda.
┌───────────────┐ ┌────────────────┐ ┌───────────────┐ ┌───────────────┐
│ DynamoDB │ │ DynamoDB │ │ Lambda │ │ Amazon │
│ Transactions │────►│ Streams │────►│ StreamToRDS │────►│ RDS MySQL │
└───────────────┘ └────────────────┘ └───────────────┘ └───────────────┘
│ │ ▲
│ │ │
│ ┌───────────────────────┘ │
│ │ │
└────────────────────┼─────────────────────────────────────────────┘
│
Fluxo de dados:
1. Evento de alteração
2. Captura pelo Stream
3. Processamento
4. Persistência
- Novas transações são salvas no DynamoDB
- DynamoDB Streams captura as alterações
- A Lambda
StreamToRDSprocessa os eventos do stream - A função Lambda insere os dados no banco de dados MySQL RDS
# Visualizar os logs da Lambda StreamToRDS
aws logs tail /aws/lambda/StreamToRDS --region sa-east-1.
├── dist/ # Arquivos JavaScript compilados
├── node_modules/ # Dependências
├── src/ # Código-fonte
│ ├── __tests__/ # Arquivos de teste
│ ├── config/ # Arquivos de configuração
│ │ └── dynamodb.ts # Configuração do cliente DynamoDB
│ ├── routes/ # Rotas da API
│ ├── scripts/ # Scripts utilitários
│ ├── index.ts # Ponto de entrada do servidor Express
│ ├── lambda.ts # Handler AWS Lambda
│ └── streamToRDS.ts # Lambda de streaming DynamoDB para RDS
├── terraform/ # Infraestrutura como Código
├── .gitignore # Arquivo Git ignore
├── Dockerfile # Definição da imagem Docker
├── docker-compose.yml # Configuração de serviços Docker
├── jest.config.js # Configuração de testes
├── package.json # Metadados e dependências do projeto
├── tsconfig.json # Configuração TypeScript
└── README.md # Documentação do projeto
A infraestrutura AWS é provisionada usando Terraform. Para implantar ou atualizar:
cd terraform
terraform init
terraform plan
terraform apply