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));
            }
        }
Example #2
0
        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());
        }