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>
63 lines
2.9 KiB
C#
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;
|
|
}
|
|
}
|