< Summary

Information
Class: OzonOrdersWeb.WebServices.Partners.PartnerGridRow
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Partners/PartnerGridRows.cs
Line coverage
41%
Covered lines: 5
Uncovered lines: 7
Coverable lines: 12
Total lines: 71
Line coverage: 41.6%
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%210%
get_Name()100%210%
get_Email()100%210%
get_GoogleEmail()100%210%
get_IsActive()100%210%
get_LastLoginAtUtc()100%210%
get_RulesCount()100%210%
get_LabelPrint()100%11100%
get_Assemble()100%11100%
get_TrackNumber()100%11100%
get_PermissionsText()100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Partners/PartnerGridRows.cs

#LineLine coverage
 1using OzonDomains.Models.Partners;
 2using Services.PartnerServices;
 3
 4namespace OzonOrdersWeb.WebServices.Partners;
 5
 6/// <summary>Строка грида партнёров. Всё, что раньше считалось во вьюхе, посчитано здесь, чтобы по нему работали фильтры
 27public sealed record PartnerGridRow(
 08    long Id,
 09    string Name,
 010    string? Email,
 011    string? GoogleEmail,
 012    bool IsActive,
 013    DateTime? LastLoginAtUtc,
 014    int RulesCount,
 215    bool LabelPrint,
 116    bool Assemble,
 117    bool TrackNumber,
 418    string PermissionsText);
 19
 20/// <summary>Строки грида журнала партнёров: имя партнёра подставлено сервером, удалённый партнёр помечен.</summary>
 21public sealed record PartnerAuditGridRow(
 22    long Id,
 23    DateTime OccurredAtUtc,
 24    long? PartnerId,
 25    string? PartnerName,
 26    string Actor,
 27    string ActorKind,
 28    string Action,
 29    string? OrderNumber,
 30    bool Success,
 31    string? Details,
 32    string? IpAddress);
 33
 34public static class PartnerGridRows
 35{
 36    public const string ViewOnlyText = "Только просмотр";
 37
 38    public static IReadOnlyList<PartnerGridRow> Build(IEnumerable<PartnerListItemDto> partners) =>
 39        partners.Select(p =>
 40        {
 41            var labels = p.Permissions.Select(PermissionTitle).ToList();
 42            return new PartnerGridRow(
 43                p.Id, p.Name, p.Email, p.GoogleEmail, p.IsActive, p.LastLoginAtUtc, p.RulesCount,
 44                p.Permissions.Contains(PartnerPermissionCode.LabelPrint),
 45                p.Permissions.Contains(PartnerPermissionCode.Assemble),
 46                p.Permissions.Contains(PartnerPermissionCode.TrackNumber),
 47                labels.Count == 0 ? ViewOnlyText : string.Join(", ", labels));
 48        }).ToList();
 49
 50    public static string PermissionTitle(PartnerPermissionCode code) => code switch
 51    {
 52        PartnerPermissionCode.LabelPrint => "Этикетки",
 53        PartnerPermissionCode.Assemble => "Сборка и отгрузка",
 54        PartnerPermissionCode.TrackNumber => "Трек-номер",
 55        _ => code.ToString()
 56    };
 57
 58    public static string ActorKindTitle(PartnerActorKind kind) => kind switch
 59    {
 60        PartnerActorKind.Owner => "Владелец",
 61        PartnerActorKind.Partner => "Партнёр",
 62        _ => "Система"
 63    };
 64
 65    public static IReadOnlyList<PartnerAuditGridRow> BuildAudit(
 66        IEnumerable<PartnerAuditLog> rows, IReadOnlyDictionary<long, string> partnerNames) =>
 67        rows.Select(r => new PartnerAuditGridRow(
 68            r.Id, r.OccurredAtUtc, r.PartnerId,
 69            r.PartnerId is { } id ? partnerNames.GetValueOrDefault(id, "(удалён)") : null,
 70            r.Actor, ActorKindTitle(r.ActorKind), r.Action, r.OrderNumber, r.Success, r.Details, r.IpAddress)).ToList();
 71}