public async Task <IActionResult> BuscarVoos([FromBody] FiltroVoos filtro) { try { var voos = await repository.BuscarVoos(filtro); return(Ok(voos)); } catch (Exception e) { Console.WriteLine(e.Message); return(StatusCode(500, "Erro ao buscar voos:\n" + e.Message)); } }
public async Task <List <Voo> > BuscarVoos(FiltroVoos filtro) { //buscar todos os voos var voosUberAir = await BuscarUberAir(); var voos99Planes = await Buscar99Planes(); //inicializar lista de retorno var voos = new List <Voo>(); var dataVoo = DateTime.ParseExact(filtro.DataVoo, "yyyy-MM-dd", provider); //novo voo para todos os voos da UberAir var vooUberAir = new Voo(); vooUberAir.Trechos = new List <Trecho>(); //seleciona todos os voos com mesma data e origem var voosOrigem = voosUberAir.Where(x => x.Data == dataVoo && x.AeroportoOrigem == filtro.AeroportoOrigem).ToList(); foreach (var uberAir in voosOrigem) { //seleciona todas possíveis escalas (como fica a meu critério, foi utilizado no máximo 2 escalas) var possiveisEscalas = voosUberAir.Where(x => x.AeroportoOrigem == uberAir.AeroportoDestino && x.HorarioSaida >= uberAir.HorarioChegada && x.AeroportoDestino == filtro.AeroportoDestino).ToList(); if (possiveisEscalas.Count > 0) { //se houver escala, cujo destino seja equivalente ao filtro passado via POST // adiciona os trechos para cada escala AdicionaTrecho(vooUberAir, uberAir); AdicionaTrecho(vooUberAir, possiveisEscalas.First()); } } //prepara para retornar no formato desejado vooUberAir.Chegada = vooUberAir.Trechos.LastOrDefault() == null ? new DateTime() : vooUberAir.Trechos.LastOrDefault().Chegada; vooUberAir.Saida = vooUberAir.Trechos.FirstOrDefault() == null ? new DateTime() : vooUberAir.Trechos.FirstOrDefault().Saida; vooUberAir.Origem = filtro.AeroportoOrigem; vooUberAir.Destino = filtro.AeroportoDestino; voos.Add(vooUberAir); //mesma lógica para o 99Planes var voo99Plane = new Voo(); voo99Plane.Trechos = new List <Trecho>(); var voosOrigem99 = voos99Planes.Where(x => x.Data_Saida == dataVoo && x.Origem == filtro.AeroportoOrigem).ToList(); foreach (var vooPlane in voosOrigem99) { var filhos = voos99Planes.Where(x => x.Origem == vooPlane.Destino && x.Saida >= vooPlane.Chegada && x.Destino == filtro.AeroportoDestino).ToList(); if (filhos.Count > 0) { AdicionaTrecho(voo99Plane, null, vooPlane); AdicionaTrecho(voo99Plane, null, filhos.First()); } } voo99Plane.Chegada = voo99Plane.Trechos.LastOrDefault() == null ? new DateTime() : voo99Plane.Trechos.LastOrDefault().Chegada; voo99Plane.Saida = voo99Plane.Trechos.FirstOrDefault() == null ? new DateTime() : voo99Plane.Trechos.FirstOrDefault().Saida; voo99Plane.Origem = filtro.AeroportoOrigem; voo99Plane.Destino = filtro.AeroportoDestino; voos.Add(voo99Plane); return(voos.OrderBy(x => x.Saida).ToList()); }