public async Task <List <HotelAvailabilityResponse> > Handle(SearchHotelAvailabilityQuery request, CancellationToken cancellationToken)
        {
            var availability = await _hotelAvailabilityRepository.SearchHotelAvailability(request);

            return(availability == null
                ? null
                : _mapper.Map(availability));
        }
        public async Task <IActionResult> SearchHotels(HotelAvailabilityRequest request)
        {
            var query = new SearchHotelAvailabilityQuery(
                request.Infants,
                request.Children,
                request.Adults,
                request.StayDate,
                request.HotelName,
                request.NetPrice,
                request.Region,
                request.Country,
                request.Available);
            var result = await _mediatr.Send(query, new CancellationToken());

            return(result != null
                ? (IActionResult)Ok(result)
                : NotFound(new { Message = $"No Hotels were found." }));
        }
        public async Task <List <HotelAvailability> > SearchHotelAvailability(SearchHotelAvailabilityQuery hotelAvailabilityRequest)
        {
            var client   = _elasticSearchClient.CreateElasticClient(_elasticsearchConfig.Value.Url);
            var response = await client.SearchAsync <HotelAvailability>(har =>
                                                                        har.Index(_elasticsearchConfig.Value.HotelAvailabilityIndex)
                                                                        .Size(60)
                                                                        .Query(q => q
                                                                               .Bool(bq => bq
                                                                                     .Must(
                                                                                         fq => fq.Match(m => m.Field(f => f.Available).Query("true")),
                                                                                         fq => fq.Range(r => r.Field(f => f.Infants).GreaterThanOrEquals(hotelAvailabilityRequest.Infants)),
                                                                                         fq => fq.Range(r => r.Field(f => f.Children).GreaterThanOrEquals(hotelAvailabilityRequest.Children)),
                                                                                         fq => fq.Range(r => r.Field(f => f.Adults).GreaterThanOrEquals(hotelAvailabilityRequest.Adults)),
                                                                                         fq => fq.Match(m => m.Field(f => f.StayDate).Query(hotelAvailabilityRequest.StayDate.ToString("yyyy'-'MM'-'dd"))),
                                                                                         fq => fq.MatchPhrase(mp => mp.Field(f => f.Region).Query(hotelAvailabilityRequest.Region)),
                                                                                         fq => fq.MatchPhrase(mp => mp.Field(f => f.Country).Query(hotelAvailabilityRequest.Country)),
                                                                                         fq => fq.MatchPhrase(mp => mp.Field(f => f.HotelName).Query(hotelAvailabilityRequest.HotelName)),
                                                                                         fq => fq.Range(r => r.Field(f => f.NetPrice).LessThanOrEquals(hotelAvailabilityRequest.NetPrice))
                                                                                         )
                                                                                     )
                                                                               )
                                                                        );

            return(response.Documents?.Select(d => new HotelAvailability
            {
                Adults = d.Adults,
                AirportCode = d.AirportCode,
                Children = d.Children,
                Country = d.Country,
                CurrencyCode = d.CurrencyCode,
                EndDate = d.EndDate,
                HotelId = d.HotelId,
                HotelName = d.HotelName,
                Id = d.Id,
                Infants = d.Infants,
                Meal = d.Meal,
                NetPrice = d.NetPrice,
                Region = d.Region,
                Room = d.Room,
                StayDate = d.StayDate,
                Available = d.Available
            }).ToList());
        }