API de pagamentos entre usuarios, com contas de consumidor e lojista, autenticacao JWT, cache Redis e notificacoes assincronas por Kafka.
- Cadastro de usuarios consumidores e lojistas.
- Autenticacao por email e senha, com emissao de JWT.
- Carteiras com saldo para cada usuario.
- Transferencias com validacao de saldo e bloqueio de envio por lojistas.
- Autorizacao externa antes de concluir uma transferencia.
- Idempotencia de transferencias por Redis.
- Notificacao assincrona de transferencias concluidas por Kafka.
- Documentacao OpenAPI via Swagger UI.
| Categoria | Tecnologia |
|---|---|
| Linguagem e framework | Java 25, Spring Boot 4.1 |
| Persistencia | PostgreSQL, Spring Data JPA, Flyway |
| Cache | Redis |
| Mensageria | Apache Kafka |
| Seguranca | Spring Security, JWT, BCrypt |
| Documentacao | springdoc-openapi |
| Testes | JUnit 5, Mockito, Testcontainers |
Requisitos: Docker Desktop, JDK 25 e Maven ou Maven Wrapper.
- Crie um arquivo
.envna raiz do projeto:
POSTGRES_USER=solvo
POSTGRES_PASSWORD=solvo
JWT_SECRET=uma-chave-secreta-com-pelo-menos-32-caracteres- Inicie a infraestrutura:
docker compose up -d- Execute a aplicacao:
./mvnw spring-boot:runNo Windows, use ./mvnw.cmd spring-boot:run.
A API fica disponivel em http://localhost:8080. O Swagger UI fica em http://localhost:8080/swagger-ui/index.html.
Somente o cadastro de usuario e o login sao publicos. Para os demais endpoints, envie:
Authorization: Bearer <token>POST /api/v1/users
{
"name": "Davi",
"document": "12345678900",
"userType": "CONSUMER",
"email": "davi@example.com",
"password": "senha123",
"phone": "11999999999"
}userType aceita CONSUMER e MERCHANT.
POST /api/v1/auth/login
{
"email": "davi@example.com",
"password": "senha123"
}Resposta:
{
"token": "<jwt>"
}| Metodo | Endpoint | Autenticacao | Descricao |
|---|---|---|---|
| POST | /api/v1/users |
Nao | Cria um usuario |
| POST | /api/v1/auth/login |
Nao | Retorna um JWT |
| GET | /api/v1/users/{id} |
Sim | Retorna o proprio usuario |
| POST | /api/v1/wallets |
Sim | Cria uma carteira para o usuario autenticado |
| GET | /api/v1/wallets/{id} |
Sim | Retorna a propria carteira |
| POST | /api/v1/transfers |
Sim | Cria uma transferencia |
| GET | /api/v1/transfers/{id} |
Sim | Consulta uma transferencia da qual o usuario participa |
POST /api/v1/wallets
{
"userType": "CONSUMER"
}O userId e definido a partir do token; nao e necessario envia-lo no corpo.
POST /api/v1/transfers
{
"senderWalletId": "00000000-0000-0000-0000-000000000001",
"receiverWalletId": "00000000-0000-0000-0000-000000000002",
"transferValue": 100.00
}O remetente da carteira deve ser o usuario autenticado. Para evitar transferencias duplicadas em repeticoes da mesma requisicao, envie opcionalmente o cabecalho:
Idempotency-Key: 4d2b132e-4f25-4a01-b2be-9b5d8c752f8bO docker compose inicia:
- PostgreSQL em
localhost:5431. - Redis em
localhost:6379. - Kafka em
localhost:9092.
Se forem exibidos avisos de reconexao do Kafka, confirme que o servico esta em execucao:
docker compose ps
docker compose up -d kafka./mvnw testOs testes de integracao usam Testcontainers e exigem que o Docker esteja em execucao.