Skip to content

alexandredorea/Challenge.Bmg.Dijkstra

Repository files navigation

Route Calculator API (Challenge Dijkstra)

API escrita em .NET Core 8.0 para cálculo de melhor rota de viagem com CRUD de rotas e algoritmo de busca da rota mais barata. Ou seja:

  1. Permite cadastrar, consultar, atualizar e remover rotas aéreas entre aeroportos (ex: GRU → BRC).
  2. Consulta a rota mais barata entre dois aeroportos, independente da quantidade de conexões.

Funcionalidades

  • ✅ CRUD completo de rotas (Create, Read, Update, Delete)
  • ✅ Algoritmo de Dijkstra para encontrar a melhor rota (menor custo)
  • ✅ Validação de dados com FluentValidation
  • ✅ Documentação Swagger/OpenAPI
  • ✅ Testes unitários e de integração
  • ✅ Padrão de resposta API consistente
  • ✅ Suporte a CORS
  • ✅ Entity Framework com Code First

Tecnologias utilizadas

  • ✅ .NET 8.0
  • ✅ ASP.NET Core Web API
  • ✅ Entity Framework Core
  • ✅ FluentValidation
  • ✅ Swagger/OpenAPI
  • ✅ xUnit (para os testes)
  • ✅ FluentAssertions (para os testes)
  • ✅ Moq (para os testes)

Estrutura do projeto

Challenge.Bmg.Dijkstra/
├── src/
│   └── Challenge.Bmg.Dijkstra.Api/        # Projeto da aplicação
│       ├── Controllers/                   # Controllers da API
│       ├── Domain/                        # Modelos ou entidades de dados
│       ├── Features/ 
│       │   ├── DTOs/                      # Data Transfer Objects
│       │   ├── Services/                  # Lógica de negócio
│       │   └── Validators/                # Validadores (FluentValidation)
│       ├── Infrastructure/
│       │   └── Data/                      # Contexto do Entity Framework
│       └── Program.cs                     # Configuração da aplicação
└── tests/
    └── Challenge.Bmg.Dijkstra.Tests/      # Projeto de testes

Como rodar a aplicação

Pré-requisitos

  • .NET 8.0 SDK
  • Visual Studio 2022 ou VS Code
  • Docker e Docker Compose

Executando a aplicação

Modo Self-Host (CLI .NET) Docker Compose
1️⃣ Clone o repositório
git clone https://github.com/alexandredorea/Challenge.Bmg.Dijkstra.git
Mesmo passo
2️⃣ Navegue até o diretório do projeto
cd Challenge.Bmg.Dijkstra.Api
Mesmo passo
3️⃣ Restaure todas as dependências
dotnet restore
Não necessário — o docker-compose cuida disso
4️⃣ Execute a aplicação
dotnet run
docker-compose up -d --build
📄 Acesse a documentação https://localhost:5011/swagger http://localhost:8080/swagger
⏹️ Parar app Pressione Ctrl+C ou feche o terminal
docker-compose down

Warning

Em caso de algum problema ao executar os comandos acima, acesse a documentação de problemas mais comuns.

Executando os testes

# Executar todos os testes
dotnet test

# Executar testes com relatório de cobertura
dotnet test --collect:"XPlat Code Coverage"

Endpoints da API

Rotas (CRUD)

Método Endpoint Descrição
GET /api/routes Listar todas as rotas
GET /api/routes/{id} Obter rota por ID
POST /api/routes Criar nova rota
PUT /api/routes/{id} Atualizar rota
DELETE /api/routes/{id} Excluir rota

Busca de melhor rota

Método Endpoint Descrição
POST /api/routes/best-route Encontrar melhor rota entre dois pontos

Exemplos de Uso

Criar uma nova rota

POST /api/routes
Content-Type: application/json

{
  "origin": "GRU",
  "destination": "CDG",
  "cost": 75.0
}

Buscar melhor rota

POST /api/routes/best-route
Content-Type: application/json

{
  "origin": "GRU",
  "destination": "CDG"
}

Resposta:

{
  "success": true,
  "status": 200,
  "message": "Melhor rota encontrada com sucesso",
  "data": {
    "route": "GRU - BRC - SCL - ORL - CDG ao custo de $40",
    "totalCost": 40,
    "path": ["GRU", "BRC", "SCL", "ORL", "CDG"],
    "found": true
  }
}

Dados de exemplo

A aplicação vem com dados pré-carregados para demonstração:

Origem Destino Custo
GRU BRC $10
BRC SCL $5
GRU CDG $75
GRU SCL $20
GRU ORL $56
ORL CDG $5
SCL ORL $20

Exemplos de consulta

  • GRU → CDG: GRU - BRC - SCL - ORL - CDG ao custo de $40
  • BRC → SCL: BRC - SCL ao custo de $5

Algoritmo de busca

A API utiliza o algoritmo de Dijkstra para encontrar a rota de menor custo entre dois pontos. O algoritmo:

  1. Constrói um grafo direcionado com as rotas disponíveis
  2. Calcula a distância mínima do ponto de origem para todos os outros pontos
  3. Reconstrói o caminho ótimo do destino de volta à origem
  4. Retorna a rota completa com o custo total

Note

Para saber mais sobre o desafio proposto e o entendimento para usar esta solução, você pode acessar este documento para maiores detalhes.

Validações aplicadas

  • Códigos de aeroporto devem ter exatamente 3 caracteres maiúsculos
  • Custo deve ser maior que zero
  • Origem e destino devem ser diferentes
  • Não é permitido criar rotas duplicadas (mesma origem e destino)

Padrão de Resposta

Todas as respostas da API seguem o padrão:

{
  "success": boolean,
  "status": number,
  "message": string,
  "data": object,
  "errors": [
    {
      "code": string,
      "message": string
    }
  ]
}

Configuração de banco de dados

Por padrão, a aplicação usa InMemory Database para demonstração. Para usar SQL Server, execute os seguintes passos:

  1. Descomente a linha no Program.cs:

    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
  2. Configure a connection string no appsettings.json

  3. Execute as migrações:

    dotnet ef migrations add InitialCreate
    dotnet ef database update

Licença

Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.

About

Repositório referente a desafio do Banco BMG, usando o algoritmo de Dijkstra, que é um algoritmo clássico de busca de caminhos mais curtos em grafos ponderados com pesos não negativos.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors