Desafio Bravo
Indíce
- Sobre
- Requisitos
- Docker Setup
- Setup
- Funcionamento
- Comandos do Composer
- Estrutura do Projeto
- Endpoints
- Teste de Estresse
- Informações Adicionais
Sobre
Construa uma API, que responda JSON, para conversão monetária. Ela deve ter uma moeda de lastro (USD) e fazer conversões entre diferentes moedas com cotações de verdade e atuais.
A API deve, originalmente, converter entre as seguintes moedas:
- USD
- BRL
- EUR
- BTC
- ETH
Requisitos
- PHP >= 7.3
- OpenSSL PHP Extension
- PDO PHP Extension
- php-curl extension
- php-sqlite extension
- Mbstring PHP Extension
- composer
- docker-compose (caso use container)
Docker Setup
Configure o arquivo .env seguindo as configurações do .env.example (para funcionar, basta copiar e colar o conteúdo).
Suba o container:
composer docker
Instale as dependências e gere o banco inicial:
docker-compose run webserver composer install && composer migrate
Configure o arquivo .env com base no .env.example (opcional).
A aplicação estará disponível no endereço: http://localhost:8000.
Setup
Instale as dependências:
composer install
Configure o arquivo .env: *
nano .env
*Se o arquivo não for criado automaticamente depois do composer install, faça uma cópia do .env.example.
Rode as migrations e seeds:
composer migrate
Inicie a aplicação:
composer start
A aplicação estará disponível no endereço: http://localhost:8000.
Funcionamento
Converter Moeda
Requisição para realizar a conversão entre 2 moedas:
- from: Moeda de origem.
- to: Moeda para qual o valor será convertido.
- amount: Valor da moeda de origem que será convertido.
curl 'http://localhost:8000/api/currencies?from=BTC&to=EUR&amount=123.45'
Login
Requisição para obter um token de acesso que permite usar as rotas para adicionar e remover moedas:
- email: usuário cadastrado no banco (padrão do .env.example é: admin@hurbchallenge.com).
- password: senha do usuário (padrão do .env.example é: secret123).
OBS.: Se alguma dessas informações for mudada no .env, será necessário mudar na requisição também.
curl 'http://localhost:8000/api/auth/login' -d 'email=admin@hurbchallenge.com&password=secret123'
Adicionar Moeda
Requisição para adicionar moeda:
- name: Moeda a ser adicionada.
- usd_value: Valor da moeda equivalente a 1 dólar americano (USD).
- {token}: Token gerado no endpoint /login.
curl 'http://localhost:8000/api/currencies' -X 'POST' -d 'currency=CAD&usd_value=1.26' -H 'Authorization: Bearer {token}'
Remover Moeda
Requisição para remover moeda:
- {currency}: Código da moeda a ser removida.
- {token}: Token gerado no endpoint /login.
curl 'http://localhost:8000/api/currencies/{currency}' -X 'DELETE' -H 'Authorization: Bearer {token}'
Comandos do Composer
Rodar testes:
composer tests
Iniciar projeto utilizando php-cli:
composer start
Configurar/Limpar banco:
composer migrate:fresh --seed
Iniciar container:
composer docker
Estrutura do Projeto
Os arquivos mencionados foram os que eu criei ou manipulei no framework:
├── app - Contém o código-fonte principal do projeto.
│ ├── Http - Scripts para criar as tabelas do banco de dados.
│ ├──── Controllers - Controladores do sistema.
│ ├────── AuthController - Controlador de autenticação.
│ ├────── CurrencyController - Controlador de cotações.
│ │
│ ├──── Models - Modelos do sistema.
│ ├────── User - Modelo de autenticação.
│ ├────── Currency - Modelo de cotações.
│ │
│ ├──── Repositories - Repositórios do sistema.
│ ├────── AuthRepository - Repositório de autenticação.
│ ├────── CurrencyRepository - Repositório de cotações.
│ │
│ ├──── Services - Classes de serviços para auxiliar na lógica extra.
│ └────── CurrencyService - Validações na logica de cotações.
│
├── bootstrap - A instância $app principal do projeto.
│ └── app - Configurações do projeto.
│
├── database - Arquivos do banco de dados.
│ ├── factories - Factories para incluir dados ao realizar testes.
│ ├── migrations - Migrations para criação de tabelas no banco.
│ └── seeders - Seeders para popular o banco na instação do projeto.
│
├── routes - Arquivos de rota.
│ └── web - Rotas da API.
│
├── docker-compose - Arquivos de configuração do container.
│ └── apache2 - Arquivos de configuração do apache2.
|
├── tests - Testes do sistema.
│ ├── Feature - Testes dos endpoints da API.
│
Endpoints
POST /login
GET /currencies
POST /currencies
DELETE /currencies/{currency}