< Summary

Line coverage
57%
Covered lines: 20
Uncovered lines: 15
Coverable lines: 35
Total lines: 413
Line coverage: 57.1%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: .cctor()100%210%
File 2: .ctor(...)100%11100%
File 2: ExecuteAsync()0%2040%
File 2: CrawlAllAsync()100%44100%
File 2: CrawlAsync()100%11100%

File(s)

/home/runner/work/anichron/anichron/src/.artifacts/obj/Anichron.Worker/debug/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs

File '/home/runner/work/anichron/anichron/src/.artifacts/obj/Anichron.Worker/debug/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs' does not exist (any more).

/home/runner/work/anichron/anichron/src/Anichron.Worker/Crawling/Worker.cs

#LineLine coverage
 1using Anichron.Core.Data.Repository;
 2using Anichron.Core.Domain;
 3using Anichron.Worker.Settings;
 4using Microsoft.Extensions.Options;
 5
 6namespace Anichron.Worker.Crawling;
 7
 58internal sealed partial class Worker(
 59    IServiceScopeFactory scopeFactory,
 510    WorkerState workerState,
 511    IFileIngestionPipeline ingestionPipeline,
 512    IOptions<WorkerSettings> options,
 513    ILogger<Worker> logger) : BackgroundService
 14{
 515    private readonly WorkerSettings settings = options.Value;
 16
 17    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 018    {
 019        var mode = workerState.ResolvedUserId is { } userId
 020            ? $"dedicated (userId={userId})"
 021            : "all-user";
 022        Log.Starting(logger, mode);
 23
 024        while (!stoppingToken.IsCancellationRequested)
 025        {
 026            await CrawlAllAsync(stoppingToken);
 027            await Task.Delay(TimeSpan.FromHours(settings.CrawlIntervalHours), stoppingToken);
 028        }
 029    }
 30
 31    internal async Task CrawlAllAsync(CancellationToken ct)
 532    {
 533        using var scope = scopeFactory.CreateScope();
 534        var repository = scope.ServiceProvider.GetRequiredService<IUserStorageConfigRepository>();
 35
 536        var configs = workerState.ResolvedUserId is { } userId
 537            ? await repository.GetActiveByUserIdAsync(userId, ct)
 538            : await repository.GetAllActiveAsync(ct);
 39
 2140        foreach (var config in configs)
 341            await CrawlAsync(config, ct);
 542    }
 43
 44    private async Task CrawlAsync(UserStorageConfig config, CancellationToken ct)
 345    {
 346        Log.CrawlingPath(logger, config.RootPath, config.UserId);
 347        await ingestionPipeline.RunAsync(config, ct);
 348    }
 49
 50    private static partial class Log
 51    {
 52        [LoggerMessage(Level = LogLevel.Information, Message = "Worker starting in {Mode} mode.")]
 53        public static partial void Starting(ILogger logger, string mode);
 54
 55        [LoggerMessage(Level = LogLevel.Information, Message = "Crawling {RootPath} (userId={UserId}).")]
 56        public static partial void CrawlingPath(ILogger logger, string rootPath, Guid userId);
 57    }
 58}