< Summary

Information
Class: Chronicis.Api.Services.ReadAccessPolicyService
Assembly: Chronicis.Api
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ReadAccessPolicyService.cs
Line coverage
100%
Covered lines: 23
Uncovered lines: 0
Coverable lines: 23
Total lines: 74
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

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Api/Services/ReadAccessPolicyService.cs

#LineLine coverage
 1using Chronicis.Shared.Enums;
 2using Chronicis.Shared.Models;
 3
 4namespace Chronicis.Api.Services;
 5
 6public sealed class ReadAccessPolicyService : IReadAccessPolicyService
 7{
 8    public string NormalizePublicSlug(string publicSlug)
 9    {
 4210        return publicSlug.Trim().ToLowerInvariant();
 11    }
 12
 13    public IQueryable<World> ApplyPublicWorldFilter(IQueryable<World> worlds)
 14    {
 2415        return worlds.Where(w => w.IsPublic);
 16    }
 17
 18    public IQueryable<World> ApplyPublicWorldSlugFilter(IQueryable<World> worlds, string publicSlug)
 19    {
 2120        var normalizedSlug = NormalizePublicSlug(publicSlug);
 2121        return ApplyPublicWorldFilter(worlds)
 2122            .Where(w => w.PublicSlug == normalizedSlug);
 23    }
 24
 25    public IQueryable<World> ApplyAuthenticatedWorldFilter(IQueryable<World> worlds, Guid userId)
 26    {
 1027        return worlds.Where(w => w.Members.Any(m => m.UserId == userId));
 28    }
 29
 30    public IQueryable<Article> ApplyPublicVisibilityFilter(IQueryable<Article> articles)
 31    {
 2332        return articles.Where(a => a.Visibility == ArticleVisibility.Public);
 33    }
 34
 35    public IQueryable<Article> ApplyPublicArticleFilter(IQueryable<Article> articles, Guid worldId)
 36    {
 2037        return ApplyPublicVisibilityFilter(articles)
 2038            .Where(a => a.WorldId == worldId);
 39    }
 40
 41    public IQueryable<Article> ApplyTutorialArticleFilter(IQueryable<Article> articles)
 42    {
 2443        return articles.Where(a => a.Type == ArticleType.Tutorial && a.WorldId == Guid.Empty);
 44    }
 45
 46    public IQueryable<Article> ApplyAuthenticatedWorldArticleFilter(IQueryable<Article> articles, Guid userId)
 47    {
 7148        return articles
 7149            .Where(a => a.Type != ArticleType.Tutorial && a.WorldId != Guid.Empty)
 7150            .Where(a => a.World != null && a.World.Members.Any(m => m.UserId == userId))
 7151            .Where(a => a.Visibility != ArticleVisibility.Private || a.CreatedBy == userId);
 52    }
 53
 54    public IQueryable<Article> ApplyAuthenticatedReadableArticleFilter(IQueryable<Article> articles, Guid userId)
 55    {
 2256        var worldScoped = ApplyAuthenticatedWorldArticleFilter(articles, userId);
 2257        var tutorials = ApplyTutorialArticleFilter(articles);
 2258        return worldScoped.Concat(tutorials);
 59    }
 60
 61    public IQueryable<Campaign> ApplyAuthenticatedCampaignFilter(IQueryable<Campaign> campaigns, Guid userId)
 62    {
 363        return campaigns
 364            .Where(c => c.World != null && c.World.Members.Any(m => m.UserId == userId));
 65    }
 66
 67    public IQueryable<Arc> ApplyAuthenticatedArcFilter(IQueryable<Arc> arcs, Guid userId)
 68    {
 369        return arcs
 370            .Where(a => a.Campaign != null
 371                        && a.Campaign.World != null
 372                        && a.Campaign.World.Members.Any(m => m.UserId == userId));
 73    }
 74}