using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Deploymentcenter.Client.Models
{
///
/// Beschreibt, was eine Anwendung zum Laufen braucht - als Datei
/// setup.json im Wurzelverzeichnis des Pakets, neben der
/// manifest.json.
///
/// Bewusst im Paket und nicht zentral im Deploymentcenter: so ist die
/// Beschreibung mit der Anwendung versioniert. Braucht Version 2.0 ein
/// Feld mehr als 1.9, stimmt es automatisch - eine zweite Pflegestelle
/// wuerde frueher oder spaeter auseinanderlaufen.
///
/// Fehlt die Datei, laesst sich die Anwendung trotzdem installieren; der
/// Installer entpackt sie dann nur und fragt nichts ab.
///
public class SetupDefinition
{
/// Format-Version dieser Datei.
[JsonPropertyName("schema")]
public int Schema { get; set; } = 1;
/// Anzeigename, sonst wird der Projekt-Slug verwendet.
[JsonPropertyName("displayName")]
public string DisplayName { get; set; } = string.Empty;
/// Kurzer Hinweistext, der vor der Abfrage angezeigt wird.
[JsonPropertyName("description")]
public string Description { get; set; } = string.Empty;
/// Wohin die ermittelten Werte geschrieben werden.
[JsonPropertyName("targets")]
public List Targets { get; set; } = new List();
/// Die benoetigten Werte.
[JsonPropertyName("fields")]
public List Fields { get; set; } = new List();
}
/// Eine Datei, in die Werte geschrieben werden.
public class SetupTarget
{
///
/// Pfad, bezogen auf . Umgebungsvariablen sind
/// in beiden Schreibweisen erlaubt: ${XDG_CONFIG_HOME} und
/// %APPDATA%. Ein absoluter Pfad wird unveraendert benutzt.
///
[JsonPropertyName("file")]
public string File { get; set; } = string.Empty;
///
/// Abweichender Pfad unter Windows.
///
/// Konfigurationsordner heissen plattformabhaengig unterschiedlich:
/// unter Windows ist "%APPDATA%\MeineAnwendung" ueblich, unter Linux
/// "$XDG_CONFIG_HOME/meineanwendung" klein. Meist genuegt es, die
/// kleingeschriebene Form anzugeben - NTFS unterscheidet nicht nach
/// Gross- und Kleinschreibung, umgekehrt entstuende unter Linux ein
/// zweites, leeres Verzeichnis neben dem, aus dem die Anwendung liest.
///
/// Das traegt aber nur, solange das Dateisystem tatsaechlich
/// unempfindlich ist - auf APFS mit Beachtung der Schreibweise oder
/// einem per fsutil umgestellten NTFS-Ordner nicht mehr. Und es hilft
/// gar nicht, wenn sich die Namen um mehr als die Schreibweise
/// unterscheiden. Fuer diese Faelle sind die folgenden Felder da; ohne
/// Angabe gilt .
///
[JsonPropertyName("fileWindows")]
public string FileWindows { get; set; } = string.Empty;
/// Abweichender Pfad unter Linux.
[JsonPropertyName("fileLinux")]
public string FileLinux { get; set; } = string.Empty;
/// Abweichender Pfad unter macOS.
[JsonPropertyName("fileMacOS")]
public string FileMacOS { get; set; } = string.Empty;
///
/// Wo die Datei liegt:
///
/// install (Vorgabe) - im Installationsverzeichnis
/// config - %APPDATA% bzw. $XDG_CONFIG_HOME (~/.config)
/// data - %LOCALAPPDATA% bzw. $XDG_DATA_HOME
/// home - Benutzerverzeichnis
///
/// Anwendungen, die sich unter Linux richtig verhalten, legen ihre
/// Konfiguration nicht neben das Programm - /opt/<app> ist fuer den
/// Dienstbenutzer meist nicht schreibbar. Ohne diese Angabe schriebe
/// der Installer dorthin, wo die Anwendung nie nachsieht.
///
[JsonPropertyName("location")]
public string Location { get; set; } = "install";
/// "json" oder "env".
[JsonPropertyName("format")]
public string Format { get; set; } = "json";
///
/// Kennung, ueber die Felder dieser Datei zugeordnet werden. Ohne
/// Angabe schreiben alle Felder in das erste Ziel.
///
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;
}
/// Ein einzelner Konfigurationswert.
public class SetupField
{
///
/// Schluessel im Ziel. Bei JSON trennt ein Doppelpunkt die Ebenen
/// ("ConnectionStrings:Main"), passend zur Schreibweise von
/// Microsoft.Extensions.Configuration.
///
[JsonPropertyName("key")]
public string Key { get; set; } = string.Empty;
/// Beschriftung fuer die Abfrage.
[JsonPropertyName("label")]
public string Label { get; set; } = string.Empty;
/// Erlaeuterung, die unter der Frage steht.
[JsonPropertyName("help")]
public string Help { get; set; } = string.Empty;
/// string | secret | url | int | bool | enum
[JsonPropertyName("type")]
public string Type { get; set; } = "string";
/// Muss ein Wert vorliegen?
[JsonPropertyName("required")]
public bool Required { get; set; } = true;
/// Vorbelegung.
[JsonPropertyName("default")]
public string Default { get; set; } = string.Empty;
///
/// Woher der Wert kommt, wenn nicht gefragt werden soll:
/// detect:hostname | detect:platform | detect:installdir | detect:username
/// provision - Token beim Deploymentcenter anfordern
/// ask - Vorgabe: nachfragen
///
[JsonPropertyName("source")]
public string Source { get; set; } = "ask";
/// Rechte fuer source = provision.
[JsonPropertyName("scopes")]
public List Scopes { get; set; } = new List();
/// Auswahlmoeglichkeiten fuer type = enum.
[JsonPropertyName("options")]
public List Options { get; set; } = new List();
/// Regulaerer Ausdruck, gegen den der Wert geprueft wird.
[JsonPropertyName("validate")]
public string Validate { get; set; } = string.Empty;
/// Meldung, wenn die Pruefung fehlschlaegt.
[JsonPropertyName("validationMessage")]
public string ValidationMessage { get; set; } = string.Empty;
/// Kennung des Ziels aus .
[JsonPropertyName("target")]
public string Target { get; set; } = string.Empty;
/// Wird der Wert verdeckt eingegeben und nicht angezeigt?
[JsonIgnore]
public bool IsSecret =>
string.Equals(Type, "secret", StringComparison.OrdinalIgnoreCase)
|| string.Equals(Source, "provision", StringComparison.OrdinalIgnoreCase);
}
}