refactor(vulnexplorer): inject TimeProvider and IGuidProvider for determinism - DET-016

VexDecisionStore: Added TimeProvider and IGuidProvider injection for deterministic
ID generation and timestamps in Create/Update methods.

Added StellaOps.Determinism.Abstractions project reference.
This commit is contained in:
StellaOps Bot
2026-01-04 15:11:38 +02:00
parent ff3e32e0b0
commit 6c4823d941
2 changed files with 15 additions and 3 deletions

View File

@@ -1,4 +1,5 @@
using System.Collections.Concurrent;
using StellaOps.Determinism;
using StellaOps.VulnExplorer.Api.Models;
namespace StellaOps.VulnExplorer.Api.Data;
@@ -10,11 +11,19 @@ namespace StellaOps.VulnExplorer.Api.Data;
public sealed class VexDecisionStore
{
private readonly ConcurrentDictionary<Guid, VexDecisionDto> _decisions = new();
private readonly TimeProvider _timeProvider;
private readonly IGuidProvider _guidProvider;
public VexDecisionStore(TimeProvider? timeProvider = null, IGuidProvider? guidProvider = null)
{
_timeProvider = timeProvider ?? TimeProvider.System;
_guidProvider = guidProvider ?? SystemGuidProvider.Instance;
}
public VexDecisionDto Create(CreateVexDecisionRequest request, string userId, string userDisplayName)
{
var id = Guid.NewGuid();
var now = DateTimeOffset.UtcNow;
var id = _guidProvider.NewGuid();
var now = _timeProvider.GetUtcNow();
var decision = new VexDecisionDto(
Id: id,
@@ -52,7 +61,7 @@ public sealed class VexDecisionStore
Scope = request.Scope ?? existing.Scope,
ValidFor = request.ValidFor ?? existing.ValidFor,
SupersedesDecisionId = request.SupersedesDecisionId ?? existing.SupersedesDecisionId,
UpdatedAt = DateTimeOffset.UtcNow
UpdatedAt = _timeProvider.GetUtcNow()
};
_decisions[id] = updated;

View File

@@ -12,4 +12,7 @@
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
<PackageReference Include="Swashbuckle.AspNetCore" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../../__Libraries/StellaOps.Determinism.Abstractions/StellaOps.Determinism.Abstractions.csproj" />
</ItemGroup>
</Project>