sprints work
This commit is contained in:
@@ -21,13 +21,16 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
{
|
||||
private readonly ICanonicalAdvisoryService _canonicalService;
|
||||
private readonly ILogger<SbomAdvisoryMatcher> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
public SbomAdvisoryMatcher(
|
||||
ICanonicalAdvisoryService canonicalService,
|
||||
ILogger<SbomAdvisoryMatcher> logger)
|
||||
ILogger<SbomAdvisoryMatcher> logger,
|
||||
TimeProvider? timeProvider = null)
|
||||
{
|
||||
_canonicalService = canonicalService ?? throw new ArgumentNullException(nameof(canonicalService));
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -142,7 +145,7 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
Method = DetermineMatchMethod(purl),
|
||||
IsReachable = false,
|
||||
IsDeployed = false,
|
||||
MatchedAt = DateTimeOffset.UtcNow
|
||||
MatchedAt = _timeProvider.GetUtcNow()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -167,6 +170,7 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
var isReachable = reachabilityMap?.TryGetValue(purl, out var reachable) == true && reachable;
|
||||
var isDeployed = deploymentMap?.TryGetValue(purl, out var deployed) == true && deployed;
|
||||
var matchMethod = DetermineMatchMethod(purl);
|
||||
var matchedAt = _timeProvider.GetUtcNow();
|
||||
|
||||
return advisories.Select(advisory => new SbomAdvisoryMatch
|
||||
{
|
||||
@@ -178,7 +182,7 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
Method = matchMethod,
|
||||
IsReachable = isReachable,
|
||||
IsDeployed = isDeployed,
|
||||
MatchedAt = DateTimeOffset.UtcNow
|
||||
MatchedAt = matchedAt
|
||||
}).ToList();
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -21,13 +21,16 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
{
|
||||
private readonly ICanonicalAdvisoryService _canonicalService;
|
||||
private readonly ILogger<SbomAdvisoryMatcher> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
public SbomAdvisoryMatcher(
|
||||
ICanonicalAdvisoryService canonicalService,
|
||||
ILogger<SbomAdvisoryMatcher> logger)
|
||||
ILogger<SbomAdvisoryMatcher> logger,
|
||||
TimeProvider? timeProvider = null)
|
||||
{
|
||||
_canonicalService = canonicalService ?? throw new ArgumentNullException(nameof(canonicalService));
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -142,7 +145,7 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
Method = DetermineMatchMethod(purl),
|
||||
IsReachable = false,
|
||||
IsDeployed = false,
|
||||
MatchedAt = DateTimeOffset.UtcNow
|
||||
MatchedAt = _timeProvider.GetUtcNow()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -168,6 +171,8 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
var isDeployed = deploymentMap?.TryGetValue(purl, out var deployed) == true && deployed;
|
||||
var matchMethod = DetermineMatchMethod(purl);
|
||||
|
||||
var matchedAt = _timeProvider.GetUtcNow();
|
||||
|
||||
return advisories.Select(advisory => new SbomAdvisoryMatch
|
||||
{
|
||||
Id = ComputeDeterministicMatchId(sbomDigest, purl, advisory.Id),
|
||||
@@ -178,7 +183,7 @@ public sealed class SbomAdvisoryMatcher : ISbomAdvisoryMatcher
|
||||
Method = matchMethod,
|
||||
IsReachable = isReachable,
|
||||
IsDeployed = isDeployed,
|
||||
MatchedAt = DateTimeOffset.UtcNow
|
||||
MatchedAt = matchedAt
|
||||
}).ToList();
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -26,19 +26,22 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
private readonly IInterestScoringService _scoringService;
|
||||
private readonly IEventStream<SbomLearnedEvent>? _eventStream;
|
||||
private readonly ILogger<SbomRegistryService> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
public SbomRegistryService(
|
||||
ISbomRegistryRepository repository,
|
||||
ISbomAdvisoryMatcher matcher,
|
||||
IInterestScoringService scoringService,
|
||||
ILogger<SbomRegistryService> logger,
|
||||
IEventStream<SbomLearnedEvent>? eventStream = null)
|
||||
IEventStream<SbomLearnedEvent>? eventStream = null,
|
||||
TimeProvider? timeProvider = null)
|
||||
{
|
||||
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
|
||||
_matcher = matcher ?? throw new ArgumentNullException(nameof(matcher));
|
||||
_scoringService = scoringService ?? throw new ArgumentNullException(nameof(scoringService));
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
_eventStream = eventStream;
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
#region Registration
|
||||
@@ -72,7 +75,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
PrimaryVersion = input.PrimaryVersion,
|
||||
ComponentCount = input.Purls.Count,
|
||||
Purls = input.Purls,
|
||||
RegisteredAt = DateTimeOffset.UtcNow,
|
||||
RegisteredAt = _timeProvider.GetUtcNow(),
|
||||
Source = input.Source,
|
||||
TenantId = input.TenantId
|
||||
};
|
||||
@@ -161,7 +164,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
// Step 4: Update registration metadata
|
||||
await _repository.UpdateAffectedCountAsync(registration.Digest, matches.Count, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
await _repository.UpdateLastMatchedAsync(registration.Digest, DateTimeOffset.UtcNow, cancellationToken)
|
||||
await _repository.UpdateLastMatchedAsync(registration.Digest, _timeProvider.GetUtcNow(), cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
// Step 5: Update interest scores for affected canonicals
|
||||
@@ -210,7 +213,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
Registration = registration with
|
||||
{
|
||||
AffectedCount = matches.Count,
|
||||
LastMatchedAt = DateTimeOffset.UtcNow
|
||||
LastMatchedAt = _timeProvider.GetUtcNow()
|
||||
},
|
||||
Matches = matches,
|
||||
ScoresUpdated = scoresUpdated,
|
||||
@@ -270,7 +273,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
|
||||
await _repository.UpdateAffectedCountAsync(digest, matches.Count, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
await _repository.UpdateLastMatchedAsync(digest, DateTimeOffset.UtcNow, cancellationToken)
|
||||
await _repository.UpdateLastMatchedAsync(digest, _timeProvider.GetUtcNow(), cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
sw.Stop();
|
||||
@@ -289,7 +292,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
Registration = registration with
|
||||
{
|
||||
AffectedCount = matches.Count,
|
||||
LastMatchedAt = DateTimeOffset.UtcNow
|
||||
LastMatchedAt = _timeProvider.GetUtcNow()
|
||||
},
|
||||
Matches = matches,
|
||||
ScoresUpdated = 0, // Rematch doesn't update scores
|
||||
@@ -374,7 +377,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
|
||||
await _repository.UpdateAffectedCountAsync(digest, allMatches.Count, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
await _repository.UpdateLastMatchedAsync(digest, DateTimeOffset.UtcNow, cancellationToken)
|
||||
await _repository.UpdateLastMatchedAsync(digest, _timeProvider.GetUtcNow(), cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
// Update interest scores only for newly added matches
|
||||
@@ -424,7 +427,7 @@ public sealed class SbomRegistryService : ISbomRegistryService
|
||||
{
|
||||
ComponentCount = newPurls.Count,
|
||||
AffectedCount = allMatches.Count,
|
||||
LastMatchedAt = DateTimeOffset.UtcNow,
|
||||
LastMatchedAt = _timeProvider.GetUtcNow(),
|
||||
Purls = newPurls
|
||||
},
|
||||
Matches = allMatches,
|
||||
|
||||
Reference in New Issue
Block a user