StoneMarkets é um projeto desenvolvido como resolução do desafio proposto pela empresa Stone e tem como finalidade a simulação de um mercado digital onde é possível que um cliente registre uma conta, realize depósitos e compras através da aplicação. O projeto foi desenvolvido utilizando a linguagem de programação Elixir e seu Framework Web mais utilizado Phoenix. A motivação para o desenvolvimento de uma API foi a possibilidade de dar um contexto real para o desafio proposto e aprimoramento dos meus conhecimentos nas tecnologias mencionadas.
Principais funcionalidades da API:
- Listagem de moedas cadastradas
- Listagem de marketplaces cadastrados
- Listagem de lojistas cadastrados
- Exibição de lojista cadastrado
- Cadastro de clientes com conta associada
- Exibição de cliente cadastrado
- Autenticação de cliente
- Deposito monetário para conta de cliente
- Listagem de produtos cadastrados
- Exibição de produto cadastrado
- Atualização de moeda para um determinado marketplace, realizando o câmbio de todos os valores monetários cadastrados no sistema que possui associação com o marketplace alterado
- Solicitação de pedido de compra por um cliente, sequenciando um split de pagamentos aos lojistas correspondentes
- Câmbio de valor monetário entre moedas
Tecnologias e libs utilizadas na API:
- Elixir
- Credo
- Ecto Eescope
- Ecto Sql
- Ex Coveralls
- Ex Machina
- Guardian
- Hackney
- Jason
- Memoize
- Mox
- Pbkdf2 Elixir
- Phoenix Framework
- Phoenix Ecto
- Plug Cowboy
- Postgrex
- Tesla
Para executar esse projeto você precisará instalar corretamente em sua máquina o Elixir, Phoenix Framework e o Docker com uma imagem do PostgreSQL configurada. Caso ainda não os tenha instalados, siga os seguintes passos disponibilizados pela documentação oficial das tecnologias:
Após instalar o docker é necessário configurar a imagem do postgres, fazendo o pull da imagem oficial:
# Baixa a imagem oficial do postgres para o docker
$ sudo docker pull postgres
Na sequência execute o comando a seguir para subir um container com a imagem postgres recém baixada:
# Sobe um container no docker com a imagem do postgres configurada para utilização
$ sudo docker run --name stone_markets_db -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=stone_markets_dev -d postgres
Com toda a configuração de ambiente pronta, podemos então configurar nosso projeto. Primeiro passo é necessário clonar o projeto, acessando o terminal no diretório de sua preferência e executar:
# Baixa o repositório stone_markets do github
$ git clone https://github.com/gideonfernandes/stone_markets.git
Na sequência execute o comando 'mix deps.get' dentro do diretório do projeto para baixar as dependências:
# Acessa o projeto e baixa as dependencias necessárias
$ cd stone_markets/
$ mix deps.get
Após isso devemos garantir que as configurações do banco de dados estão em conformidade com as configurações do PostgreSQL que está online através do container do docker (caso você seguiu a instalação do PostgreSQL via Docker como descrito acima, estas configurações já estarão corretas) no arquivo config/dev.exs:
config :stone_markets, StoneMarkets.Repo,
username: "postgres",
password: "postgres",
database: "stone_markets_dev",
hostname: "localhost",
show_sensitive_data_on_connection_error: true,
pool_size: 10
Conforme as configurações acima estiverem corretamente aplicadas, podemos então executar nosso comando de setup do projeto, no qual irá criar um banco de dados, rodar todas as migrations e seeds, deixando o projeto apto a ser utilizado.
# Executa o setup necessário para rodar o projeto
$ mix ecto.setup
Depois da conclusão do setup executado acima, podemos então subir nosso servidor Phoenix e utilizar nossa API rodando o comando abaixo:
# Sobe a API Phoenix
$ mix phx.server
Descrição: Lista todas as moedas cadastradas no sistema.
- GET para localhost:4000/api/currencies
Descrição: Lista todos os marketplaces cadastrados no sistema.
- GET para localhost:4000/api/marketplaces
Descrição: Atualiza a moeda atual do marketplace correspondente. Ao atualizar a moeda do marketplace, automaticamente todos os valores monetários cadastrados no sistema que estão linkados ao marketplace em questão serão cambeados para nova moeda e atualizados.
- PUT/PATCH para localhost:4000/api/marketplaces/:id
Passe como body da requisição o seguinte payload no formato de JSON contendo o currency_code da nova moeda que deseja utilizar no marketplace, exemplo:
{"currency_code": "BRL"}
Descrição: Cria uma nova conta de acesso de cliente e automaticamente uma conta monetária com saldo inicial de 5.000,00 na moeda atual do marketplace associado, permitindo ao cliente o acesso a rotas autenticadas do sistema usando as credenciais.
- POST para localhost:4000/api/customers
Passe como payload no body da requisição um JSON no seguinte formato:
{
"address": "Rua dos Macarrões, 9999",
"age": 23,
"cpf":"88888888888",
"email":"gideon.de.fernandes@gmail.com",
"marketplace_id": "67e8afac-cffe-4f16-a3bb-ded1b532ccca",
"name":"Gideon Fernandes",
"nickname":"Gidex",
"password":"123456"
}
Descrição: Cria uma nova sessão acesso ao cliente através de suas credenciais, retornando um token JWT para utilizar nas rotas autenticadas.
- POST para localhost:4000/api/auth
Passe como payload no body da requisição um JSON no seguinte formato:
{
"email": "gideon.de.fernandes@gmail.com",
"password": "123456"
}
Para utilizar uma rota autenticada será necessário criar uma autenticação com as credenciais de cliente, e então utilizar o token JWT recebido como retorno no header das requisições à rota autenticada como o exemplo a seguir:
{
"header": "Beader token_gerado_pela_autenticação"
}
Descrição: Realiza o depósito de um valor monetário para a conta do cliente.
- POST localhost:4000/api/customers/:id/deposit
Passe como payload no body da requisição um JSON no seguinte formato:
{
"value": 50000
}
Descrição: Exibe o cliente correspondente ao ID solicitado.
- GET para localhost:4000/api/customer/:id
Descrição: Lista todas os lojistas cadastrados no sistema que possui associação com o marketplace em que o cliente pertence.
- GET para localhost:4000/api/shopkeepers
Descrição: Lista todas os lojistas cadastrados no sistema que pertence as categorias solicitadas e possui associação com o marketplace em que o cliente pertence.
- GET para localhost:4000/api/shopkeepers?categories="electronics,clothing"
Descrição: Exibe o lojista correspondente ao ID solicitado.
- GET para localhost:4000/api/shopkeeper/:id
Descrição: Lista todas os produtos cadastrados no sistema que possui associação com o marketplace em que o cliente pertence.
- GET para localhost:4000/api/products
Descrição: Lista todas os produtos cadastrados no sistema que pertence as categorias solicitadas e possui associação com o marketplace em que o cliente pertence.
- GET para localhost:4000/api/products?categories="electronics,clothing"
Descrição: Exibe o produto correspondente ao ID solicitado.
- GET para localhost:4000/api/product/:id
Descrição: Exibe o produto correspondente ao ID solicitado.
- POST para localhost:4000/api/orders
Passe como payload no body da requisição um JSON no seguinte formato:
{
"comments": "Um comentário qualquer...",
"marketplace_id": "67e8afac-cffe-4f16-a3bb-ded1b532ccca",
"address": "Rua dos Macarrões, 9000",
"products": [
{
"id": "961cc528-71e3-44bd-826b-29161f2c6c2b",
"amount": 12
},
{
"id": "e252526f-799a-4305-90eb-736fcf558909",
"amount": 10
}
]
}
Descrição: Realiza o câmbio de valor monetário entre dus moedas.
- POST para localhost:4000/api/currencies/exchange
Passe o payload no body da requisição um JSON no seguinte formato:
{
"from_code": "BRL",
"to_code": "EUR",
"value": 500
}
Você poderá importar o arquivo documentation/endpoints.json que possui as rotas já configuradas para utilizar a API via Insomnia.
Dica de utilização:
- Importe o arquivo de rotas documentation/endpoints.json para o client HTTP Insomnia
- Liste os marketplaces para escolher um ID qualquer para poder criar um novo cliente
- Crie um cliente na API com seus dados para o marketplace
- Crie uma autenticação com as credenciais do cliente recém criado
- Realize um depósito para o novo cliente
- Liste todos os produtos para escolher os IDS dos produtos desejados
- Exiba o cliente logado para comparação de saldo posterior a uma compra
- Liste os lojistas comparação de saldo posterior a uma compra
- Crie um novo pedido passando os produtos desejados, quantidade e o marketplace_id do cliente
- Exiba o cliente para observar o saldo atual após uma compra
- Liste os lojistas para observar os saldos atuais após a divisão de pagamentos após uma compra
- Altere a moeda atual do marketplace que usou para criar o cliente
- Liste os lojistas para observar o cambio de valores performados após a mudança de moeda do marketplace
- Realize o câmbio de valor de uma moeda para outra