< Summary

Information
Class: c:\Source 2025\CurrencyConverter\CurrencyConverter\src\Application\Currencies\SearchCurrency\SearchCurrencyHandler.cs
Assembly: Default
File(s): c:\Source 2025\CurrencyConverter\CurrencyConverter\src\Application\Currencies\SearchCurrency\SearchCurrencyHandler.cs
Line coverage
100%
Covered lines: 37
Uncovered lines: 0
Coverable lines: 37
Total lines: 59
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

File(s)

c:\Source 2025\CurrencyConverter\CurrencyConverter\src\Application\Currencies\SearchCurrency\SearchCurrencyHandler.cs

#LineLine coverage
 1using Application.Abstractions;
 2using Application.Currencies.SearchCurrency.Dtos;
 3using Domain.Common;
 4using Domain.Currencies;
 5using MediatR;
 6using Microsoft.Extensions.Logging;
 7
 8namespace Application.Currencies.SearchCurrency
 9{
 10    public class SearchCurrencyHandler : IRequestHandler<SearchCurrencyQuery, Result<SearchCurrencyDto>>
 11    {
 12        private readonly IExchangeProviderFactory _exchangeFactory;
 13        private readonly ILogger<SearchCurrencyHandler> _logger;
 14        private readonly ICacheService _cacheService;
 15
 1016        public SearchCurrencyHandler(IExchangeProviderFactory exchangeFactory,
 1017            ILogger<SearchCurrencyHandler> logger,
 1018            ICacheService cacheService)
 1019        {
 1020            _cacheService = cacheService;
 1021            _exchangeFactory = exchangeFactory;
 1022            _logger = logger;
 1023        }
 24
 25        public async Task<Result<SearchCurrencyDto>> Handle(SearchCurrencyQuery command, CancellationToken cancellationT
 1026        {
 1027            var currencyCodeResult = CurrencyCode.FromCode(command.CurrencyCode);
 1028            if (currencyCodeResult.IsFailure)
 129            {
 130                return Result.Failure<SearchCurrencyDto>(currencyCodeResult.Error);
 31            }
 932            var currencyCode = currencyCodeResult.Value;
 933            var exchangeProvider = _exchangeFactory.GetProvider(ExchangeProviderType.Frankfurter);
 934            if (exchangeProvider == null)
 135            {
 136                _logger.LogError("Could not find an exchange provider, {requestedProvider}", ExchangeProviderType.Frankf
 137                return Result.Failure<SearchCurrencyDto>(Error.SystemError);
 38            }
 839            var cacheKey = $"search-{currencyCode.Value}";
 840            var currencySnapShot = await _cacheService.GetAsync<List<CurrencySnapshot>>(cacheKey, cancellationToken);
 841            if (currencySnapShot == null)
 642            {
 643                var result = await exchangeProvider.SearchAsync(currencyCode, command.StartDate, command.EndDate);
 644                if (result.IsFailure)
 145                {
 146                    return Result.Failure<SearchCurrencyDto>(result.Error);
 47                }
 548                currencySnapShot = result.Value;
 549                await _cacheService.SetAsync(cacheKey, currencySnapShot, cancellationToken);
 550            }
 751            return new SearchCurrencyDto(currencyCode.Value,
 752                currencySnapShot.Select(x =>
 1353                    new SearchCurrencyDateCapturedDto(x.DateCaptured,
 2654                    x.ExchangeRates.Select(y => new SearchCurrencyAmountDto(y.Code.Value, y.Amount))
 1355                    .ToList()))
 756                .ToList());
 1057        }
 58    }
 59}