< Summary

Information
Class: Chronicis.Client.Services.BreadcrumbService
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/BreadcrumbService.cs
Line coverage
100%
Covered lines: 56
Uncovered lines: 0
Coverable lines: 56
Total lines: 119
Line coverage: 100%
Branch coverage
100%
Covered branches: 31
Total branches: 31
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ForWorld(...)100%22100%
ForCampaign(...)100%22100%
ForArc(...)100%22100%
ForArticle(...)100%66100%
BuildWikiArticleBreadcrumbs(...)100%1010100%
BuildSessionNoteBreadcrumbs(...)100%99100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/BreadcrumbService.cs

#LineLine coverage
 1using Chronicis.Client.Services.Routing;
 2using Chronicis.Shared.DTOs;
 3using Chronicis.Shared.Enums;
 4using MudBlazor;
 5
 6namespace Chronicis.Client.Services;
 7
 8public interface IBreadcrumbService
 9{
 10    List<BreadcrumbItem> ForWorld(WorldDto world, bool currentDisabled = true);
 11    List<BreadcrumbItem> ForCampaign(CampaignDto campaign, WorldDto world, bool currentDisabled = true);
 12    List<BreadcrumbItem> ForArc(ArcDto arc, CampaignDto campaign, WorldDto world, bool currentDisabled = true);
 13    List<BreadcrumbItem> ForArticle(ArticleDto article);
 14}
 15
 16public class BreadcrumbService : IBreadcrumbService
 17{
 18    private readonly IAppUrlBuilder _urlBuilder;
 19
 20    public BreadcrumbService(IAppUrlBuilder urlBuilder)
 21    {
 1722        _urlBuilder = urlBuilder;
 1723    }
 24
 25    public List<BreadcrumbItem> ForWorld(WorldDto world, bool currentDisabled = true)
 26    {
 327        return new List<BreadcrumbItem>
 328        {
 329            new("Dashboard", href: "/dashboard"),
 330            new(world.Name, href: currentDisabled ? null : _urlBuilder.ForWorld(world.Slug), disabled: currentDisabled)
 331        };
 32    }
 33
 34    public List<BreadcrumbItem> ForCampaign(CampaignDto campaign, WorldDto world, bool currentDisabled = true)
 35    {
 336        return new List<BreadcrumbItem>
 337        {
 338            new("Dashboard", href: "/dashboard"),
 339            new(world.Name, href: _urlBuilder.ForWorld(world.Slug)),
 340            new(campaign.Name, href: currentDisabled ? null : _urlBuilder.ForCampaign(world.Slug, campaign.Slug), disabl
 341        };
 42    }
 43
 44    public List<BreadcrumbItem> ForArc(ArcDto arc, CampaignDto campaign, WorldDto world, bool currentDisabled = true)
 45    {
 346        return new List<BreadcrumbItem>
 347        {
 348            new("Dashboard", href: "/dashboard"),
 349            new(world.Name, href: _urlBuilder.ForWorld(world.Slug)),
 350            new(campaign.Name, href: _urlBuilder.ForCampaign(world.Slug, campaign.Slug)),
 351            new(arc.Name, href: currentDisabled ? null : _urlBuilder.ForArc(world.Slug, campaign.Slug, arc.Slug), disabl
 352        };
 53    }
 54
 55    public List<BreadcrumbItem> ForArticle(ArticleDto article)
 56    {
 857        var result = new List<BreadcrumbItem>
 858        {
 859            new("Dashboard", href: "/dashboard")
 860        };
 61
 862        var breadcrumbs = article.Breadcrumbs;
 863        if (breadcrumbs == null || breadcrumbs.Count == 0)
 264            return result;
 65
 666        return article.Type == ArticleType.SessionNote
 667            ? BuildSessionNoteBreadcrumbs(result, breadcrumbs)
 668            : BuildWikiArticleBreadcrumbs(result, breadcrumbs);
 69    }
 70
 71    private List<BreadcrumbItem> BuildWikiArticleBreadcrumbs(List<BreadcrumbItem> result, List<BreadcrumbDto> breadcrumb
 72    {
 473        var worldSlug = breadcrumbs.FirstOrDefault(b => b.IsWorld)?.Slug ?? string.Empty;
 474        var nonWorldSlugs = breadcrumbs.Where(b => !b.IsWorld).Select(b => b.Slug).ToList();
 75
 2276        for (int i = 0; i < breadcrumbs.Count; i++)
 77        {
 778            var crumb = breadcrumbs[i];
 779            var isLast = i == breadcrumbs.Count - 1;
 80
 781            string? href = null;
 782            if (!isLast)
 83            {
 384                if (crumb.IsWorld)
 285                    href = _urlBuilder.ForWorld(crumb.Slug);
 86                else
 87                {
 188                    var nonWorldIndex = breadcrumbs.Take(i + 1).Count(b => !b.IsWorld);
 189                    href = _urlBuilder.ForWikiArticle(worldSlug, nonWorldSlugs.Take(nonWorldIndex).ToList());
 90                }
 91            }
 92
 793            result.Add(new BreadcrumbItem(crumb.Title, href: href, disabled: isLast));
 94        }
 495        return result;
 96    }
 97
 98    private List<BreadcrumbItem> BuildSessionNoteBreadcrumbs(List<BreadcrumbItem> result, List<BreadcrumbDto> breadcrumb
 99    {
 100        // [0]=World, [1]=Campaign, [2]=Arc, [3]=Session, [4]=Note
 26101        for (int i = 0; i < breadcrumbs.Count; i++)
 102        {
 11103            var crumb = breadcrumbs[i];
 11104            var isLast = i == breadcrumbs.Count - 1;
 105
 11106            string? href = isLast ? null : i switch
 11107            {
 2108                0 => _urlBuilder.ForWorld(crumb.Slug),
 2109                1 => _urlBuilder.ForCampaign(breadcrumbs[0].Slug, crumb.Slug),
 2110                2 => _urlBuilder.ForArc(breadcrumbs[0].Slug, breadcrumbs[1].Slug, crumb.Slug),
 2111                3 => _urlBuilder.ForSession(breadcrumbs[0].Slug, breadcrumbs[1].Slug, breadcrumbs[2].Slug, crumb.Slug),
 1112                _ => null
 11113            };
 114
 11115            result.Add(new BreadcrumbItem(crumb.Title, href: href, disabled: isLast));
 116        }
 2117        return result;
 118    }
 119}