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:
- Permite cadastrar, consultar, atualizar e remover rotas aéreas entre aeroportos (ex: GRU → BRC).
- Consulta a rota mais barata entre dois aeroportos, independente da quantidade de conexões.
- ✅ 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
- ✅ .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)
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
- .NET 8.0 SDK
- Visual Studio 2022 ou VS Code
- Docker e Docker Compose
| Modo | Self-Host (CLI .NET) | Docker Compose |
|---|---|---|
| 1️⃣ Clone o repositório | |
Mesmo passo |
| 2️⃣ Navegue até o diretório do projeto | |
Mesmo passo |
| 3️⃣ Restaure todas as dependências | |
Não necessário — o docker-compose cuida disso |
| 4️⃣ Execute a aplicação | |
|
| 📄 Acesse a documentação | https://localhost:5011/swagger | http://localhost:8080/swagger |
| ⏹️ Parar app | Pressione Ctrl+C ou feche o terminal |
|
Warning
Em caso de algum problema ao executar os comandos acima, acesse a documentação de problemas mais comuns.
# Executar todos os testes
dotnet test
# Executar testes com relatório de cobertura
dotnet test --collect:"XPlat Code Coverage"| 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 |
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/routes/best-route |
Encontrar melhor rota entre dois pontos |
POST /api/routes
Content-Type: application/json
{
"origin": "GRU",
"destination": "CDG",
"cost": 75.0
}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
}
}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 |
- GRU → CDG:
GRU - BRC - SCL - ORL - CDG ao custo de $40 - BRC → SCL:
BRC - SCL ao custo de $5
A API utiliza o algoritmo de Dijkstra para encontrar a rota de menor custo entre dois pontos. O algoritmo:
- Constrói um grafo direcionado com as rotas disponíveis
- Calcula a distância mínima do ponto de origem para todos os outros pontos
- Reconstrói o caminho ótimo do destino de volta à origem
- 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.
- 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)
Todas as respostas da API seguem o padrão:
{
"success": boolean,
"status": number,
"message": string,
"data": object,
"errors": [
{
"code": string,
"message": string
}
]
}Por padrão, a aplicação usa InMemory Database para demonstração. Para usar SQL Server, execute os seguintes passos:
-
Descomente a linha no
Program.cs:options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
-
Configure a connection string no
appsettings.json -
Execute as migrações:
dotnet ef migrations add InitialCreate dotnet ef database update
Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.