Files
Mathieu LimonierandClaude Opus 5 6a6d745af4 MaBibli 1.0.0
Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts,
scan de code-barres, consultation hors-ligne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:36:16 +02:00

63 lines
2.9 KiB
C#

namespace MaBibli.Shared.Dtos;
/// <summary>
/// Version publiée de l'application, et date à laquelle son binaire a été produit.
/// </summary>
/// <remarks>
/// <para>
/// ⚠️ <b>Mieux vaut ne rien afficher qu'un numéro faux.</b> Sans injection par la chaîne de
/// publication, le SDK .NET pose <c>1.0.0</c> 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.
/// </para>
/// <para>
/// D'où le <b>témoin</b> retenu : l'horodatage de build. Il n'existe que si
/// <c>build/publier-release.sh</c> (dépôt <c>mabibli_ynh</c>) 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.
/// </para>
/// </remarks>
public record VersionApplication
{
/// <summary>Numéro publié (« 0.4.0 »), ou <c>null</c> pour un binaire non publié.</summary>
public string? Numero { get; init; }
/// <summary>Instant de production du binaire, en UTC. <c>null</c> hors publication.</summary>
public DateTimeOffset? DateBuild { get; init; }
/// <summary>Vrai quand le binaire vient bien de la chaîne de publication.</summary>
public bool Publiee => Numero is { Length: > 0 } && DateBuild is not null;
/// <summary>Un binaire compilé à la main : il n'a pas de version à annoncer.</summary>
public static readonly VersionApplication Developpement = new();
/// <summary>
/// Interprète les deux valeurs lues dans l'assembly. Fonction <b>pure</b>, pour être
/// éprouvable sans fabriquer d'assembly.
/// </summary>
/// <param name="versionInformative">
/// <c>AssemblyInformationalVersion</c>. ⚠️ Le SDK y ajoute parfois <c>+empreinte</c> (source
/// link, <c>SourceRevisionId</c>) : la partie utile est ce qui précède le <c>+</c>.
/// </param>
/// <param name="horodatage">Métadonnée <c>MaBibliDateBuild</c>, au format ISO 8601 en UTC.</param>
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;
}
}