Desenvolvido em Golang (go version go1.17.6 darwin/amd64) e Elastic Search (version 7.17.0).
Utiliza a Star Wars API https://swapi.dev/api/ para complementar informações.
Foi utilizada a LiteIDE X37.4 para desenvolvimento.
O projeto se baseia no padrão MVC (sem View) e no padrão REST. Foi criada uma nova camada para abstrair a comunicação com os provedores de dados externos chamada Library. A camada library (elklibrary.go
e swlibrary.go
) entregam dados já no modelo definido, fazendo com que o Controller apenas tenha que se preocupar com a camada de comunicação HTTP.
A Library elklibrary.go
é reponsável por comunicar com o Elastic Search.
A Library swlibrary.go
é reponsável por comunicar com o serviço SWAPI (unicamente usado para preencher o dado de apparitions).
Apenas temos o controller planetcontroller.go
pois planet é o único recurso tratado pelo projeto. Da mesma forma, o planetmodel.go
define o model do Planeta.
Para o tratamento de algumas respostas, foi criada também a struct/model responsemodel.go
para definição do padrão de resposta com o atributo status.
Foi criado também o arquivo properties.go
para que configurações gerais e strings padrão fossem inicializadas em um ponto central através de constantes.
O arquivo server.go
é onde está presente o método main, sendo ele executado o método executado ao rodar o comando go run . &
.
Após o projeto iniciar, podem ser feitas chamadas HTTP para que acesso aos recursos.
O projeto se utiliza dos packages github.com/gorilla/mux
para facilitação da criação de rotas e handlers e github.com/tidwall/gjson
para manipulações de json.
Ativar instância local do Elastic Search (port 9200)
$ elasticsearch
Buildar projeto (a partir da pasta do projeto)
$ go build .
Ativar server Go (a partir da pasta do projeto) (port 8083)
$ go run . &
Executar chamadas via curl ou Postman
$ curl http://localhost:8083/api/planets -v
Obs: Caso seja necessário customizar alguma porta ou endpoint, alterar no arquivo properties.go
Para o projeto SWAPI foram criados dois níveis de teste: unitário e de serviço. Ambos estão presentes no arquivo swapi_test.go
.
Para executar os testes completos, é necessário que o server esteja rodando, portanto, executar go run . &
antes de executar go test .
Segue o resultado dos testes:
ok luizjanela/swapi 1.211s
Obs.: Para garantir que os testes sempre estão rodando sem cache executar:
go clean -testcache
A entidade Planeta possui 5 atributos:
-
id string
(gerado automaticamente pelo ELK) -
name string
(inputado no serviço de criação) -
climate string
(inputado no serviço de criação) -
terrain string
(inputado no serviço de criação) -
apparitions int
(capturado como int a partir do serviço SWAPI)
api/planets POST
name string
nome do Planetaclimate string
clima do Planetaterrain string
terreno do Planeta
HTTP Status | Body | Descrição |
---|---|---|
201 OK | {"id":"_QRZ434BYh62MkvtPQvg", "name":"Tatooine", "climate": "arid", "terrain": "desert", "apparitions":5} | Filme salvo com sucesso |
409 CONFLICT | {"status":false, "message":"Planet already exists"} | Planeta não pode ser salvo, pois já existe |
412 PRECONDITION FAILED | {"status":false, "message":"All params must be set"} | Planeta não pode ser salvo, pois faltam parâmetros |
500 INTERNAL SERVER ERROR | {"status":false, "message":"Error message"} | General error |
-
Validar atributos
-
Validar se o planeta já existe
-
Capturar total de aparições em filmes a partir da busca https://swapi.dev/api/planets/?search=Alderaan (caso o planeja não existir, salvar com 0 aparições)
-
Testes automatizados do serviço
-
Response geral para cenários de erro
-
[ ] Implementar regra para tornar o serviço case-insensitive
-
[ ] Criar Enum para climate e terrain
api/planets GET
HTTP Status | Body | Descrição |
---|---|---|
200 OK | [{"id":"AgS4434BYh62MkvtxgxQ","name":"Tatooine","climate":"temperate","terrain":"gas giant","apparitions":5},{"id":"AwS5434BYh62MkvtbQzo","name":"Alderaan","climate":"temperate","terrain":"gas giant","apparitions":2}] | Listagem dos Planetas |
200 OK | [] | Nenhum planeta encontrado |
500 INTERNAL SERVER ERROR | {"status":false, "message":"Error message"} | General error |
-
Testes automatizados do serviço
-
Response geral para cenários de erro
-
[ ] Criar paginação na busca
api/planets?name={name} GET
name string
Nome do planeta a ser buscado
HTTP Status | Body | Descrição |
---|---|---|
200 OK | {"id":"AgS4434BYh62MkvtxgxQ","name":"Tatooine","climate":"temperate","terrain":"gas giant","apparitions":5} | Planeta encontrado |
404 NOT FOUND | {"status":false, "message":"Planet not found"} | Nenhum planeta encontrado |
500 INTERNAL SERVER ERROR | {"status":false, "message":"Error message"} | General error |
-
Validar buscar com mais de uma palavra
-
Testes automatizados do serviço
-
Response geral para cenários de erro
-
[ ] Implementar busca full_text no Elastic Search para sugestões aproximadas do nome
api/planets/{id} GET
id string
Id do planeta a ser buscado
HTTP Status | Body | Descrição |
---|---|---|
200 OK | {"id":"AgS4434BYh62MkvtxgxQ","name":"Tatooine","climate":"temperate","terrain":"gas giant","apparitions":5} | Planeta encontrado |
404 NOT FOUND | {"status":false,"message":"Planet not found"} | Planeta não encontrado |
500 INTERNAL SERVER ERROR | {"status":false, "message":"Error message"} | General error |
-
Validar Id
-
Testes automatizados do serviço
-
Response geral para cenários de erro
api/planets/{id} DELETE
id string
Nome do planeta a ser deletado
HTTP Status | Body | Descrição |
---|---|---|
200 OK | {"status":true, "message":"Planet deleted"} | Planeta removido com sucesso |
404 NOT FOUND | {"status":false,"message":"Planet not found"} | Planeta não encontrado |
500 INTERNAL SERVER ERROR | {"status":false, "message":"Error message"} | General error |
-
Validar Id
-
Testes automatizados do serviço
-
Response geral para cenários de erro
HTTP Status | Descrição |
---|---|
405 METHOD NOT ALLOWED | Método não permitido |
404 NOT FOUND | Recurso não encontrado |
Listagem de Planetas
curl -X GET http://localhost:8083/api/planets
Criação de Planeta
curl -X POST http://localhost:8083/api/planets --data "name=Alderaan&climate=temperate&terrain=gas giant" -v
Foi salvo um log da execução de chamadas manuais para o planeta Coruscant que tem 4 aparições em filmes. O resultado dos logs está no arquivo logs.txt
.