SafeFinance é um microserviço para realizar transações sem pontos flutuantes em uma moeda. Um desafio proposto como teste técnico pela Stone.co.
Para ultilizar o microserviço, é preciso ter Elixir, Phoenix e PostgreSql.
- Instale as dependencias
mix deps.get
- Crie o banco de dados e sua estrutura
mix ecto.setup
- Inicie o Phoenix em ambiente localhost
mix phx.server
Para acessar as rotas visite localhost:4000
/api
do seu navegador, Insomnia ou Postman.
Agora você está pronto! 😄
-
Rode os testes da aplicação ultilizando o comando
mix test
-
Ultilize o comando
MIX_ENV=test mix coveralls
para rodar os testes mostrando a cobertura dos testes no código.
Primeiramente, para ultilização da API é necessário criar dois usuários para realizar transfêrencias, uma para conta origem e outra para conta destino. A conta deve conter um nome, email e senha*, tendo sucesso ela recebe um id da conta que pode ser ultilizado para realizar transações.
Depois de criado a conta você pode adicionar saldo pela rota api/update/balance
e transferir para outra conta utilizando api/operations/transaction
Obs: * O campo senha embora não exista autenticação foi apenas implementado para mostrar a segurança de senha possível por criar uma hash do mesmo campo.
rota: api/users/signup
type: POST
Request Params
-
Email:
email string
-
Nome:
name string
-
Senha:
password string
Body Params (JSON)
{
"user": {
"name": "Rick",
"email": "rick@mail.com",
"password": "123456"
}
}
Response
{
"balance": 1000,
"currency": "BRL",
"user": {
"email": "rick@mail.com",
"id": "8d1da1d5-8276-4934-92b1-772c0545c574",
"name": "Rick",
"password_hash": "$argon2id$v=19$m=131072,t=8,p=4$WiIHo8c0Oio+clvObXflxQ$yhpHKQ+mO8qbcY1FBP1i4YWThWK1ZUA8ewscyYWe1zo"
}
}
Note que nos headers da rota signup
, em location,contém uma rota onde acessando é encontrado os dados do usuário e conta criada.
rota: api/users/show?id={id}
type: GET
Response
{
"accounts": {
"balance": "1000.00",
"currency": "BRL",
"id": "04af967a-b7b8-4d28-8514-f652ea827e6e"
},
"email": "ana@mail.com",
"id": "e84c183b-65d2-4424-a1e5-d565fea3ad5b",
"name": "Ana",
"password_hash": "$argon2id$v=19$m=131072,t=8,p=4$zmu5w1IgA7x3ciWzKLdqyA$Nk+Yj554CYa4mfoqEmEcki69rH/Dw0/Js8FEdsNws1c"
}
A medida que cria novos usuários, poderá ver uma listagem de todos usuários existentes para consulta
rota: api/users/list
type: GET
Response
[
{
"accounts": {
"balance": "1000.00",
"currency": "BRL",
"id": "8e0a577e-3699-4d14-9d1b-7caf08ed7c81"
},
"email": "rick@gmail.com",
"id": "16536828-f534-4d4d-b084-4e3b01253635",
"name": "Rick",
"password_hash": "$argon2id$v=19$m=131072,t=8,p=4$W+GxfWd9UL/OHI3IBatr4w$D921smF9JdO2F0pXHoq86gRoh3f1FR1YX+c4mv8es1M"
},
{
"accounts": {
"balance": "1000.00",
"currency": "BRL",
"id": "91f14f59-05e2-468d-89f0-16170f8bab9e"
},
"email": "ana@mail.com",
"id": "4e3ae188-267a-41ef-b50c-e3933eb83011",
"name": "Ana",
"password_hash": "$argon2id$v=19$m=131072,t=8,p=4$MZVU7w/Uf437dsmNB8l6tQ$pMQdlbe8suuPcwFtf+l636WJUJt/U3ZEXiIeYmV9dYY"
}
]
rota: api/operations/transaction
type: PUT
Body Params (JSON)
-
Id da conta origem:
from_account_id string
-
Id da conta destino:
to_account_id string
-
Valor:
value string
, o valor será string para que não haja pontos flutuantes.
Lembre-se de ultilizar o id da conta do usuário e não o id do usuário ao realizar transações.
Request
{
"from_account_id": "3fe295cd-9fab-43fb-806f-5d7430250cbe",
"to_account_id": "94f35f36-9a2a-418e-af26-d1bbeb1adfc9",
"value": "10"
}
Reponse
{
"message": "Transaction was sucessfull! From: 3fe295cd-9fab-43fb-806f-5d7430250cbe To: 94f35f36-9a2a-418e-af26-d1bbeb1adfc9 Value: 10"
}
Note que na rota de listagem (api/users/list
), ou na rota de mostrar um usuario (api/users/show?id={id}
), que o valor foi abatido da conta de origem e acrescentado na conta de destino.
rota: api/operations/update/balance
type: PUT
Request Params (JSON)
-
Conta a ser adicionada balance:
account_id string
-
Valor (balance) a ser adicionado a conta:
value string
Body Params (JSON)
{
"account_id": "3fe295cd-9fab-43fb-806f-5d7430250cbe",
"value": "10"
}
Response
{
"message": "Account amount updated!",
"account_id": "3fe295cd-9fab-43fb-806f-5d7430250cbe",
"value": "10"
}