From 72d7f9b3d8740739ce9dd7fb5bcdd81319dd0dfa Mon Sep 17 00:00:00 2001 From: izzy Date: Wed, 7 Jan 2026 11:21:54 +0000 Subject: [PATCH] refactor: use events for web//services --- open-api/immich-openapi-specs.json | 28 ++++++------ .../maintenance/MaintenanceBackupsList.svelte | 44 +++++++++++-------- .../maintenance/MaintenanceRestoreFlow.svelte | 2 +- web/src/lib/managers/event-manager.svelte.ts | 3 ++ .../lib/services/database-backups.service.ts | 29 ++++++++---- web/src/routes/admin/maintenance/+page.svelte | 2 +- 6 files changed, 65 insertions(+), 43 deletions(-) diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 27013ccc00..50b33febbf 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -360,11 +360,11 @@ "x-immich-admin-only": true, "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -405,11 +405,11 @@ "x-immich-admin-only": true, "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -433,11 +433,11 @@ ], "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -483,11 +483,11 @@ "x-immich-admin-only": true, "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -541,11 +541,11 @@ "x-immich-admin-only": true, "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -638,11 +638,11 @@ "x-immich-admin-only": true, "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], @@ -717,11 +717,11 @@ ], "x-immich-history": [ { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Added" }, { - "version": "v2.4.0", + "version": "v2.5.0", "state": "Alpha" } ], diff --git a/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte b/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte index 6d62fbd6c6..30a56fac62 100644 --- a/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte +++ b/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte @@ -1,7 +1,7 @@ + + {#if uploadProgress === -1} {$t('admin.maintenance_upload_backup')} - + {:else} diff --git a/web/src/lib/components/maintenance/MaintenanceRestoreFlow.svelte b/web/src/lib/components/maintenance/MaintenanceRestoreFlow.svelte index 5e767aff35..38c0aef9f9 100644 --- a/web/src/lib/components/maintenance/MaintenanceRestoreFlow.svelte +++ b/web/src/lib/components/maintenance/MaintenanceRestoreFlow.svelte @@ -19,7 +19,7 @@ detectedInstall = await detectPriorInstall(); } - onMount(reload); + onMount(() => void reload()); {#if stage === 0} diff --git a/web/src/lib/managers/event-manager.svelte.ts b/web/src/lib/managers/event-manager.svelte.ts index 6038c3c3f0..75861add66 100644 --- a/web/src/lib/managers/event-manager.svelte.ts +++ b/web/src/lib/managers/event-manager.svelte.ts @@ -29,6 +29,9 @@ export type Events = { AlbumUpdate: [AlbumResponseDto]; AlbumDelete: [AlbumResponseDto]; + BackupDelete: [{ filename: string; isDeleting: boolean; isDeleted: boolean }]; + BackupUpload: [{ progress: number; isComplete: boolean }]; + QueueUpdate: [QueueResponseDto]; SharedLinkCreate: [SharedLinkResponseDto]; diff --git a/web/src/lib/services/database-backups.service.ts b/web/src/lib/services/database-backups.service.ts index 540d532e92..1a9a9f126a 100644 --- a/web/src/lib/services/database-backups.service.ts +++ b/web/src/lib/services/database-backups.service.ts @@ -1,3 +1,4 @@ +import { eventManager } from '$lib/managers/event-manager.svelte'; import { uploadRequest } from '$lib/utils'; import { openFilePicker } from '$lib/utils/file-uploader'; import { handleError } from '$lib/utils/handle-error'; @@ -13,7 +14,7 @@ import { modalManager, type ActionItem } from '@immich/ui'; import { mdiDownload, mdiTrashCanOutline } from '@mdi/js'; import type { MessageFormatter } from 'svelte-i18n'; -export const getDatabaseBackupActions = ($t: MessageFormatter, filename: string, remove: () => void) => { +export const getDatabaseBackupActions = ($t: MessageFormatter, filename: string) => { const Download: ActionItem = { title: $t('download'), icon: mdiDownload, @@ -26,7 +27,9 @@ export const getDatabaseBackupActions = ($t: MessageFormatter, filename: string, title: $t('delete'), icon: mdiTrashCanOutline, color: 'danger', - onAction: remove, + onAction() { + void handleDeleteDatabaseBackup(filename); + }, }; return { Download, Delete }; @@ -69,15 +72,25 @@ export const handleDeleteDatabaseBackup = async (...filenames: string[]) => { } try { + for (const filename of filenames) { + eventManager.emit('BackupDelete', { filename, isDeleting: true, isDeleted: false }); + } + await deleteDatabaseBackup({ databaseBackupDeleteDto: { backups: filenames, }, }); - return true; + for (const filename of filenames) { + eventManager.emit('BackupDelete', { filename, isDeleting: false, isDeleted: true }); + } } catch (error) { handleError(error, $t('admin.maintenance_delete_error')); + + for (const filename of filenames) { + eventManager.emit('BackupDelete', { filename, isDeleting: false, isDeleted: false }); + } } }; @@ -85,7 +98,7 @@ export const handleDownloadDatabaseBackup = (filename: string) => { location.href = getBaseUrl() + '/admin/database-backups/' + filename; }; -export const handleUploadDatabaseBackup = async (progressFn?: (progress: number) => void) => { +export const handleUploadDatabaseBackup = async () => { const $t = await getFormatter(); try { @@ -97,16 +110,14 @@ export const handleUploadDatabaseBackup = async (progressFn?: (progress: number) url: getBaseUrl() + '/admin/database-backups/upload', data: formData, onUploadProgress(event) { - progressFn?.(event.loaded / event.total); + eventManager.emit('BackupUpload', { progress: event.loaded / event.total, isComplete: false }); }, }); - progressFn?.(1); - - return true; + eventManager.emit('BackupUpload', { progress: 1, isComplete: true }); } catch (error) { handleError(error, $t('admin.maintenance_upload_backup_error')); } finally { - progressFn?.(-1); + eventManager.emit('BackupUpload', { progress: -1, isComplete: false }); } }; diff --git a/web/src/routes/admin/maintenance/+page.svelte b/web/src/routes/admin/maintenance/+page.svelte index 0e90682f4e..74d09e5a61 100644 --- a/web/src/routes/admin/maintenance/+page.svelte +++ b/web/src/routes/admin/maintenance/+page.svelte @@ -19,7 +19,7 @@
-
+