using StellaOps.SbomService.Models; using StellaOps.SbomService.Repositories; using System; using System.Threading; using System.Threading.Tasks; namespace StellaOps.SbomService.Services; internal interface ISbomAnalysisTrigger { Task TriggerAsync(string artifactRef, Guid versionId, CancellationToken cancellationToken); } internal sealed class InMemorySbomAnalysisTrigger : ISbomAnalysisTrigger { private readonly ISbomLedgerRepository _repository; private readonly IClock _clock; private readonly IGuidProvider _guidProvider; public InMemorySbomAnalysisTrigger(ISbomLedgerRepository repository, IClock clock, IGuidProvider? guidProvider = null) { _repository = repository ?? throw new ArgumentNullException(nameof(repository)); _clock = clock ?? throw new ArgumentNullException(nameof(clock)); _guidProvider = guidProvider ?? SystemGuidProvider.Instance; } public async Task TriggerAsync(string artifactRef, Guid versionId, CancellationToken cancellationToken) { var jobId = _guidProvider.NewGuid().ToString("n"); var job = new SbomAnalysisJob(jobId, artifactRef, versionId, _clock.UtcNow, "queued"); await _repository.AddAnalysisJobAsync(job, cancellationToken).ConfigureAwait(false); return job; } }