Exemplo n.º 1
0
        public async Task <GeoDistance> CalculateDistanceAsync(string departureIATACode, string destinationIATACode, CancellationToken cancellationToken)
        {
            // Special case if the departure airport is equal to the destination airport
            // in this place don't IATA code exists
            if (string.Equals(departureIATACode, destinationIATACode,
                              StringComparison.OrdinalIgnoreCase))
            {
                return(new GeoDistance(0.0));
            }

            double?savedGeoDistance = null;

            try
            {
                savedGeoDistance = await _distancesRepository.GetDistanceAsync(departureIATACode, destinationIATACode, cancellationToken);
            }
            catch (Exception ex)
            {
                _logger.LogError("Error requesting data from the database: {@ex}", ex);
            }

            if (savedGeoDistance != null)
            {
                return(new GeoDistance(savedGeoDistance.Value));
            }

            var geoDistance = await _calculatorService.CalculateDistanceAsync(departureIATACode, destinationIATACode, cancellationToken);

            _backgroundTaskProvider.AddBackgroundTask(c => _distancesRepository.AddDistanceAsync(departureIATACode, destinationIATACode, geoDistance.Miles, c));

            return(geoDistance);
        }
        public async Task <IActionResult> GetDistancesAsync([FromQuery(Name = "from"), IATACodeValidation,
                                                             Required(AllowEmptyStrings = false)]
                                                            string departureAirportIATACode,
                                                            [FromQuery(Name = "to"),
                                                             Required(AllowEmptyStrings = false),
                                                             IATACodeValidation]
                                                            string destinationAirportIATACode,
                                                            CancellationToken cancellationToken)
        {
            var result = await _distanceCalculatorService.CalculateDistanceAsync(departureAirportIATACode, destinationAirportIATACode, cancellationToken);

            return(Ok(_mapper.Map <GeoDistanceResponse>(result)));
        }
Exemplo n.º 3
0
        public async Task <GeoDistance> CalculateDistanceAsync(string departureIATACode, string destinationIATACode, CancellationToken cancellationToken = default)
        {
            var naturalId = GenerateNaturalId(departureIATACode, destinationIATACode);

            if (_memoryCache.TryGetValue <GeoDistance>(naturalId, out var geoDistance))
            {
                return(geoDistance);
            }

            geoDistance = await _calculatorService.CalculateDistanceAsync(departureIATACode, destinationIATACode, cancellationToken);

            _memoryCache.Set(naturalId, geoDistance, _memoryCacheGeoDistanceEntryOptions);

            return(geoDistance);
        }