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;
}
}