diff --git a/mobile/openapi/lib/model/maintenance_action.dart b/mobile/openapi/lib/model/maintenance_action.dart index 9be628961f..09ab592092 100644 --- a/mobile/openapi/lib/model/maintenance_action.dart +++ b/mobile/openapi/lib/model/maintenance_action.dart @@ -25,11 +25,13 @@ class MaintenanceAction { static const start = MaintenanceAction._(r'start'); static const end = MaintenanceAction._(r'end'); + static const restoreDatabase = MaintenanceAction._(r'restore_database'); /// List of all possible values in this [enum][MaintenanceAction]. static const values = [ start, end, + restoreDatabase, ]; static MaintenanceAction? fromJson(dynamic value) => MaintenanceActionTypeTransformer().decode(value); @@ -70,6 +72,7 @@ class MaintenanceActionTypeTransformer { switch (data) { case r'start': return MaintenanceAction.start; case r'end': return MaintenanceAction.end; + case r'restore_database': return MaintenanceAction.restoreDatabase; default: if (!allowNull) { throw ArgumentError('Unknown enum value to decode: $data'); diff --git a/mobile/openapi/lib/model/set_maintenance_mode_dto.dart b/mobile/openapi/lib/model/set_maintenance_mode_dto.dart index c724337529..d2fe900d4f 100644 --- a/mobile/openapi/lib/model/set_maintenance_mode_dto.dart +++ b/mobile/openapi/lib/model/set_maintenance_mode_dto.dart @@ -14,25 +14,41 @@ class SetMaintenanceModeDto { /// Returns a new [SetMaintenanceModeDto] instance. SetMaintenanceModeDto({ required this.action, + this.restoreBackupFilename, }); MaintenanceAction action; + /// + /// Please note: This property should have been non-nullable! Since the specification file + /// does not include a default value (using the "default:" property), however, the generated + /// source code must fall back to having a nullable type. + /// Consider adding a "default:" property in the specification file to hide this note. + /// + String? restoreBackupFilename; + @override bool operator ==(Object other) => identical(this, other) || other is SetMaintenanceModeDto && - other.action == action; + other.action == action && + other.restoreBackupFilename == restoreBackupFilename; @override int get hashCode => // ignore: unnecessary_parenthesis - (action.hashCode); + (action.hashCode) + + (restoreBackupFilename == null ? 0 : restoreBackupFilename!.hashCode); @override - String toString() => 'SetMaintenanceModeDto[action=$action]'; + String toString() => 'SetMaintenanceModeDto[action=$action, restoreBackupFilename=$restoreBackupFilename]'; Map toJson() { final json = {}; json[r'action'] = this.action; + if (this.restoreBackupFilename != null) { + json[r'restoreBackupFilename'] = this.restoreBackupFilename; + } else { + // json[r'restoreBackupFilename'] = null; + } return json; } @@ -46,6 +62,7 @@ class SetMaintenanceModeDto { return SetMaintenanceModeDto( action: MaintenanceAction.fromJson(json[r'action'])!, + restoreBackupFilename: mapValueOfType(json, r'restoreBackupFilename'), ); } return null; diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index e89967ae5e..eca7d2ab61 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -16526,7 +16526,8 @@ "MaintenanceAction": { "enum": [ "start", - "end" + "end", + "restore_database" ], "type": "string" }, @@ -19133,6 +19134,9 @@ "$ref": "#/components/schemas/MaintenanceAction" } ] + }, + "restoreBackupFilename": { + "type": "string" } }, "required": [ diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 34ceb56500..df55263031 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -42,6 +42,7 @@ export type ActivityStatisticsResponseDto = { }; export type SetMaintenanceModeDto = { action: MaintenanceAction; + restoreBackupFilename?: string; }; export type MaintenanceLoginDto = { token?: string; @@ -5053,7 +5054,8 @@ export enum UserAvatarColor { } export enum MaintenanceAction { Start = "start", - End = "end" + End = "end", + RestoreDatabase = "restore_database" } export enum NotificationLevel { Success = "success", diff --git a/server/src/services/cli.service.ts b/server/src/services/cli.service.ts index 3d248edc7a..f10a17f689 100644 --- a/server/src/services/cli.service.ts +++ b/server/src/services/cli.service.ts @@ -3,7 +3,7 @@ import { isAbsolute } from 'node:path'; import { SALT_ROUNDS } from 'src/constants'; import { MaintenanceAuthDto } from 'src/dtos/maintenance.dto'; import { UserAdminResponseDto, mapUserAdmin } from 'src/dtos/user.dto'; -import { SystemMetadataKey } from 'src/enum'; +import { MaintenanceAction, SystemMetadataKey } from 'src/enum'; import { BaseService } from 'src/services/base.service'; import { createMaintenanceLoginUrl, generateMaintenanceSecret, sendOneShotAppRestart } from 'src/utils/maintenance'; import { getExternalDomain } from 'src/utils/misc'; @@ -87,6 +87,9 @@ export class CliService extends BaseService { await this.systemMetadataRepository.set(SystemMetadataKey.MaintenanceMode, { isMaintenanceMode: true, secret, + action: { + action: MaintenanceAction.Start, + }, }); sendOneShotAppRestart({