From d32a7717a56621ecb74598ed7c3ca2da70229db2 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Fri, 27 Mar 2026 11:07:42 +0100 Subject: [PATCH] feat: affiche les versions API, Indexer et Backoffice dans About - Endpoint GET /version sur l'indexer (sans auth) - Le backoffice fetch la version indexer directement (INDEXER_BASE_URL) - Grille 3 colonnes avec les 3 versions Co-Authored-By: Claude Opus 4.6 (1M context) --- .../app/(app)/settings/SettingsPage.tsx | 13 +++++++++++-- apps/backoffice/app/(app)/settings/page.tsx | 16 +++++++++++++++- apps/indexer/src/api.rs | 6 ++++++ apps/indexer/src/main.rs | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/backoffice/app/(app)/settings/SettingsPage.tsx b/apps/backoffice/app/(app)/settings/SettingsPage.tsx index 389213a..7fede1f 100644 --- a/apps/backoffice/app/(app)/settings/SettingsPage.tsx +++ b/apps/backoffice/app/(app)/settings/SettingsPage.tsx @@ -30,7 +30,7 @@ interface SettingsPageProps { initialStatusMappings: Record[]; initialSeriesStatuses: string[]; initialProviderStatuses: string[]; - versions?: { api: string; backoffice: string }; + versions?: { api: string; indexer: string; backoffice: string }; } export default function SettingsPage({ initialSettings, initialCacheStats, initialThumbnailStats, users, initialTab, initialProwlarr, initialQbittorrent, initialTorrentImport, initialTelegram, initialAnilist, initialKomga, initialMetadataProviders, initialStatusMappings, initialSeriesStatuses, initialProviderStatuses, versions }: SettingsPageProps) { @@ -543,7 +543,7 @@ export default function SettingsPage({ initialSettings, initialCacheStats, initi

{t("settings.aboutDesc")}

-
+
@@ -553,6 +553,15 @@ export default function SettingsPage({ initialSettings, initialCacheStats, initi

{versions?.api ?? "?"}

+
+
+ +
+
+

Indexer

+

{versions?.indexer ?? "?"}

+
+
diff --git a/apps/backoffice/app/(app)/settings/page.tsx b/apps/backoffice/app/(app)/settings/page.tsx index 7fc30ac..a1f05e3 100644 --- a/apps/backoffice/app/(app)/settings/page.tsx +++ b/apps/backoffice/app/(app)/settings/page.tsx @@ -4,9 +4,21 @@ import packageJson from "../../../package.json"; export const dynamic = "force-dynamic"; +async function fetchIndexerVersion(): Promise { + try { + const indexerUrl = (process.env.INDEXER_BASE_URL || "http://indexer:7081").replace(/\/$/, ""); + const res = await fetch(`${indexerUrl}/version`, { signal: AbortSignal.timeout(3000) }); + if (res.ok) { + const data = await res.json(); + return data?.indexer ?? "?"; + } + } catch { /* ignore */ } + return "?"; +} + export default async function SettingsPageWrapper({ searchParams }: { searchParams: Promise<{ tab?: string }> }) { const { tab } = await searchParams; - const [settings, cacheStats, thumbnailStats, users, prowlarr, qbittorrent, torrentImport, telegram, anilist, komga, metadataProviders, statusMappings, seriesStatuses, providerStatuses, apiVersion] = await Promise.all([ + const [settings, cacheStats, thumbnailStats, users, prowlarr, qbittorrent, torrentImport, telegram, anilist, komga, metadataProviders, statusMappings, seriesStatuses, providerStatuses, apiVersion, indexerVersion] = await Promise.all([ getSettings().catch(() => ({ image_processing: { format: "webp", quality: 85, filter: "lanczos3", max_width: 2160 }, cache: { enabled: true, directory: "/tmp/stripstream-image-cache", max_size_mb: 10000 }, @@ -27,10 +39,12 @@ export default async function SettingsPageWrapper({ searchParams }: { searchPara apiFetch("/series/statuses").catch(() => []), apiFetch("/series/provider-statuses").catch(() => []), apiFetch<{ api?: string }>("/version").catch(() => ({ api: "?" })), + fetchIndexerVersion(), ]); const versions = { api: apiVersion?.api ?? "?", + indexer: indexerVersion, backoffice: packageJson.version, }; diff --git a/apps/indexer/src/api.rs b/apps/indexer/src/api.rs index 21b2bb6..09e7baf 100644 --- a/apps/indexer/src/api.rs +++ b/apps/indexer/src/api.rs @@ -7,6 +7,12 @@ pub async fn health() -> &'static str { "ok" } +pub async fn version() -> Json { + Json(serde_json::json!({ + "indexer": env!("CARGO_PKG_VERSION"), + })) +} + pub async fn ready(State(state): State) -> Result, StatusCode> { sqlx::query("SELECT 1") .execute(&state.pool) diff --git a/apps/indexer/src/main.rs b/apps/indexer/src/main.rs index f9ac32e..48fc151 100644 --- a/apps/indexer/src/main.rs +++ b/apps/indexer/src/main.rs @@ -36,6 +36,7 @@ async fn async_main() -> anyhow::Result<()> { let app = Router::new() .route("/health", get(api::health)) + .route("/version", get(api::version)) .route("/ready", get(api::ready)) .with_state(state.clone());