- A API deve ser REST
- Para cada planeta, os seguintes dados devem ser obtidos do banco de dados da aplicação, sendo inserido manualmente:
- Nome
- Clima
- Terreno
- Quantidade de aparições em filmes (que podem ser obtidas pela API pública do Star Wars: https://swapi.co/)
- Adicionar um planeta (com nome, clima e terreno)
- Listar planetas
- Buscar por nome
- Buscar por ID
- Remover planeta
- MONGO_URL - URL de acesso ao mongodb (ex: mongodb://:@:)
- SERVER_ADDR - Onde a App vai fazer bind (ex ":8080")
- API_RATE_LIMIT - Quantidade de requisicoes por segundo que a App ira atender (ex: 20) (default: 100)
- CB_REQ_COUNT - Quantidade de requests para considerar fechar o circuito (ex: 40) (default: 3)
- CB_REQ_FAIL_RATIO - razao (total falhas):(total de request) (ex: 1.5) (default: 0.5)
No diretorio raiz:
docker-compose up
Os exemplos abaixo sao chamadas usando o httpie, mas sao facilmente tarduziadas para o uso do bom e velho curl
* http POST localhost:8000 climate=seco name=Tatooine terrain=terreno
Retornos:
* 200 : Sucesso
* 400 : Erros de validacao de input
* 500 : Erro inesperado
* http GET localhost:8000/planets
Retornos:
* 200 : Sucesso
* 500 : Erro inesperado
* http GET localhost:8000/planets?name=<NOME_DO_PLANETA_AQUI>
Retornos:
* 200 : Sucesso
* 400 : Erros de validacao de input
* 500 : Erro inesperado
* http GET localhost:8000/planets?id=<IDENTIFICADOR_DO_PLANETA_AQUI>
Retornos:
* 200 : Sucesso
* 400 : Erros de validacao de input
* 500 : Erro inesperado
* http DELETE localhost:8000/planets?id=<IDENTIFICADOR_DO_PLANETA_AQUI>
Retornos:
* 200 : Sucesso
* 400 : Erros de validacao de input
* 500 : Erro inesperado
No diretorio raiz:
MONGO_URL=mongodb://<user>:<pass>@<host>:<port> SERVER_ADDR=:8080 go run main.go
Foi escolhido a ferramenta dep para o gerenciamento de dependencias, pois sera a ferramenta incorporada na linguagem num futuro proximo. Isso vai evitar reescritas pra adapatacao.
O repositorio fica maior e os diffs sao mais complicados de lidar, porem para esse desafio em especifico eu quis garantir 2 coisas:
- O usuario desse projeto nao vai precisar executar o
dep ensure
para buildar o programa. - Garantir que o codigo vai reproduzir o mesmo comportamento no build por estar desacoplado de repositorios externos (quase como um cache)
A imagem base para o build e a de execucao sao a mesma distro, nao precisei me preocupar com falhas na linkagem dinamica.
Para controle de vazao
Para nao ter problemas de performance da nossa App originados pelo meio externo
- Commits separados com a progressao do desenvolvimento, facilitaria um tracking no futuro
- Swagger automatizado
- Externalizar o base path como variavel de ambiente
- Testes unitarios (Essa parte eh facil, mas demora pois tem muito boilerplate, entao preferi focar em features mais interessante para o desafio)
- Teste de aceitacao (Acho interessante tbm a abordagem do BDD, por ex: https://github.com/DATA-DOG/godog/)