using StellaOps.SbomService.Models; using System.Text.Json; namespace StellaOps.SbomService.Repositories; public sealed class FileComponentLookupRepository : IComponentLookupRepository { private readonly IReadOnlyList _items; public FileComponentLookupRepository(string path) { if (!File.Exists(path)) { _items = Array.Empty(); return; } using var stream = File.OpenRead(path); var items = JsonSerializer.Deserialize>(stream, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); _items = items ?? new List(); } public Task<(IReadOnlyList Items, int Total)> QueryAsync(ComponentLookupQuery query, CancellationToken cancellationToken) { var filtered = _items .Where(c => c.Purl.Equals(query.Purl, StringComparison.OrdinalIgnoreCase)) .Where(c => query.Artifact is null || c.Artifact.Equals(query.Artifact, StringComparison.OrdinalIgnoreCase)) .OrderBy(c => c.Artifact) .ThenBy(c => c.Purl) .ToList(); var page = filtered .Skip(query.Offset) .Take(query.Limit) .ToList(); return Task.FromResult<(IReadOnlyList Items, int Total)>((page, filtered.Count)); } }