From 13b4c201489897efad6721f9a90d9d062e3355fd Mon Sep 17 00:00:00 2001 From: Denozordec Date: Wed, 20 May 2026 11:13:15 +0700 Subject: [PATCH] fix(web): show semver on monitoring from legacy /v1/version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На проде API отдаёт только api_version и git_sha=unknown без поля version; карточка показывала SHA вместо semver. Общий хелпер version-info.ts: version → api_version, placeholder SHA не в заголовке. Co-authored-by: Cursor --- web/src/lib/api/version-info.ts | 49 ++++++++++++++++++++ web/src/lib/ui/app/layout/app-version.svelte | 15 ++---- web/src/routes/monitoring/+page.svelte | 37 +++++++-------- 3 files changed, 71 insertions(+), 30 deletions(-) create mode 100644 web/src/lib/api/version-info.ts diff --git a/web/src/lib/api/version-info.ts b/web/src/lib/api/version-info.ts new file mode 100644 index 0000000..58955a8 --- /dev/null +++ b/web/src/lib/api/version-info.ts @@ -0,0 +1,49 @@ +/** Ответ GET /v1/version (см. docs/openapi.yaml VersionInfo). */ +export type VersionInfo = { + version?: string; + api_version?: string; + git_sha?: string; + build_time?: string; +}; + +const PLACEHOLDER_SHA = new Set(['', 'unknown']); + +function nonEmptyString(value: unknown): string { + if (typeof value === 'string') { + const s = value.trim(); + return s; + } + if (value == null) return ''; + return String(value).trim(); +} + +/** Semver или legacy api_version; пустая строка, если полей нет. */ +export function resolveVersionString(info: VersionInfo | null | undefined): string { + if (!info) return ''; + return nonEmptyString(info.version) || nonEmptyString(info.api_version); +} + +/** Короткий git SHA; пусто для placeholder «unknown». */ +export function resolveGitSha(info: VersionInfo | null | undefined): string { + if (!info) return ''; + const sha = nonEmptyString(info.git_sha); + if (!sha || PLACEHOLDER_SHA.has(sha.toLowerCase())) return ''; + return sha; +} + +/** Заголовок карточки «Версия» на /monitoring. */ +export function formatVersionHeadline(info: VersionInfo | null | undefined): string { + if (!info) return '—'; + const ver = resolveVersionString(info); + const sha = resolveGitSha(info); + if (ver && sha) return `${ver} (${sha.slice(0, 12)})`; + if (ver) return ver; + if (sha) return sha.slice(0, 12); + return '—'; +} + +/** Подпись в сайдбаре (v1.2.3). */ +export function formatVersionSidebarLabel(info: VersionInfo | null | undefined): string | null { + const ver = resolveVersionString(info); + return ver ? `v${ver}` : null; +} diff --git a/web/src/lib/ui/app/layout/app-version.svelte b/web/src/lib/ui/app/layout/app-version.svelte index 5bf0a54..5169e56 100644 --- a/web/src/lib/ui/app/layout/app-version.svelte +++ b/web/src/lib/ui/app/layout/app-version.svelte @@ -1,11 +1,10 @@