< Summary - Heimdall API

Information
Class: ArturRios.Heimdall.WebApi.Retention.AuditRetentionService
Assembly: ArturRios.Heimdall.WebApi
File(s): /home/runner/work/heimdall-api/heimdall-api/src/Presentation/ArturRios.Heimdall.WebApi/Retention/AuditRetentionService.cs
Line coverage
22%
Covered lines: 4
Uncovered lines: 14
Coverable lines: 18
Total lines: 46
Line coverage: 22.2%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage
66%
Covered methods: 2
Fully covered methods: 2
Total methods: 3
Method coverage: 66.6%
Full method coverage: 66.6%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_StartupDescription()100%11100%
RunAsync()0%7280%

File(s)

/home/runner/work/heimdall-api/heimdall-api/src/Presentation/ArturRios.Heimdall.WebApi/Retention/AuditRetentionService.cs

#LineLine coverage
 1using ArturRios.Heimdall.Command.Input;
 2using ArturRios.Heimdall.Command.Output;
 3using ArturRios.Heimdall.Shared.Retention;
 4using ArturRios.Mediator.Command;
 5
 6namespace ArturRios.Heimdall.WebApi.Retention;
 7
 8/// <summary>
 9///     Runs <see cref="PseudonymiseAuditActorsCommand" /> on an interval, so the audit trail stops
 10///     naming people, as actors or as targets, once it no longer needs to, and drops the tombstones of
 11///     hard-deleted identities once nothing names them (NFR-21).
 12/// </summary>
 13public class AuditRetentionService(
 14    IServiceScopeFactory scopeFactory,
 15    DataRetentionOptions retention,
 16    ILogger<AuditRetentionService> logger)
 89917    : ScheduledPassService(scopeFactory, retention.PurgeInterval, logger)
 18{
 19    protected override string StartupDescription =>
 89920        $"Audit attribution pseudonymisation scheduled every {retention.PurgeInterval}, clearing " +
 89921        $"attributions and person targets after {retention.AuditActorRetention} and immediately " +
 89922        "for erased identities";
 23
 24    protected override async Task<string?> RunAsync(IServiceProvider scope)
 25    {
 026        var mediator = scope.GetRequiredService<CommandMediator>();
 27
 028        var result = await mediator
 029            .ExecuteCommandAsync<PseudonymiseAuditActorsCommand, PseudonymiseAuditActorsCommandOutput>(
 030                new PseudonymiseAuditActorsCommand());
 31
 032        if (!result.Success)
 33        {
 034            return $"Audit attribution pseudonymisation failed: {string.Join("; ", result.Errors)}";
 35        }
 36
 037        var pseudonymised = result.Data!;
 38
 039        return pseudonymised.EntriesPseudonymised == 0 && pseudonymised.TargetsCleared == 0
 040               && pseudonymised.TombstonesRemoved == 0
 041            ? null
 042            : $"Cleared the actor attribution from {pseudonymised.EntriesPseudonymised} audit entries " +
 043              $"and the person target from {pseudonymised.TargetsCleared}, and removed " +
 044              $"{pseudonymised.TombstonesRemoved} tombstones of hard-deleted identities";
 045    }
 46}