From 770bf7365c47b3be0b5b5ec0be1949d27f75bfdb Mon Sep 17 00:00:00 2001 From: izzy Date: Tue, 6 Jan 2026 13:05:53 +0000 Subject: [PATCH] refactor: split actions into flow/restore --- mobile/openapi/lib/model/maintenance_action.dart | 3 +++ open-api/immich-openapi-specs.json | 1 + open-api/typescript-sdk/src/fetch-client.ts | 1 + server/src/dtos/maintenance.dto.ts | 4 +++- server/src/enum.ts | 1 + server/src/maintenance/maintenance-worker.service.ts | 12 ++++++------ server/src/services/maintenance.service.ts | 2 +- web/src/routes/maintenance/+page.svelte | 6 +++--- 8 files changed, 19 insertions(+), 11 deletions(-) diff --git a/mobile/openapi/lib/model/maintenance_action.dart b/mobile/openapi/lib/model/maintenance_action.dart index 09ab592092..59cfd0b21f 100644 --- a/mobile/openapi/lib/model/maintenance_action.dart +++ b/mobile/openapi/lib/model/maintenance_action.dart @@ -25,12 +25,14 @@ class MaintenanceAction { static const start = MaintenanceAction._(r'start'); static const end = MaintenanceAction._(r'end'); + static const selectDatabaseRestore = MaintenanceAction._(r'select_database_restore'); static const restoreDatabase = MaintenanceAction._(r'restore_database'); /// List of all possible values in this [enum][MaintenanceAction]. static const values = [ start, end, + selectDatabaseRestore, restoreDatabase, ]; @@ -72,6 +74,7 @@ class MaintenanceActionTypeTransformer { switch (data) { case r'start': return MaintenanceAction.start; case r'end': return MaintenanceAction.end; + case r'select_database_restore': return MaintenanceAction.selectDatabaseRestore; case r'restore_database': return MaintenanceAction.restoreDatabase; default: if (!allowNull) { diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 7895d4d628..27013ccc00 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -17317,6 +17317,7 @@ "enum": [ "start", "end", + "select_database_restore", "restore_database" ], "type": "string" diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index e95293628c..eff9af76c9 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -5264,6 +5264,7 @@ export enum UserAvatarColor { export enum MaintenanceAction { Start = "start", End = "end", + SelectDatabaseRestore = "select_database_restore", RestoreDatabase = "restore_database" } export enum StorageFolder { diff --git a/server/src/dtos/maintenance.dto.ts b/server/src/dtos/maintenance.dto.ts index 8eff1decd8..4b8c39c55e 100644 --- a/server/src/dtos/maintenance.dto.ts +++ b/server/src/dtos/maintenance.dto.ts @@ -1,3 +1,4 @@ +import { ValidateIf } from 'class-validator'; import { MaintenanceAction, StorageFolder } from 'src/enum'; import { ValidateEnum, ValidateString } from 'src/validation'; @@ -5,7 +6,8 @@ export class SetMaintenanceModeDto { @ValidateEnum({ enum: MaintenanceAction, name: 'MaintenanceAction' }) action!: MaintenanceAction; - @ValidateString({ optional: true }) + @ValidateIf((o) => o.action === MaintenanceAction.RestoreDatabase) + @ValidateString() restoreBackupFilename?: string; } diff --git a/server/src/enum.ts b/server/src/enum.ts index 7ee56222ab..73ef4747bb 100644 --- a/server/src/enum.ts +++ b/server/src/enum.ts @@ -696,6 +696,7 @@ export enum DatabaseLock { export enum MaintenanceAction { Start = 'start', End = 'end', + SelectDatabaseRestore = 'select_database_restore', RestoreDatabase = 'restore_database', } diff --git a/server/src/maintenance/maintenance-worker.service.ts b/server/src/maintenance/maintenance-worker.service.ts index 7904c76be0..c3ac5f596d 100644 --- a/server/src/maintenance/maintenance-worker.service.ts +++ b/server/src/maintenance/maintenance-worker.service.ts @@ -303,12 +303,8 @@ export class MaintenanceWorkerService { case MaintenanceAction.End: { return this.endMaintenance(); } - case MaintenanceAction.RestoreDatabase: { - if (!action.restoreBackupFilename) { - return; - } - - break; + case MaintenanceAction.SelectDatabaseRestore: { + return; } } @@ -330,6 +326,10 @@ export class MaintenanceWorkerService { try { switch (action.action) { case MaintenanceAction.RestoreDatabase: { + if (!action.restoreBackupFilename) { + throw new Error("Expected restoreBackupFilename but it's missing!"); + } + await this.restoreBackup(action.restoreBackupFilename); break; } diff --git a/server/src/services/maintenance.service.ts b/server/src/services/maintenance.service.ts index 7cde1c010c..8e711ef380 100644 --- a/server/src/services/maintenance.service.ts +++ b/server/src/services/maintenance.service.ts @@ -65,7 +65,7 @@ export class MaintenanceService extends BaseService { return this.startMaintenance( { - action: MaintenanceAction.RestoreDatabase, + action: MaintenanceAction.SelectDatabaseRestore, }, 'admin', ); diff --git a/web/src/routes/maintenance/+page.svelte b/web/src/routes/maintenance/+page.svelte index 12910e63bd..235d587e6f 100644 --- a/web/src/routes/maintenance/+page.svelte +++ b/web/src/routes/maintenance/+page.svelte @@ -31,11 +31,11 @@
- {#if $status?.action === MaintenanceAction.RestoreDatabase && $status.task} + {#if $status?.action === MaintenanceAction.RestoreDatabase} {$t('maintenance_action_restore')} {#if $status.error} @@ -51,7 +51,7 @@ {$t('maintenance_task_restore')} {/if} {/if} - {:else if $status?.action === MaintenanceAction.RestoreDatabase && $auth} + {:else if $status?.action === MaintenanceAction.SelectDatabaseRestore && $auth} {:else} {$t('maintenance_title')}