< Summary

Information
Class: OzonOrdersWeb.WebServices.Orders.Grid.OrdersGridComputedResolver
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridComputedResolver.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 23
Coverable lines: 23
Total lines: 51
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 28
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
ResolveAsync()0%7280%
ParseFormulas(...)0%420200%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Orders/Grid/OrdersGridComputedResolver.cs

#LineLine coverage
 1using System.Text.Json;
 2
 3namespace OzonOrdersWeb.WebServices.Orders.Grid;
 4
 5public interface IOrdersGridComputedResolver
 6{
 7    /// <summary>Перевод формулы вычисляемого столбца пользователя в SQL-выражение; null — столбца нет или он непереводи
 8    Task<OrdersGridFormulaTranslator.Translation?> ResolveAsync(string userId, string colId, CancellationToken cancellat
 9}
 10
 11/// <summary>Читает computedColumns пользователя один раз на запрос и переводит нужные формулы (с кэшем на время запроса
 012public sealed class OrdersGridComputedResolver(IOrdersGridUserSettingsService settings) : IOrdersGridComputedResolver
 13{
 14    private Dictionary<string, string>? _formulas;
 015    private readonly Dictionary<string, OrdersGridFormulaTranslator.Translation?> _cache = new(StringComparer.OrdinalIgn
 16
 17    public async Task<OrdersGridFormulaTranslator.Translation?> ResolveAsync(string userId, string colId, CancellationTo
 18    {
 019        if (_cache.TryGetValue(colId, out var cached)) return cached;
 020        _formulas ??= ParseFormulas((await settings.GetAllAsync(userId, cancellationToken)).GetValueOrDefault("computedC
 021        OrdersGridFormulaTranslator.Translation? result = null;
 022        if (_formulas.TryGetValue(colId, out var formula) && OrdersGridFormulaTranslator.TryTranslate(formula, out var t
 23        {
 024            result = t;
 25        }
 26
 027        _cache[colId] = result;
 028        return result;
 029    }
 30
 31    /// <summary>id столбца → формула из JSON настройки.</summary>
 32    public static Dictionary<string, string> ParseFormulas(string? json)
 33    {
 034        var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
 035        if (string.IsNullOrWhiteSpace(json)) return map;
 36        try
 37        {
 038            using var doc = JsonDocument.Parse(json);
 039            if (doc.RootElement.ValueKind != JsonValueKind.Array) return map;
 040            foreach (var item in doc.RootElement.EnumerateArray())
 41            {
 042                if (item.ValueKind != JsonValueKind.Object) continue;
 043                var id = item.TryGetProperty("id", out var i) && i.ValueKind == JsonValueKind.String ? i.GetString() : n
 044                var formula = item.TryGetProperty("formula", out var f) && f.ValueKind == JsonValueKind.String ? f.GetSt
 045                if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(formula)) map[id] = formula;
 46            }
 047        }
 048        catch (JsonException) { /* битые настройки — без формул */ }
 049        return map;
 050    }
 51}