Skip to content

luizjanela/swapi

Repository files navigation

Star Wars API

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.

Arquitetura

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.

Como Rodar

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

Como Testar

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

Planeta

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)

Serviços

Adicionar Planeta

api/planets POST

Parâmetros

  • name string nome do Planeta
  • climate string clima do Planeta
  • terrain string terreno do Planeta

Responses

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

TODO (Task list)

  • 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

Listar Planetas

api/planets GET

Responses

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

TODO (Task list)

  • Testes automatizados do serviço

  • Response geral para cenários de erro

  • [ ] Criar paginação na busca

Buscar Planeta por nome

api/planets?name={name} GET

Parâmetros

  • name string Nome do planeta a ser buscado

Responses

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

TODO (Task list)

  • 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

Buscar Planeta por Id

api/planets/{id} GET

Parâmetros

  • id string Id do planeta a ser buscado

Responses

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

TODO (Task list)

  • Validar Id

  • Testes automatizados do serviço

  • Response geral para cenários de erro

Remover Planeta por Id

api/planets/{id} DELETE

Parâmetros

  • id string Nome do planeta a ser deletado

Responses

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

TODO (Task list)

  • Validar Id

  • Testes automatizados do serviço

  • Response geral para cenários de erro

Respostas gerais de Erro

HTTP Status Descrição
405 METHOD NOT ALLOWED Método não permitido
404 NOT FOUND Recurso não encontrado

Exemplo de Chamadas

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.

Links de apoio

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages