using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace StellaOps.Verdict.Persistence; /// /// Database entity for verdict storage. /// [Table("verdicts", Schema = "stellaops")] public sealed class VerdictRow { [Column("verdict_id")] public required string VerdictId { get; set; } [Column("tenant_id")] public Guid TenantId { get; set; } // Subject fields [Column("subject_purl")] public required string SubjectPurl { get; set; } [Column("subject_cve_id")] public required string SubjectCveId { get; set; } [Column("subject_component_name")] public string? SubjectComponentName { get; set; } [Column("subject_component_version")] public string? SubjectComponentVersion { get; set; } [Column("subject_image_digest")] public string? SubjectImageDigest { get; set; } [Column("subject_digest")] public string? SubjectDigest { get; set; } // Claim fields [Column("claim_status")] public required string ClaimStatus { get; set; } [Column("claim_confidence")] public decimal? ClaimConfidence { get; set; } [Column("claim_vex_status")] public string? ClaimVexStatus { get; set; } // Result fields [Column("result_disposition")] public required string ResultDisposition { get; set; } [Column("result_score")] public decimal? ResultScore { get; set; } [Column("result_matched_rule")] public string? ResultMatchedRule { get; set; } [Column("result_quiet")] public bool ResultQuiet { get; set; } // Provenance fields [Column("provenance_generator")] public required string ProvenanceGenerator { get; set; } [Column("provenance_run_id")] public string? ProvenanceRunId { get; set; } [Column("provenance_policy_bundle_id")] public string? ProvenancePolicyBundleId { get; set; } // Inputs hash [Column("inputs_hash")] public required string InputsHash { get; set; } // Full JSON [Column("verdict_json", TypeName = "jsonb")] public required string VerdictJson { get; set; } // Timestamps [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; [Column("expires_at")] public DateTimeOffset? ExpiresAt { get; set; } }