Ejemplo n.º 1
0
        public async Task <List <FlightAvailabilityResponse> > Handle(SearchFlightAvailabilityQuery request, CancellationToken cancellationToken)
        {
            var availability = await _flightAvailabilityRepository.SearchFlightAvailability(request);

            return(availability == null
                ? null
                : _mapper.Map(availability));
        }
        public async Task <IActionResult> SearchFlights(FlightAvailabilityRequest request)
        {
            var query = new SearchFlightAvailabilityQuery(
                request.Scheduled,
                request.ScheduledTimeDate,
                request.Seats,
                request.ArrivalAirportCode,
                request.RoundTrip,
                request.Departure);
            var result = await _mediatr.Send(query, new CancellationToken());

            return(result != null
                ? (IActionResult)Ok(result)
                : NotFound(new { Message = $"No flights were found." }));
        }
        public async Task <List <FlightAvailability> > SearchFlightAvailability(SearchFlightAvailabilityQuery flightAvailabilityRequest)
        {
            var client = _elasticSearchClient.CreateElasticClient(_elasticsearchConfig.Value.Url);
            ISearchResponse <FlightAvailability> inboundResponse = null;
            var response = await client.SearchAsync <FlightAvailability>(far =>
                                                                         far.Index(_elasticsearchConfig.Value.FlightAvailabilityIndex)
                                                                         .From(0)
                                                                         .Size(6)
                                                                         .Sort(s => s
                                                                               .Ascending(f => f.Id))
                                                                         .Query(q => q
                                                                                .Bool(bq => bq
                                                                                      .Filter(
                                                                                          fq => fq.Range(r => r.Field(f => f.Seats).GreaterThanOrEquals(flightAvailabilityRequest.Seats)),
                                                                                          fq => fq.Match(m => m.Field(f => f.Scheduled).Query(flightAvailabilityRequest.Scheduled.ToString("yyyy'-'MM'-'dd"))),
                                                                                          fq => fq.MatchPhrase(mp => mp.Field(f => f.ArrivalAirportCode).Query(flightAvailabilityRequest.ArrivalAirportCode))
                                                                                          )
                                                                                      )
                                                                                )
                                                                         );

            if (flightAvailabilityRequest.RoundTrip && response.Documents.Any())
            {
                var airlines = String.Join(",", response.Documents.Select(d => d.AirlineIata.ToLower()));
                inboundResponse = await client.SearchAsync <FlightAvailability>(far =>
                                                                                far.Index(_elasticsearchConfig.Value.FlightAvailabilityIndex)
                                                                                .From(0)
                                                                                .Size(6)
                                                                                .Sort(s => s
                                                                                      .Ascending(f => f.Id))
                                                                                .Query(q => q
                                                                                       .Bool(bq => bq
                                                                                             .Filter(
                                                                                                 fq => fq.Range(r => r.Field(f => f.Seats).GreaterThanOrEquals(flightAvailabilityRequest.Seats)),
                                                                                                 fq => fq.Match(m => m.Field(f => f.Scheduled).Query(flightAvailabilityRequest.Departure.ToString("yyyy'-'MM'-'dd"))),
                                                                                                 fq => fq.MatchPhrase(mp => mp.Field(f => f.DepartureAirportCode).Query(flightAvailabilityRequest.ArrivalAirportCode))
                                                                                                 ).Should(s => s.Terms(t => t.Field(f => f.AirlineIata).Terms(airlines)))
                                                                                             )
                                                                                       )
                                                                                );
            }

            var availability = new List <FlightAvailability>();

            if (response?.Documents != null)
            {
                availability = response.Documents?.Select(d => new FlightAvailability
                {
                    Id                       = d.Id,
                    Scheduled                = d.Scheduled,
                    ScheduledTimeDate        = d.ScheduledTimeDate,
                    Arrival                  = d.Arrival,
                    ArrivalTimeDate          = d.ArrivalTimeDate,
                    FlightIdentifier         = d.FlightIdentifier,
                    DepartureAirportCode     = d.DepartureAirportCode,
                    DepartureAirport         = d.DepartureAirport,
                    DepartureAirportTimezone = d.DepartureAirportTimezone,
                    ArrivalAirportCode       = d.ArrivalAirportCode,
                    ArrivalAirport           = d.ArrivalAirport,
                    ArrivalAirportTimezone   = d.ArrivalAirportTimezone,
                    AirportCity              = d.AirportCity,
                    AirportCountry           = d.AirportCountry,
                    Terminal                 = d.Terminal,
                    Seats                    = d.Seats,
                    Gate                     = d.Gate,
                    AirlineIata              = d.AirlineIata,
                    AirlineName              = d.AirlineName,
                    FlightBound              = d.FlightBound
                }).ToList();

                if (inboundResponse?.Documents != null)
                {
                    availability.AddRange(inboundResponse.Documents?.Select(d => new FlightAvailability
                    {
                        Id                       = d.Id,
                        Scheduled                = d.Scheduled,
                        ScheduledTimeDate        = d.ScheduledTimeDate,
                        Arrival                  = d.Arrival,
                        ArrivalTimeDate          = d.ArrivalTimeDate,
                        FlightIdentifier         = d.FlightIdentifier,
                        DepartureAirportCode     = d.DepartureAirportCode,
                        DepartureAirport         = d.DepartureAirport,
                        DepartureAirportTimezone = d.DepartureAirportTimezone,
                        ArrivalAirportCode       = d.ArrivalAirportCode,
                        ArrivalAirport           = d.ArrivalAirport,
                        ArrivalAirportTimezone   = d.ArrivalAirportTimezone,
                        AirportCity              = d.AirportCity,
                        AirportCountry           = d.AirportCountry,
                        Terminal                 = d.Terminal,
                        Seats                    = d.Seats,
                        Gate                     = d.Gate,
                        AirlineIata              = d.AirlineIata,
                        AirlineName              = d.AirlineName,
                        FlightBound              = d.FlightBound
                    }).ToList());
                }
            }
            return(availability);
        }