vandaimer / delivery-dijkstra

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Delivery - Cheapest path

Para encontrar o menor caminho/custo entre dois pontos foi utilizado Dijkstra.

Tecnologias

  • FastAPI - REST API Framework (Tem suporte para GraphQL)
  • SQLAlchemy - Abstração para fazer queries SQL
  • Pytest - biblioteca para implementar testes unitários
  • Docker
  • PostgreSQL

Rodar o projeto

  • Clone do repositório
  • Instalar docker e docker-compose
  • Rodar docker-compose up -d db para iniciar o PostgreSQL
  • Rocker docker-compose up dev para iniciar o projecto em modo de desenvolvimento
  • Para acessar a documentação da API, basta usar o seguinte link: http://localhost:8000/docs

Rotas da API

  • POST /api/v1/route - Exemplo de paylod
{
    "map": "string",
    "origin": "string",
    "destination": "string",
    "distance": 0
}

Snippet para adicionar várias rotas - Rodar no terminal

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"A\",\"destination\":\"B\",\"distance\":10}"

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"B\",\"destination\":\"D\",\"distance\":15}"                                        

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"A\",\"destination\":\"C\",\"distance\":20}"

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"C\",\"destination\":\"D\",\"distance\":30}"

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"B\",\"destination\":\"E\",\"distance\":50}"

curl -X POST "http://localhost:8000/api/v1/route" -H  "accept: application/json" -H  "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"D\",\"destination\":\"E\",\"distance\":30}"
  • GET /api/v1/route/cheapest/map/{map}/origin/{origin}/destination/{destination}/truck_autonomy/{truck_autonomy}/gas_price/{gas_price}
    map: string
    origin: string
    destination: string
    truck_autonomy: float
    gas_price: float

Exemplo - GET /api/v1/route/cheapest/map/SP/origin/A/destination/B/truck_autonomy/10.1/gas_price/2.50

{
  "route": [
    "A",
    "B",
    "D"
  ],
  "cost": 6.25
}

Outros comandos

  • Rodar docker-compose up tests
  • Rodar docker-compose up flake8 - Irá mostrar algo caso tiver algo a ser corrigido
  • Rodar docker-compose up coverage - Irá gerar um relatório da cobertura de teste. Após isso é só abrir no navegador o arquivo htmlcov/index.html.

Decisões

  • Implementação simples, funcional e flexivél para extensão
  • Utilizado uma biblioteca pronta para calcular o menor caminho/custo

Melhorias

A primeira verão da API dado os requisitos estão OK, porém há melhorias na mesma, segue a lista:
  • Garantir 100% de cobertura de teste.
  • Melhorar os testes para usar fixture do pytest.
  • Organizar as mensagens de errors para padronizar as mesmas.
  • Criar um Dockerfile que não instale as dependencias de desenvolvimento.
  • Implementar migrations usando sqlalchemy-migrate
  • Adicionar mais logs em parte importantes do sistema. Essa lib parece interesante (https://github.com/Delgan/loguru)

About


Languages

Language:Python 99.1%Language:Dockerfile 0.9%