# JayaCurrencyConverter
<img src="https://github.com/franknfjr/jaya_currency_converter/blob/development/assets/jaya_currency_converter.png" width="250" alt="JayaCurrencyConverter">
[![CI](https://github.com/franknfjr/jaya_currency_converter/actions/workflows/ci.yml/badge.svg)](https://github.com/franknfjr/jaya_currency_converter/actions?query=workflow%3ACI)
[![CD](https://github.com/franknfjr/jaya_currency_converter/actions/workflows/cd.yml/badge.svg)](https://github.com/franknfjr/jaya_currency_converter/actions?query=workflow%3ACD)
[![Coverage Status](https://coveralls.io/repos/github/franknfjr/jaya_currency_converter/badge.svg)](https://coveralls.io/github/franknfjr/jaya_currency_converter)
[![hexdocs.pm](https://img.shields.io/badge/docs-latest-green.svg?style=flat-square)](https://hexdocs.pm/jaya_currency_converter/0.1.0/readme.html)
A aplicação conversor de moedas é uma API REST, chamada Jaya Currency Converter, com objetivo de converter valores de uma moeda de origem para uma moeda de destino.
Você pode fazer a conversão nas seguintes moedas:
* Real brasileiro
* Dólar americano
* Euro
* Iene japonês
As moedas serão referidas com o [padrão internacional](https://pt.wikipedia.org/wiki/ISO_4217) para facilitar a explicação.
## Informacoes Tecnicas
O projeto foi criado todo na linguagem [Elixir](https://elixir-lang.org/) na versão 1.11.4 utilizando o framwork [Phoenix](https://www.phoenixframework.org/) versão 1.5.13.
Para fazer as taxas de conversão foi utilizado a API do [Exchangeratesapi.io](https://exchangeratesapi.io/documentation/)
Para a persistência dos dados foi utilizado o PostgreSQL.
Outras bibliotecas que foram utilizadas:
* [credo](https://github.com/rrrene/credo) para garantir qualidade
* [sobelow](https://github.com/nccgroup/sobelow) para checar as vulnerabilities do projeto
* [excoveralls](https://github.com/parroty/excoveralls) manter a cobertura e relatório de testes
* [tesla](https://github.com/teamon/tesla) cliente HTTP para fazer requisições
* Arquivos [licença](/LICENSE.md) e [changelog](/CHANGELOG.md) como documentação e qualidade de entrega
## Instalação
Execute os seguintes comandos:
```sh
git clone https://github.com/franknfjr/jaya_currency_converter
cd jaya_currency_converter
```
Após entrar no diretório, existe um arquivo `.env.sample` que é obrigatório inserir o valor da API_KEY para carregar em variáveis de ambiente.
Caso você não tenha uma API_KEY, é preciso se registrar no [site](https://manage.exchangeratesapi.io/signup/free)
Altere o arquivo `.env.sample` para `.env`
Execute o seguinte comando:
```sh
source .env
```
Feito isso podemos fazer a compilação e excução da aplicação, executando os seguintes comandos:
```sh
mix deps.get
mix ecto.create && mix ecto.migrate
```
## Funcionamento
Para início, vamos observar todas nossas rotas executando o comando:
```sh
mix phx.routes
```
Metodo | endpoint | descrição | valores que podem ser passados para os parametros
-------|--------- | ----------------------- | --------------
GET | / | exibe o texto #JayaCurrencyConverter |
GET | /api/users | lita todos usuarios |
GET | /api/users/:id | lista um usuario específico | `id`
POST | /api/users | esse endpoint cria um usuario | `name`
GET | /api/users/:user_id/transactions | lista todas transações de um usuário | `user_id`
GET | /api/users/:user_id/transactions/:id | lista uma transação específica de um usuário | `user_id`, `id`
POST | /api/users/:user_id/transactions | cria uma transação | `user_id`, `amount`, `currency_from`, `currency_to`
| ⚠️ | Todos os campos `id` seguem o format de [UUID](https://pt.wikipedia.org/wiki/Identificador_%C3%BAnico_universal) |
| - | - |
Agora execute o comando para iniciar a aplicação.
```bash
mix phx.server
```
Abaixo, alguns exemplos de chamadas que serão feitas nessa API:
POST `/api/users`
```sh
curl --request POST \
--url http://localhost:4000/api/users \
--header 'Content-Type: application/json' \
--data '{
"user": {
"name": "Frank"
}
}'
```
O código HTTP de retorno deve ser 201 e o corpo esperado na resposta é:
```json
{
"created_at": "2021-12-24T14:46:52",
"id": "f4e456d0-78f1-42ba-a3ee-af9440923074",
"name": "Frank"
}
```
GET `/api/users`
```sh
curl --request GET \
--url http://localhost:4000/api/users \
--header 'Content-Type: application/json'
```
O código HTTP de retorno deve ser 200 e o corpo esperado na resposta é:
```json
[
{
"created_at": "2021-12-24T14:44:38",
"id": "e4fd3017-33f8-43e7-98ed-2ed388dcfab0",
"name": "Frank"
}
]
```
POST `/api/users/:user_id/transactions`
```sh
curl --request POST \
--url http://localhost:4000/api/users/0d522e67-3239-4105-a534-df47ac541bf0/transactions \
--header 'Content-Type: application/json' \
--data '{
"transaction": {
"amount": 12,
"currency_from": "BRL",
"currency_to": "USD"
}
}'
```
O código HTTP de retorno deve ser 201 e o corpo esperado na resposta é:
```json
{
"amount": "12",
"amount_to": 2.1142,
"created_at": "2021-12-24T14:54:10",
"currency_from": "BRL",
"currency_to": "USD",
"id": "bde63d46-f074-4ad1-bba8-2afdc7c8f746",
"rate": "1.13208",
"user_id": "0d522e67-3239-4105-a534-df47ac541bf0"
}
```
GET `/api/users/:user_id/transactions`
```sh
curl --request GET \
--url http://localhost:4000/api/users/ab0f5215-42ca-45b2-a66d-2f8e44537a29/transactions \
--header 'Content-Type: application/json'
```
O código HTTP de retorno deve ser 200 e o corpo esperado na resposta é:
```json
[
{
"amount": "12",
"amount_to": null,
"created_at": "2021-12-24T14:59:11",
"currency_from": "BRL",
"currency_to": "USD",
"id": "d29fd494-35eb-42d1-b91b-85257ef2af86",
"rate": "1.13208",
"user_id": "ab0f5215-42ca-45b2-a66d-2f8e44537a29"
}
]
```
## Deploy
A aplicação está no [Gigalixir](https://www.gigalixir.com/) no endereço https://jayacurrencyconverter.gigalixirapp.com. Um dos motivos de utilizar o serviçõ é que não tem sleeps da aplicação no plano free.
## Licença
Copyright (c) 2021, Frank Ferreira.
JayaCurrencyConverter is [MIT licensed](./LICENSE.md)