Skip to content

dellatorreadrian/challenge-bravo

 
 

Repository files navigation

Hurb Bravo Challenge

Arquitetura do Projeto de API

architecture_desafio-bravo

Através da API é possível:
-> Consultar todas as Moedas cadastradas

-> Consultar uma Moeda cadastrada pelo Nome

-> Inserir uma nova Moeda no Banco de Dados

-> Deletar uma Moeda cadastrada pelo seu Nome

-> Converter uma Moeda em outra, ambas devendo estar previamente registradas na API

Outras funcionalidades:
-> Caso a Moeda cadastrada exista na API externa utilizada e esteja com a flag "isAutoUpdatable" como "true", ela será automaticamente atualizada a cada 15 segundos via CronJob.

-> Caso a Moeda cadastrada NÃO exista na API externa utilizada e esteja com a flag "isAutoUpdatable" como "true", um log no servidor apontará que a Moeda não existe na API, manterá sua taxa de conversão como a previamente cadastrada pelo usuário e alterará a flag "isAutoUpdatable" para "false".

-> Sempre que a API for inicializada, ela buscará via API Externa os valores atuais para as 5 Moedas Padrão definidas no desafio (USD, BRL, EUR, BTC e ETH) e as atualizará/inserirá no banco de dados.

Tecnologias envolvidas

Linguagem GO Banco de Dados Redis Docker

Motivo das Escolhas Tecnológicas

Para este desafio, escolhi a linguagem Golang, principalmente por ser relativamente simples de levantar uma API com essas finalidades, mas também por fazer parte da Stack já utilizada pelo Hurb.

Outro motivo é por este ser o meu primeiro projeto em Golang, o que me motivou a me desafiar ainda mais para aprender uma nova linguagem e suas nuances a fim de concluir este projeto.

Escolhi o Redis por ser um banco de dados muito rápido, visando atingir ótimos resultados nos testes de stress.

O Docker foi utilizado por ser da preferência do desafio e por facilitar o transporte e a implantação ao enviar o projeto.

Módulos externos utilizados

github.com/stretchr/testify
  -> Módulo utilizado para os arquivos de Teste.

github.com/go-co-op/gocron
  -> Módulo utilizado para criar o cronjob responsável pela atualização contínua, a cada 15 segundos, dos valores das moedas com "isAutoUpdatable = true".

github.com/joho/godotenv
  -> Módulo responsável pelo carregamento de informações do arquivo .env no ambiente.

github.com/gorilla/mux
  -> Módulo responsável por instanciar e gerenciar o roteador de gerenciamento das rotas das chamadas da API.

github.com/go-redis/redis
  -> Módulo responsável por disponibilizar buscas e atualizações no banco de dados Redis.

Como instalar e rodar o Projeto

Para subir as imagens de BD e App, bastar rodar, na raiz do projeto, dentro do arquivo "CHALLENGE-BRAVO":

docker-compose up

Endpoints

Retorna todas as moedas cadastradas:

curl http://localhost:5000/currencies

Retorna uma moeda cadastrada:

curl http://localhost:5000/currencies/BRL

Adiciona a moeda "TEST", com a taxa de conversão igual a 88 (Taxa de Conversão calculada em relação ao dólar americano) e a flag "isAutoUpdatable" igual a "false":

curl --header "Content-Type: application/json" -d "{\"name\":\"TEST\", \"conversionRate\":88, \"isAutoUpdatable\": false}" http://localhost:5000/currencies

Remove uma moeda pelo seu nome:

curl -X DELETE http://localhost:5000/currencies/TEST

Conversão entre moedas:

curl "http://localhost:5000/convert?from=USD&amount=10&to=BRL"

Cobertura de Testes

Realizei os testes para os Services, com cobertura de 82.9%

Test Coverage

Para executar os testes, acessar a pasta de Services e rodar, conforme necessidade:

go test -v --cover
  -> Mostra os testes que passaram ou falharam com a porcentagem de cobertura.

go test --coverprofile coverage.txt
  -> Gera o arquivo de cobertura para ser lido no próximo comando.

go tool cover --html=coverage.txt
  -> Abre em um navegador, separado por cada arquivo testado, uma visibilidade de todas as linhas cobertas pelos testes e a porcentagem de cobertura de cada arquivo.

Testes de stress - Vegeta

Realizei o teste de stress na funcionalidade de maior complexidade da aplicação, Converter valores entre moedas. Todas as requisições foram atendidas com sucesso e rapidamente.

Segue o print do resultado. Teste efetuado dia 20/11/2022:

vegeta_stress_test

Oportunidades de Melhoria

-> Gerar um projeto separado para que o Cronjob, que atualiza as moedas "isAutoUpdatable = true", rode independente da API.

-> Finalizar todos os testes para todos os pacotes.

-> Incluir autenticação para utilização da API.

About

Backend code challenge

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 99.3%
  • Other 0.7%