Essa API possui endpoints para criar usuário, efetuar login e efetuar transferências somente. Os outros possíveis endpoints relacionados à essa API não foram mapeados no challenge.
- Kotlin
- Spring Boot 2.7.2
- JPA Hibernate
- Criptografia BCrypt (para senhas)
- Open API
- PostgreSQL
- Valiktor
- Mockk
-
A aplicação foi segmentada entre os domínios de users e transactions para isolar as regras de negócio. Common é o que gera impacto em todos os domínios.
-
A arquitetura escolhida foi a Hexagonal, dividindo a implementação entre adapters, domain e usecases. A separação de domain e usecases é somente para segmentar a escrita, nada impede que usecases esteja dentro de domain.
O schema do banco foi gerado através da ferramenta https://sqldbm.com para o banco PostgreSQL. O .sql gerado está disponível em docker/schema.sql
Toda a implementação foi feita considerando problemas de concorrência de threads, performance e principalmente confiabilidade de dados.
Description | |
---|---|
HTTP 4xx | Código de retorno quanto o erro é cometido pelo remetente. |
HTTP 5xx | Código de retorno quando o erro é emitido pelo servidor. |
Registra um novo usuário na API
Nome | Descriçao | Obrigatorio | |
---|---|---|---|
Corpo da requisição | full_name | Nome completo do usuario | sim |
Corpo da requisição | document | CPF ou CNPJ do usuario | sim |
Corpo da requisição | Email do usuario | sim | |
Corpo da requisição | password | Senha do usuario | sim |
Corpo da requisição | type | COMMON ou RETAILER - tipo do usuario | sim |
{
"full_name": "User Name",
"document": "000.000.000-00",
"email": "user@email.com",
"password": "password123",
"type": "COMMON"
}
Location header:
/api/v1/users/{user_id}
Autentica usuário
Nome | Descriçao | Obrigatorio | |
---|---|---|---|
Corpo da requisição | Email do usuario | sim | |
Corpo da requisição | password | Senha do usuario | sim |
{
"email": "user@email.com",
"password": "password123"
}
{
"user_id": "6b1f0baa-4759-4db0-80b9-839403930e05",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"expires_in": 600
}
Envia uma transferência à outro usuário
Nome | Descriçao | Obrigatorio | |
---|---|---|---|
Path variable | user_id | Id do usuario remetente | sim |
Corpo da requisição | target_id | Id do usuario destino | sim |
Corpo da requisição | value | Valor da transferencia, numero decimal | sim |
Corpo da requisição | description | Mensagem relacionada à transferencia | sim |
Corpo da requisição | Authorization | Bearer token | sim |
{
"target_id": "957dbbb7-56e4-4f18-8ac4-edae6432f6ee",
"value": 53.71,
"description": "Pizza de ontem"
}
{
"sent_date": "2022-08-06T18:20",
"message": "Transfer sent successfully."
}