using System.Text.Json.Serialization; using StellaOps.Zastava.Core.Contracts; namespace StellaOps.Scanner.WebService.Contracts; public sealed record RuntimeEventsIngestRequestDto { [JsonPropertyName("batchId")] public string? BatchId { get; init; } [JsonPropertyName("events")] public IReadOnlyList Events { get; init; } = Array.Empty(); } public sealed record RuntimeEventsIngestResponseDto { [JsonPropertyName("accepted")] public int Accepted { get; init; } [JsonPropertyName("duplicates")] public int Duplicates { get; init; } } public sealed record RuntimeReconcileRequestDto { [JsonPropertyName("imageDigest")] public required string ImageDigest { get; init; } [JsonPropertyName("runtimeEventId")] public string? RuntimeEventId { get; init; } [JsonPropertyName("maxMisses")] public int MaxMisses { get; init; } = 100; } public sealed record RuntimeReconcileResponseDto { [JsonPropertyName("imageDigest")] public required string ImageDigest { get; init; } [JsonPropertyName("runtimeEventId")] public string? RuntimeEventId { get; init; } [JsonPropertyName("sbomArtifactId")] public string? SbomArtifactId { get; init; } [JsonPropertyName("totalRuntimeLibraries")] public int TotalRuntimeLibraries { get; init; } [JsonPropertyName("totalSbomComponents")] public int TotalSbomComponents { get; init; } [JsonPropertyName("matchCount")] public int MatchCount { get; init; } [JsonPropertyName("missCount")] public int MissCount { get; init; } [JsonPropertyName("misses")] public IReadOnlyList Misses { get; init; } = []; [JsonPropertyName("matches")] public IReadOnlyList Matches { get; init; } = []; [JsonPropertyName("reconciledAt")] public DateTimeOffset ReconciledAt { get; init; } [JsonPropertyName("errorCode")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ErrorCode { get; init; } [JsonPropertyName("errorMessage")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ErrorMessage { get; init; } } public sealed record RuntimeLibraryMissDto { [JsonPropertyName("path")] public required string Path { get; init; } [JsonPropertyName("sha256")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Sha256 { get; init; } [JsonPropertyName("inode")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public long? Inode { get; init; } } public sealed record RuntimeLibraryMatchDto { [JsonPropertyName("runtimePath")] public required string RuntimePath { get; init; } [JsonPropertyName("runtimeSha256")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? RuntimeSha256 { get; init; } [JsonPropertyName("sbomComponentKey")] public required string SbomComponentKey { get; init; } [JsonPropertyName("sbomComponentName")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? SbomComponentName { get; init; } [JsonPropertyName("matchType")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? MatchType { get; init; } }