using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace TheCr3w.Shared.Data; [Table("applications")] public class ApplicationEntity { [Key] [Column("app_id")] [MaxLength(128)] public string AppId { get; set; } = string.Empty; [Column("name")] [MaxLength(255)] public string Name { get; set; } = string.Empty; [Column("description")] public string? Description { get; set; } [Column("icon_url")] public string? IconUrl { get; set; } [Column("is_public")] public bool IsPublic { get; set; } = true; [Column("default_channel")] [MaxLength(32)] public string DefaultChannel { get; set; } = "stable"; [Column("system_requirements")] public string? SystemRequirements { get; set; } [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; [Column("updated_at")] public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; public List Platforms { get; set; } = new(); public List Releases { get; set; } = new(); } [Table("application_platforms")] public class ApplicationPlatformEntity { [Column("app_id")] [MaxLength(128)] public string AppId { get; set; } = string.Empty; [Column("platform")] [MaxLength(32)] public string Platform { get; set; } = string.Empty; [Column("package_identifier")] [MaxLength(255)] public string PackageIdentifier { get; set; } = string.Empty; [Column("signing_certificate_fingerprint")] [MaxLength(128)] public string? SigningCertificateFingerprint { get; set; } public ApplicationEntity? Application { get; set; } } [Table("releases")] public class ReleaseEntity { [Key] [Column("release_id")] public Guid ReleaseId { get; set; } = Guid.NewGuid(); [Column("app_id")] [MaxLength(128)] public string AppId { get; set; } = string.Empty; [Column("version")] [MaxLength(64)] public string Version { get; set; } = string.Empty; [Column("version_code")] public int VersionCode { get; set; } [Column("platform")] [MaxLength(32)] public string Platform { get; set; } = string.Empty; [Column("architecture")] [MaxLength(32)] public string Architecture { get; set; } = string.Empty; [Column("channel")] [MaxLength(32)] public string Channel { get; set; } = string.Empty; [Column("status")] [MaxLength(32)] public string Status { get; set; } = "draft"; // draft, published, revoked [Column("mandatory")] public bool Mandatory { get; set; } [Column("minimum_supported_version")] [MaxLength(64)] public string? MinimumSupportedVersion { get; set; } [Column("release_notes")] public string? ReleaseNotes { get; set; } [Column("file_size_bytes")] public long FileSizeBytes { get; set; } [Column("sha256")] [MaxLength(64)] public string Sha256 { get; set; } = string.Empty; [Column("r2_object_key")] [MaxLength(512)] public string R2ObjectKey { get; set; } = string.Empty; [Column("signature_ed25519")] [MaxLength(128)] public string? SignatureEd25519 { get; set; } [Column("signing_key_id")] [MaxLength(64)] public string? SigningKeyId { get; set; } [Column("published_at")] public DateTimeOffset? PublishedAt { get; set; } [Column("revoked_at")] public DateTimeOffset? RevokedAt { get; set; } [Column("revocation_reason")] public string? RevocationReason { get; set; } [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; [Column("created_by")] [MaxLength(255)] public string CreatedBy { get; set; } = string.Empty; public ApplicationEntity? Application { get; set; } } [Table("installation_reports")] public class InstallationReportEntity { [Key] [Column("report_id")] public Guid ReportId { get; set; } = Guid.NewGuid(); [Column("release_id")] public Guid ReleaseId { get; set; } [Column("previous_version")] [MaxLength(64)] public string? PreviousVersion { get; set; } [Column("installed_version")] [MaxLength(64)] public string InstalledVersion { get; set; } = string.Empty; [Column("status")] [MaxLength(32)] public string Status { get; set; } = "success"; // success, failed, rolled_back [Column("duration_seconds")] public int? DurationSeconds { get; set; } [Column("os_version")] [MaxLength(64)] public string? OsVersion { get; set; } [Column("device_model")] [MaxLength(128)] public string? DeviceModel { get; set; } [Column("error_details")] public string? ErrorDetails { get; set; } [Column("reported_at")] public DateTimeOffset ReportedAt { get; set; } = DateTimeOffset.UtcNow; } [Table("error_reports")] public class ErrorReportEntity { [Key] [Column("error_id")] public Guid ErrorId { get; set; } = Guid.NewGuid(); [Column("release_id")] public Guid? ReleaseId { get; set; } [Column("app_id")] [MaxLength(128)] public string AppId { get; set; } = string.Empty; [Column("error_code")] [MaxLength(64)] public string ErrorCode { get; set; } = string.Empty; [Column("error_message")] public string ErrorMessage { get; set; } = string.Empty; [Column("stack_trace")] public string? StackTrace { get; set; } [Column("client_platform")] [MaxLength(32)] public string? ClientPlatform { get; set; } [Column("reported_at")] public DateTimeOffset ReportedAt { get; set; } = DateTimeOffset.UtcNow; } [Table("deployment_manifests")] public class DeploymentManifestEntity { [Key] [Column("manifest_id")] public Guid ManifestId { get; set; } = Guid.NewGuid(); [Column("project_id")] [MaxLength(64)] public string ProjectId { get; set; } = string.Empty; [Column("environment_id")] [MaxLength(32)] public string EnvironmentId { get; set; } = "production"; [Column("service_name")] [MaxLength(128)] public string ServiceName { get; set; } = string.Empty; [Column("image")] [MaxLength(255)] public string Image { get; set; } = string.Empty; [Column("immutable_digest")] [MaxLength(128)] public string ImmutableDigest { get; set; } = string.Empty; [Column("manifest_sha256")] [MaxLength(64)] public string ManifestSha256 { get; set; } = string.Empty; [Column("signature_ed25519")] [MaxLength(128)] public string SignatureEd25519 { get; set; } = string.Empty; [Column("config_hash")] [MaxLength(64)] public string ConfigHash { get; set; } = string.Empty; [Column("status")] [MaxLength(32)] public string Status { get; set; } = "pending"; // pending, approved, rejected, in_progress, completed, failed, rolled_back [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; [Column("created_by")] [MaxLength(255)] public string CreatedBy { get; set; } = string.Empty; } [Table("deployment_approvals")] public class DeploymentApprovalEntity { [Key] [Column("approval_id")] public Guid ApprovalId { get; set; } = Guid.NewGuid(); [Column("manifest_id")] public Guid ManifestId { get; set; } [Column("manifest_sha256_verified")] [MaxLength(64)] public string ManifestSha256Verified { get; set; } = string.Empty; [Column("approver")] [MaxLength(255)] public string Approver { get; set; } = string.Empty; [Column("decision")] [MaxLength(32)] public string Decision { get; set; } = "approved"; [Column("comment")] public string? Comment { get; set; } [Column("decided_at")] public DateTimeOffset DecidedAt { get; set; } = DateTimeOffset.UtcNow; } [Table("audit_events")] public class AuditEventEntity { [Key] [Column("event_id")] public Guid EventId { get; set; } = Guid.NewGuid(); [Column("actor")] [MaxLength(255)] public string Actor { get; set; } = string.Empty; [Column("action")] [MaxLength(128)] public string Action { get; set; } = string.Empty; [Column("resource_type")] [MaxLength(128)] public string ResourceType { get; set; } = string.Empty; [Column("resource_id")] [MaxLength(255)] public string ResourceId { get; set; } = string.Empty; [Column("correlation_id")] public Guid CorrelationId { get; set; } = Guid.NewGuid(); [Column("ip_address")] [MaxLength(64)] public string? IpAddress { get; set; } [Column("user_agent")] public string? UserAgent { get; set; } [Column("success")] public bool Success { get; set; } = true; [Column("error_message")] public string? ErrorMessage { get; set; } [Column("details_json")] public string? DetailsJson { get; set; } [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; } [Table("external_servers")] public class ExternalServerEntity { [Key] [Column("server_id")] public Guid ServerId { get; set; } = Guid.NewGuid(); [Column("name")] [MaxLength(255)] public string Name { get; set; } = string.Empty; [Column("protocol")] [MaxLength(16)] public string Protocol { get; set; } = "sftp"; // sftp, ftps, ftp [Column("host")] [MaxLength(255)] public string Host { get; set; } = string.Empty; [Column("port")] public int Port { get; set; } = 22; [Column("remote_root_path")] [MaxLength(512)] public string RemoteRootPath { get; set; } = "/"; [Column("host_key_fingerprint")] [MaxLength(255)] public string? HostKeyFingerprint { get; set; } [Column("tls_certificate_thumbprint")] [MaxLength(128)] public string? TlsCertificateThumbprint { get; set; } [Column("status")] [MaxLength(32)] public string Status { get; set; } = "active"; [Column("created_at")] public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; [Column("updated_at")] public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow; }