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); }