< Summary

Information
Class: OzonOrdersWeb.WebServices.Admin.AdminGridRows
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Admin/AdminGridRows.cs
Line coverage
100%
Covered lines: 17
Uncovered lines: 0
Coverable lines: 17
Total lines: 55
Line coverage: 100%
Branch coverage
92%
Covered branches: 13
Total branches: 14
Branch coverage: 92.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Users(...)90%1010100%
Pages(...)100%11100%
Initials(...)100%44100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/WebServices/Admin/AdminGridRows.cs

#LineLine coverage
 1using OzonOrdersWeb.Areas.Admin.Models;
 2
 3namespace OzonOrdersWeb.WebServices.Admin;
 4
 5/// <summary>Строка грида пользователей /Admin/Users.</summary>
 6public sealed record AdminUserGridRow(
 7    string Id,
 8    string DisplayName,
 9    string? SecondaryName,
 10    string? Email,
 11    string? AvatarUrl,
 12    string Initials,
 13    IReadOnlyList<string> Roles,
 14    int OverrideCount,
 15    bool IsLocked,
 16    bool IsApproved,
 17    int AccessFailedCount);
 18
 19/// <summary>Строка грида реестра страниц /Admin/Pages: порядок дерева сохраняется как числовая колонка.</summary>
 20public sealed record AdminPageGridRow(
 21    int Id, int TreeOrder, int Depth, string DisplayName, string Code, string? Area, string Controller, string Action,
 22    bool IsMenuItem, bool IsActive);
 23
 24/// <summary>
 25/// Строки гридов раздела /Admin. Сюда переехала логика, которая жила в Razor списков: отображаемое имя и инициалы
 26/// пользователя, второй логин под Google-именем, признак «доступ одобрен» (email подтверждён и вход одобрен админом).
 27/// </summary>
 28public static class AdminGridRows
 29{
 30    public static IReadOnlyList<AdminUserGridRow> Users(IEnumerable<UserListItemVm> users) =>
 131        users.Select(u =>
 132        {
 333            var displayName = string.IsNullOrWhiteSpace(u.GoogleDisplayName) ? u.UserName : u.GoogleDisplayName!;
 334            var secondary = !string.IsNullOrWhiteSpace(u.GoogleDisplayName)
 335                            && !string.Equals(u.GoogleDisplayName, u.UserName, StringComparison.OrdinalIgnoreCase)
 336                ? u.UserName
 337                : null;
 338            return new AdminUserGridRow(
 339                u.Id, displayName, secondary, u.Email,
 340                string.IsNullOrWhiteSpace(u.GoogleAvatarUrl) ? null : u.GoogleAvatarUrl,
 341                Initials(displayName), u.RoleNames, u.OverrideCount, u.IsLocked,
 342                u.EmailConfirmed && u.IsAdminApproved, u.AccessFailedCount);
 143        }).ToList();
 44
 45    public static IReadOnlyList<AdminPageGridRow> Pages(IEnumerable<PageListItemVm> pages) =>
 346        pages.Select((p, i) => new AdminPageGridRow(p.Id, i, p.Depth, p.DisplayName, p.Code, p.Area, p.Controller, p.Act
 147            .ToList();
 48
 49    /// <summary>Две первые буквы имени — заглушка аватара.</summary>
 50    public static string Initials(string? name)
 51    {
 652        var source = string.IsNullOrWhiteSpace(name) ? "U" : name.Trim();
 653        return (source.Length >= 2 ? source[..2] : source).ToUpperInvariant();
 54    }
 55}