< Summary

Information
Class: OzonOrdersWeb.WebServices.Transactions.Grid.Definitions.TransactionDefinitionProvider
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Definitions/TransactionDefinitionProvider.cs
Line coverage
97%
Covered lines: 39
Uncovered lines: 1
Coverable lines: 40
Total lines: 88
Line coverage: 97.5%
Branch coverage
85%
Covered branches: 17
Total branches: 20
Branch coverage: 85%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
GetAllAsync()50%22100%
<GetAllAsync()100%22100%
GetBySlugAsync()50%2275%
GetByTypeAsync()100%11100%
Invalidate()100%11100%
Apply(...)92.85%1414100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Transactions/Grid/Definitions/TransactionDefinitionProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Caching.Memory;
 2using OzonDomains;
 3using OzonDomains.Models;
 4using Services.DataServices;
 5
 6namespace OzonOrdersWeb.WebServices.Transactions.Grid.Definitions;
 7
 8public interface ITransactionDefinitionProvider
 9{
 10    /// <summary>Все определения с наложенными настройками админки, в порядке группа → DisplayOrder.</summary>
 11    Task<IReadOnlyList<TransactionDefinition>> GetAllAsync(CancellationToken cancellationToken = default);
 12
 13    Task<TransactionDefinition?> GetBySlugAsync(string? slug, CancellationToken cancellationToken = default);
 14
 15    Task<TransactionDefinition?> GetByTypeAsync(TransactionType type, CancellationToken cancellationToken = default);
 16
 17    /// <summary>Сбросить кэш после сохранения в админке.</summary>
 18    void Invalidate();
 19}
 20
 21/// <summary>
 22/// Каталог определений ⊕ <see cref="TransactionTypeSetting"/> из БД. Кэш — 2 минуты, как у правил переходов,
 23/// чтобы редко открываемые меню не ходили в БД на каждый рендер.
 24/// </summary>
 25public sealed class TransactionDefinitionProvider : ITransactionDefinitionProvider
 26{
 27    private const string CacheKey = "TransactionDefinitions";
 128    private static readonly TimeSpan CacheSlidingExpiration = TimeSpan.FromMinutes(2);
 29
 30    private readonly ITransactionTypeSettingDataServices _settings;
 31    private readonly IMemoryCache _cache;
 32
 433    public TransactionDefinitionProvider(ITransactionTypeSettingDataServices settings, IMemoryCache cache)
 34    {
 435        _settings = settings;
 436        _cache = cache;
 437    }
 38
 39    public async Task<IReadOnlyList<TransactionDefinition>> GetAllAsync(CancellationToken cancellationToken = default)
 40    {
 841        var result = await _cache.GetOrCreateAsync(CacheKey, async entry =>
 842        {
 543            entry.SlidingExpiration = CacheSlidingExpiration;
 1144            var overrides = (await _settings.GetAllAsync(cancellationToken)).ToDictionary(s => s.TransactionType);
 545            return (IReadOnlyList<TransactionDefinition>)TransactionDefinitionCatalog.All
 8546                .Select(d => overrides.TryGetValue(d.Type, out var s) ? Apply(d, s) : d)
 8547                .OrderBy(d => d.Group, StringComparer.CurrentCultureIgnoreCase)
 8548                .ThenBy(d => d.DisplayOrder)
 8549                .ThenBy(d => d.Title, StringComparer.CurrentCultureIgnoreCase)
 550                .ToList();
 1351        });
 852        return result ?? Array.Empty<TransactionDefinition>();
 853    }
 54
 55    public async Task<TransactionDefinition?> GetBySlugAsync(string? slug, CancellationToken cancellationToken = default
 56    {
 457        if (string.IsNullOrWhiteSpace(slug))
 58        {
 059            return null;
 60        }
 61
 462        var all = await GetAllAsync(cancellationToken);
 4863        return all.FirstOrDefault(d => string.Equals(d.Slug, slug, StringComparison.OrdinalIgnoreCase));
 464    }
 65
 66    public async Task<TransactionDefinition?> GetByTypeAsync(TransactionType type, CancellationToken cancellationToken =
 67    {
 368        var all = await GetAllAsync(cancellationToken);
 4269        return all.FirstOrDefault(d => d.Type == type);
 370    }
 71
 172    public void Invalidate() => _cache.Remove(CacheKey);
 73
 74    /// <summary>Пустые поля настройки не затирают дефолт каталога — админ переопределяет только то, что заполнил.</summ
 675    public static TransactionDefinition Apply(TransactionDefinition d, TransactionTypeSetting s) => d with
 676    {
 677        Title = s.Title ?? d.Title,
 678        ShortName = s.ShortName ?? d.ShortName,
 679        Icon = s.Icon ?? d.Icon,
 680        Color = s.Color ?? d.Color,
 681        Group = s.Group ?? d.Group,
 682        Hint = s.Hint ?? d.Hint,
 683        DisplayOrder = s.DisplayOrder ?? d.DisplayOrder,
 684        UseGrid = s.UseGrid,
 685        IsEnabled = s.IsEnabled,
 686        DefaultsJson = s.DefaultsJson
 687    };
 88}