using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; namespace StellaOps.Provcache.Api; public static partial class ProvcacheEndpointExtensions { /// /// GET /v1/provcache/{veriKey}/manifest /// private static async Task GetInputManifestAsync( string veriKey, IProvcacheService provcacheService, TimeProvider timeProvider, ILogger logger, CancellationToken cancellationToken) { logger.LogDebug("GET /v1/provcache/{VeriKey}/manifest", veriKey); try { // First get the entry to verify it exists var result = await provcacheService.GetAsync(veriKey, bypassCache: false, cancellationToken); if (result.Status == ProvcacheResultStatus.CacheMiss) { return Results.NotFound(new ProblemDetails { Title = "Entry not found", Detail = $"No cache entry found for VeriKey: {veriKey}", Status = StatusCodes.Status404NotFound }); } if (result.Status == ProvcacheResultStatus.Expired) { return Results.NotFound(new ProblemDetails { Title = "Entry expired", Detail = $"Cache entry for VeriKey '{veriKey}' has expired", Status = StatusCodes.Status404NotFound }); } var entry = result.Entry; if (entry is null) { return Results.NotFound(new ProblemDetails { Title = "Entry not found", Detail = $"No cache entry found for VeriKey: {veriKey}", Status = StatusCodes.Status404NotFound }); } // Build the input manifest from the entry metadata // In a full implementation, we'd resolve these hashes to more detailed metadata // from their respective stores (SBOM store, VEX store, policy registry, etc.) var manifest = BuildInputManifest(entry, timeProvider); return Results.Ok(manifest); } catch (Exception ex) { logger.LogError(ex, "Error getting input manifest for VeriKey {VeriKey}", veriKey); return InternalError("Manifest retrieval failed"); } } }