using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace Deploymentcenter.Client.Models { /// /// Model for channel-level latest.json served by LEMP / Nginx or Deploymentcenter API. /// public class ReleaseManifest { [JsonPropertyName("projectId")] public string ProjectId { get; set; } = string.Empty; [JsonPropertyName("channel")] public string Channel { get; set; } = "prod"; /// /// Laufzeitkennung des Kanals. Fehlt sie, stammt die Datei aus der /// Zeit vor der Plattform-Dimension und gilt als "any". /// [JsonPropertyName("platform")] public string Platform { get; set; } = PlatformId.Any; [JsonPropertyName("latest")] public VersionInfo? Latest { get; set; } [JsonPropertyName("versions")] public List Versions { get; set; } = new List(); } /// /// Release-Daten so, wie sie /api/updateservice/v1/check unter /// latest_release liefert: die Zeile aus updateservice_releases /// mit ihren Spaltennamen. /// /// Bewusst ein eigenes Modell. Zuvor wurde die API-Antwort in /// deserialisiert, das die camelCase-Namen der /// statischen latest.json traegt. Von beiden Formaten stimmt nur "version" /// ueberein - ueber die API kamen also weder Download-Adresse noch Pruefsumme, /// Changelog oder Kritikalitaet an. Der API-Zweig ist genau der Rueckfall, /// wenn die latest.json fehlt; er degradierte damit still. /// public class ApiReleaseInfo { [JsonPropertyName("version")] public string Version { get; set; } = string.Empty; [JsonPropertyName("channel")] public string Channel { get; set; } = "prod"; [JsonPropertyName("platform")] public string Platform { get; set; } = PlatformId.Any; [JsonPropertyName("download_url")] public string DownloadUrl { get; set; } = string.Empty; /// /// RSA-SHA256 ueber die kanonische Release-Zeile, base64. Der Server /// bildet sie beim Veroeffentlichen; leer, wenn dort kein /// Signierschluessel hinterlegt ist. /// [JsonPropertyName("manifest_signature")] public string ManifestSignature { get; set; } = string.Empty; [JsonPropertyName("sha256_hash")] public string Sha256Hash { get; set; } = string.Empty; [JsonPropertyName("release_notes")] public string ReleaseNotes { get; set; } = string.Empty; [JsonPropertyName("git_commit")] public string GitCommit { get; set; } = string.Empty; [JsonPropertyName("size_bytes")] public long SizeBytes { get; set; } [JsonPropertyName("created_at")] public string CreatedAt { get; set; } = string.Empty; /// /// MySQL liefert TINYINT(1) als 0/1, PHP je nach Treiber auch als /// Zeichenkette. nimmt beides. /// [JsonPropertyName("is_critical")] [JsonConverter(typeof(FlexibleBoolConverter))] public bool IsCritical { get; set; } /// Uebersetzt in das Modell, das Aufrufer bereits kennen. public VersionInfo ToVersionInfo() => new VersionInfo { Version = Version, BuildDate = CreatedAt, GitCommit = GitCommit, GitCommitShort = GitCommit.Length >= 7 ? GitCommit.Substring(0, 7) : GitCommit, PackageUrl = DownloadUrl, Sha256 = Sha256Hash, SizeBytes = SizeBytes, Changelog = ReleaseNotes, IsCritical = IsCritical, Platform = Platform, Signature = ManifestSignature }; } /// /// Individual release version details. /// public class VersionInfo { [JsonPropertyName("version")] public string Version { get; set; } = string.Empty; [JsonPropertyName("buildDate")] public string BuildDate { get; set; } = string.Empty; [JsonPropertyName("gitCommit")] public string GitCommit { get; set; } = string.Empty; [JsonPropertyName("gitCommitShort")] public string GitCommitShort { get; set; } = string.Empty; [JsonPropertyName("packageUrl")] public string PackageUrl { get; set; } = string.Empty; [JsonPropertyName("sha256")] public string Sha256 { get; set; } = string.Empty; [JsonPropertyName("sizeBytes")] public long SizeBytes { get; set; } [JsonPropertyName("changelog")] public string Changelog { get; set; } = string.Empty; [JsonPropertyName("isCritical")] public bool IsCritical { get; set; } /// /// Laufzeitkennung des Pakets. Aeltere latest.json-Dateien kennen das /// Feld nicht; sie gelten dann als plattformunabhaengig. /// [JsonPropertyName("platform")] public string Platform { get; set; } = PlatformId.Any; /// /// Signatur des Servers, sofern der Agent das Release ueber die API /// bezogen hat. Die statische latest.json fuehrt sie nicht: sie wird /// vom Packager geschrieben, und der besitzt den Signierschluessel /// bewusst nicht. /// [JsonPropertyName("signature")] public string Signature { get; set; } = string.Empty; } }