From 5383cdef60e99ff943f9666c1c69c25e2eed23bd Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Sat, 21 Mar 2026 13:42:08 +0100 Subject: [PATCH] feat: allow batch metadata and refresh metadata on all libraries When no specific library is selected, iterate over all libraries and trigger a job for each one, skipping libraries with metadata disabled. Co-Authored-By: Claude Opus 4.6 --- apps/backoffice/app/jobs/page.tsx | 67 ++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/apps/backoffice/app/jobs/page.tsx b/apps/backoffice/app/jobs/page.tsx index 4c27aed..1c066d0 100644 --- a/apps/backoffice/app/jobs/page.tsx +++ b/apps/backoffice/app/jobs/page.tsx @@ -60,30 +60,62 @@ export default async function JobsPage({ searchParams }: { searchParams: Promise async function triggerMetadataBatch(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; - if (!libraryId) return; - let result; - try { - result = await startMetadataBatch(libraryId); - } catch { - // Library may have metadata disabled — ignore silently - return; + if (libraryId) { + let result; + try { + result = await startMetadataBatch(libraryId); + } catch { + // Library may have metadata disabled — ignore silently + return; + } + revalidatePath("/jobs"); + redirect(`/jobs?highlight=${result.id}`); + } else { + // All libraries — skip those with metadata disabled + const allLibraries = await fetchLibraries().catch(() => [] as LibraryDto[]); + let lastId: string | undefined; + for (const lib of allLibraries) { + if (lib.metadata_provider === "none") continue; + try { + const result = await startMetadataBatch(lib.id); + if (result.status !== "already_running") lastId = result.id; + } catch { + // Library may have metadata disabled or other issue — skip + } + } + revalidatePath("/jobs"); + redirect(lastId ? `/jobs?highlight=${lastId}` : "/jobs"); } - revalidatePath("/jobs"); - redirect(`/jobs?highlight=${result.id}`); } async function triggerMetadataRefresh(formData: FormData) { "use server"; const libraryId = formData.get("library_id") as string; - if (!libraryId) return; - let result; - try { - result = await startMetadataRefresh(libraryId); - } catch { - return; + if (libraryId) { + let result; + try { + result = await startMetadataRefresh(libraryId); + } catch { + return; + } + revalidatePath("/jobs"); + redirect(`/jobs?highlight=${result.id}`); + } else { + // All libraries — skip those with metadata disabled + const allLibraries = await fetchLibraries().catch(() => [] as LibraryDto[]); + let lastId: string | undefined; + for (const lib of allLibraries) { + if (lib.metadata_provider === "none") continue; + try { + const result = await startMetadataRefresh(lib.id); + if (result.status !== "already_running") lastId = result.id; + } catch { + // Library may have metadata disabled or no approved links — skip + } + } + revalidatePath("/jobs"); + redirect(lastId ? `/jobs?highlight=${lastId}` : "/jobs"); } - revalidatePath("/jobs"); - redirect(`/jobs?highlight=${result.id}`); } return ( @@ -197,7 +229,6 @@ export default async function JobsPage({ searchParams }: { searchParams: Promise {t("jobs.groupMetadata")} - ({t("jobs.requiresLibrary")})