< Summary

Information
Class: OzonOrdersWeb.WebServices.SystemAlerts.SystemAlertLinks
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/SystemAlerts/SystemAlertLinks.cs
Line coverage
94%
Covered lines: 18
Uncovered lines: 1
Coverable lines: 19
Total lines: 62
Line coverage: 94.7%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Orders(...)100%22100%
ApiAuditFailures(...)100%11100%
ApiAuditEntry(...)100%210%
BitrixSyncReportFailures(...)100%11100%

File(s)

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

#LineLine coverage
 1using System.Text;
 2using System.Text.Json;
 3
 4namespace OzonOrdersWeb.WebServices.SystemAlerts;
 5
 6/// <summary>
 7/// Ссылки из алертов на «оригинальные» страницы с уже применённым фильтром: сетка заказов с нужными заказами,
 8/// аудит API поставщика с нужным поставщиком и ошибками, журнал 1С только с ошибками, дашборд Hangfire.
 9/// </summary>
 10public static class SystemAlertLinks
 11{
 12    /// <summary>
 13    /// Сколько заказов кладём в ссылку. Адрес хранится в <c>SystemAlertIncident.Url</c> (до 2000 символов),
 14    /// а base64 от списка идентификаторов раздувает его примерно на треть.
 15    /// </summary>
 16    public const int MaxOrdersInLink = 150;
 17
 18    /// <summary>Сетка заказов, ограниченная этими заказами (вид «только выбранные», параметр <c>?v=</c> — тот же формат
 19    public static string Orders(IEnumerable<int> orderIds)
 20    {
 150721        var ids = orderIds.Distinct().OrderByDescending(x => x).Take(MaxOrdersInLink).ToList();
 5022        if (ids.Count == 0) return "/Studio2/OrdersGrid";
 4823        var json = JsonSerializer.Serialize(new { i = ids });
 4824        return "/Studio2/OrdersGrid?v=" + Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+',
 25    }
 26
 27    /// <summary>Аудит API поставщика: только ошибки указанного поставщика.</summary>
 28    public static string ApiAuditFailures(string providerKey) =>
 229        $"/Studio2/ApiSupplierRequestAudit?provider={Uri.EscapeDataString(providerKey)}&success=false";
 30
 31    /// <summary>Аудит API поставщика: конкретная запись.</summary>
 032    public static string ApiAuditEntry(long id) => $"/Studio2/ApiSupplierRequestAudit?highlightId={id}";
 33
 34    /// <summary>
 35    /// Отчёт наката BitrixStock (<c>?report=</c>) с готовым видом грида (<c>?gv=</c>, base64url JSON): только строки
 36    /// с отказом Ozon, у которых текст ошибки содержит <paramref name="errorContains"/>, крупные по остатку 1С — выше,
 37    /// колонка «Ошибка Ozon» показана.
 38    /// </summary>
 39    public static string BitrixSyncReportFailures(string reportId, string errorContains)
 40    {
 441        var view = new
 442        {
 443            f = new Dictionary<string, object>
 444            {
 445                ["ozonApplyStatus"] = new { filterType = "set", values = new[] { "Failed" } },
 446                ["ozonApplyError"] = new { filterType = "text", type = "contains", filter = errorContains }
 447            },
 448            s = new[] { new { colId = "oneCQty", sort = "desc" } },
 449            c = new[] { "ozonApplyError" }
 450        };
 451        var json = JsonSerializer.Serialize(view, new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaSc
 452        var gv = Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+', '-').Replace('/', '_');
 453        return $"/Studio2/BitrixStock?tab=sync&report={Uri.EscapeDataString(reportId)}&gv={gv}";
 54    }
 55
 56    /// <summary>Журнал проведений 1С: только неуспешные.</summary>
 57    public const string OneCPostingFailures = "/Studio2/JobLogs?tab=onec&failed=1";
 58
 59    public const string HangfireRecurring = "/Hangfire/recurring";
 60    public const string HangfireServers = "/Hangfire/servers";
 61    public const string OneCStock = "/Studio2/OneCStock";
 62}