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