using System.Reflection; namespace JobTrackerApi.Services; // Build metadata (version, commit, stamp) comes from configuration, populated by // docker-compose as App__Version / App__CommitSha / App__BuildStamp. // // This lives here because two callers need the same answer: the admin system page and // the anonymous /health endpoint. /health used to read the APP_VERSION *environment // variable* directly, which compose never sets under that name — it passes App__Version, // binding to the App:Version configuration key. So /health always reported "unknown". // See docs/release-candidate-review.md (N2). public static class BuildMetadata { // Ignore unresolved shell/compose placeholders that would otherwise leak into the // admin UI or a health response, e.g. $(git rev-parse --short HEAD) or ${APP_COMMIT_SHA}. public static string? Normalize(string? value) { var trimmed = (value ?? string.Empty).Trim(); if (string.IsNullOrWhiteSpace(trimmed)) return null; if ((trimmed.StartsWith("$(") && trimmed.EndsWith(")")) || (trimmed.StartsWith("${") && trimmed.EndsWith("}"))) { return null; } return trimmed; } // Configured version, else the assembly version, else "unknown". The assembly fallback // is what makes local development useful: nothing sets App:Version there. public static string ResolveVersion(IConfiguration cfg) { var version = Normalize(cfg["App:Version"]); if (!string.IsNullOrWhiteSpace(version)) return version; return Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown"; } }