namespace MaBibli.Shared.Dtos;
///
/// Version publiée de l'application, et date à laquelle son binaire a été produit.
///
///
///
/// ⚠️ Mieux vaut ne rien afficher qu'un numéro faux. Sans injection par la chaîne de
/// publication, le SDK .NET pose 1.0.0 dans tout assembly : ce numéro se lirait comme une
/// vraie version alors qu'il ne désigne rien. Or c'est précisément la valeur qu'on ira lire pour
/// diagnostiquer un appareil dont le cache est dépareillé — s'y tromper coûterait le diagnostic.
///
///
/// D'où le témoin retenu : l'horodatage de build. Il n'existe que si
/// build/publier-release.sh (dépôt mabibli_ynh) l'a posé, et le script pose les deux
/// valeurs ensemble. Sans lui, la version lue est celle du SDK et n'est pas rendue : l'application
/// se déclare « version de développement », ce qui est vrai.
///
///
public record VersionApplication
{
/// Numéro publié (« 0.4.0 »), ou null pour un binaire non publié.
public string? Numero { get; init; }
/// Instant de production du binaire, en UTC. null hors publication.
public DateTimeOffset? DateBuild { get; init; }
/// Vrai quand le binaire vient bien de la chaîne de publication.
public bool Publiee => Numero is { Length: > 0 } && DateBuild is not null;
/// Un binaire compilé à la main : il n'a pas de version à annoncer.
public static readonly VersionApplication Developpement = new();
///
/// Interprète les deux valeurs lues dans l'assembly. Fonction pure, pour être
/// éprouvable sans fabriquer d'assembly.
///
///
/// AssemblyInformationalVersion. ⚠️ Le SDK y ajoute parfois +empreinte (source
/// link, SourceRevisionId) : la partie utile est ce qui précède le +.
///
/// Métadonnée MaBibliDateBuild, au format ISO 8601 en UTC.
public static VersionApplication Depuis(string? versionInformative, string? horodatage)
{
// Le témoin d'abord : sans horodatage, rien n'a été injecté, et la version lue est celle
// que le SDK invente. On ne la rend donc pas, même si elle est présente.
if (!DateTimeOffset.TryParse(
horodatage,
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.AdjustToUniversal | System.Globalization.DateTimeStyles.AssumeUniversal,
out var date))
{
return Developpement;
}
var numero = versionInformative?.Split('+')[0].Trim();
return numero is { Length: > 0 }
? new VersionApplication { Numero = numero, DateBuild = date }
: Developpement;
}
}