< Summary

Information
Class: OzonOrdersWeb.WebServices.SystemAlerts.StoredOrderRef
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/SystemAlerts/SystemAlertOrderIndex.cs
Line coverage
100%
Covered lines: 4
Uncovered lines: 0
Coverable lines: 4
Total lines: 48
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_Id()100%11100%
get_Reason()100%11100%
get_Severity()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/SystemAlerts/SystemAlertOrderIndex.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Serialization;
 3
 4namespace OzonOrdersWeb.WebServices.SystemAlerts;
 5
 6/// <summary>Алерт, затрагивающий заказ: попадает в подсказку значка на сетках заказов.</summary>
 7public sealed record OrderAlertEntry(string Key, string Severity, string Domain, string Title, string Reason);
 8
 9/// <summary>Заказ и причина в сохранённом JSON инцидента (<c>SystemAlertIncident.OrdersJson</c>), его читает и вкладка 
 45610public sealed record StoredOrderRef(
 30611    [property: JsonPropertyName("id")] int Id,
 30612    [property: JsonPropertyName("reason")] string Reason,
 76213    [property: JsonPropertyName("s")] string? Severity = null);
 14
 15/// <summary>
 16/// Живой индекс «заказ → активные алерты». Пересобирается при каждой проверке алертов целиком (замена словаря),
 17/// читается сетками заказов без SQL: поиск по идентификаторам страницы.
 18/// </summary>
 19public sealed class SystemAlertOrderIndex
 20{
 21    private static readonly IReadOnlyList<OrderAlertEntry> Empty = [];
 22    private volatile Dictionary<int, OrderAlertEntry[]>? _map;
 23
 24    /// <summary>false — индекс ещё не строился (после рестарта): его достраивают из сохранённых инцидентов.</summary>
 25    public bool IsLoaded => _map != null;
 26
 27    public void Replace(IEnumerable<(OrderAlertEntry Entry, int OrderId)> items) =>
 28        _map = items.GroupBy(x => x.OrderId).ToDictionary(g => g.Key, g => g.Select(x => x.Entry).ToArray());
 29
 30    public IReadOnlyList<OrderAlertEntry> Get(int orderId) =>
 31        _map != null && _map.TryGetValue(orderId, out var entries) ? entries : Empty;
 32
 33    public static string Serialize(IEnumerable<SystemAlertOrderRef> orders, int limit) =>
 34        JsonSerializer.Serialize(orders.Take(limit).Select(x => new StoredOrderRef(x.OrderId, x.Reason, x.Severity)));
 35
 36    public static IReadOnlyList<StoredOrderRef> Deserialize(string? json)
 37    {
 38        if (string.IsNullOrWhiteSpace(json)) return [];
 39        try
 40        {
 41            return JsonSerializer.Deserialize<List<StoredOrderRef>>(json) ?? [];
 42        }
 43        catch (JsonException)
 44        {
 45            return [];
 46        }
 47    }
 48}