// ----------------------------------------------------------------------------- // S3UnifiedArtifactStoreOptions.cs // Sprint: SPRINT_20260118_017_Evidence_artifact_store_unification // Task: AS-002 - Implement S3-backed ArtifactStore // Description: Configuration options for S3-backed artifact store // ----------------------------------------------------------------------------- namespace StellaOps.Artifact.Infrastructure; /// /// Configuration options for S3-backed artifact store. /// public sealed class S3UnifiedArtifactStoreOptions { /// /// S3 bucket name. /// public string BucketName { get; set; } = string.Empty; /// /// Path prefix within the bucket. /// public string Prefix { get; set; } = "artifacts"; /// /// Whether to use content-addressable storage for deduplication. /// public bool EnableDeduplication { get; set; } = true; /// /// Whether to store metadata as sidecar JSON files. /// public bool UseSidecarMetadata { get; set; } = false; /// /// Whether to overwrite existing artifacts. /// public bool AllowOverwrite { get; set; } = false; /// /// Maximum artifact size in bytes. /// public long MaxArtifactSizeBytes { get; set; } = 100 * 1024 * 1024; // 100MB /// /// Retention policies per artifact type. Key is ArtifactType enum name. /// Sprint: SPRINT_20260118_017 (AS-002) /// public Dictionary RetentionPolicies { get; set; } = new() { ["Sbom"] = new RetentionPolicy { RetentionDays = 365 * 7, DeleteAfterExpiry = false }, ["Vex"] = new RetentionPolicy { RetentionDays = 365 * 7, DeleteAfterExpiry = false }, ["Dsse"] = new RetentionPolicy { RetentionDays = 365 * 7, DeleteAfterExpiry = false }, ["RekorProof"] = new RetentionPolicy { RetentionDays = 365 * 10, DeleteAfterExpiry = false }, ["Attestation"] = new RetentionPolicy { RetentionDays = 365 * 7, DeleteAfterExpiry = false }, ["BuildLog"] = new RetentionPolicy { RetentionDays = 365, DeleteAfterExpiry = true }, ["ScanResult"] = new RetentionPolicy { RetentionDays = 365 * 2, DeleteAfterExpiry = true }, ["Temporary"] = new RetentionPolicy { RetentionDays = 30, DeleteAfterExpiry = true } }; /// /// Default retention policy for unspecified artifact types. /// public RetentionPolicy DefaultRetentionPolicy { get; set; } = new() { RetentionDays = 365 * 5, DeleteAfterExpiry = false }; }