diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 0cc686df3b..3989553bb9 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -133,11 +133,11 @@ Class | Method | HTTP request | Description *AuthenticationApi* | [**unlockAuthSession**](doc//AuthenticationApi.md#unlockauthsession) | **POST** /auth/session/unlock | Unlock auth session *AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | Validate access token *AuthenticationAdminApi* | [**unlinkAllOAuthAccountsAdmin**](doc//AuthenticationAdminApi.md#unlinkalloauthaccountsadmin) | **POST** /admin/auth/unlink-all | Unlink all OAuth accounts -*DatabaseBackupsAdminApi* | [**deleteBackup**](doc//DatabaseBackupsAdminApi.md#deletebackup) | **DELETE** /admin/database-backups/{filename} | Delete backup -*DatabaseBackupsAdminApi* | [**downloadBackup**](doc//DatabaseBackupsAdminApi.md#downloadbackup) | **GET** /admin/database-backups/{filename} | Download backup -*DatabaseBackupsAdminApi* | [**listBackups**](doc//DatabaseBackupsAdminApi.md#listbackups) | **GET** /admin/database-backups | List backups -*DatabaseBackupsAdminApi* | [**startRestoreFlow**](doc//DatabaseBackupsAdminApi.md#startrestoreflow) | **POST** /admin/database-backups/start-restore | Start backup restore flow -*DatabaseBackupsAdminApi* | [**uploadBackup**](doc//DatabaseBackupsAdminApi.md#uploadbackup) | **POST** /admin/database-backups/upload | Upload database backup +*DatabaseBackupsAdminApi* | [**deleteDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup) | **DELETE** /admin/database-backups/{filename} | Delete database backup +*DatabaseBackupsAdminApi* | [**downloadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#downloaddatabasebackup) | **GET** /admin/database-backups/{filename} | Download database backup +*DatabaseBackupsAdminApi* | [**listDatabaseBackups**](doc//DatabaseBackupsAdminApi.md#listdatabasebackups) | **GET** /admin/database-backups | List database backups +*DatabaseBackupsAdminApi* | [**startDatabaseRestoreFlow**](doc//DatabaseBackupsAdminApi.md#startdatabaserestoreflow) | **POST** /admin/database-backups/start-restore | Start database backup restore flow +*DatabaseBackupsAdminApi* | [**uploadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#uploaddatabasebackup) | **POST** /admin/database-backups/upload | Upload database backup *DeprecatedApi* | [**createPartnerDeprecated**](doc//DeprecatedApi.md#createpartnerdeprecated) | **POST** /partners/{id} | Create a partner *DeprecatedApi* | [**getAllUserAssetsByDeviceId**](doc//DeprecatedApi.md#getalluserassetsbydeviceid) | **GET** /assets/device/{deviceId} | Retrieve assets by device ID *DeprecatedApi* | [**getDeltaSync**](doc//DeprecatedApi.md#getdeltasync) | **POST** /sync/delta-sync | Get delta sync for user @@ -423,11 +423,11 @@ Class | Method | HTTP request | Description - [MachineLearningAvailabilityChecksDto](doc//MachineLearningAvailabilityChecksDto.md) - [MaintenanceAction](doc//MaintenanceAction.md) - [MaintenanceAuthDto](doc//MaintenanceAuthDto.md) - - [MaintenanceIntegrityResponseDto](doc//MaintenanceIntegrityResponseDto.md) + - [MaintenanceDetectInstallResponseDto](doc//MaintenanceDetectInstallResponseDto.md) + - [MaintenanceDetectInstallStorageFolderDto](doc//MaintenanceDetectInstallStorageFolderDto.md) - [MaintenanceListBackupsResponseDto](doc//MaintenanceListBackupsResponseDto.md) - [MaintenanceLoginDto](doc//MaintenanceLoginDto.md) - [MaintenanceStatusResponseDto](doc//MaintenanceStatusResponseDto.md) - - [MaintenanceStorageFolderIntegrityDto](doc//MaintenanceStorageFolderIntegrityDto.md) - [ManualJobName](doc//ManualJobName.md) - [MapMarkerResponseDto](doc//MapMarkerResponseDto.md) - [MapReverseGeocodeResponseDto](doc//MapReverseGeocodeResponseDto.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 199ddd12e7..4b89f85c86 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -169,11 +169,11 @@ part 'model/logout_response_dto.dart'; part 'model/machine_learning_availability_checks_dto.dart'; part 'model/maintenance_action.dart'; part 'model/maintenance_auth_dto.dart'; -part 'model/maintenance_integrity_response_dto.dart'; +part 'model/maintenance_detect_install_response_dto.dart'; +part 'model/maintenance_detect_install_storage_folder_dto.dart'; part 'model/maintenance_list_backups_response_dto.dart'; part 'model/maintenance_login_dto.dart'; part 'model/maintenance_status_response_dto.dart'; -part 'model/maintenance_storage_folder_integrity_dto.dart'; part 'model/manual_job_name.dart'; part 'model/map_marker_response_dto.dart'; part 'model/map_reverse_geocode_response_dto.dart'; diff --git a/mobile/openapi/lib/api/database_backups_admin_api.dart b/mobile/openapi/lib/api/database_backups_admin_api.dart index 4f2889d0e7..54ac5ac0ae 100644 --- a/mobile/openapi/lib/api/database_backups_admin_api.dart +++ b/mobile/openapi/lib/api/database_backups_admin_api.dart @@ -16,7 +16,7 @@ class DatabaseBackupsAdminApi { final ApiClient apiClient; - /// Delete backup + /// Delete database backup /// /// Delete a backup by its filename /// @@ -25,7 +25,7 @@ class DatabaseBackupsAdminApi { /// Parameters: /// /// * [String] filename (required): - Future deleteBackupWithHttpInfo(String filename,) async { + Future deleteDatabaseBackupWithHttpInfo(String filename,) async { // ignore: prefer_const_declarations final apiPath = r'/admin/database-backups/{filename}' .replaceAll('{filename}', filename); @@ -51,21 +51,21 @@ class DatabaseBackupsAdminApi { ); } - /// Delete backup + /// Delete database backup /// /// Delete a backup by its filename /// /// Parameters: /// /// * [String] filename (required): - Future deleteBackup(String filename,) async { - final response = await deleteBackupWithHttpInfo(filename,); + Future deleteDatabaseBackup(String filename,) async { + final response = await deleteDatabaseBackupWithHttpInfo(filename,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } } - /// Download backup + /// Download database backup /// /// Downloads the database backup file /// @@ -74,7 +74,7 @@ class DatabaseBackupsAdminApi { /// Parameters: /// /// * [String] filename (required): - Future downloadBackupWithHttpInfo(String filename,) async { + Future downloadDatabaseBackupWithHttpInfo(String filename,) async { // ignore: prefer_const_declarations final apiPath = r'/admin/database-backups/{filename}' .replaceAll('{filename}', filename); @@ -100,15 +100,15 @@ class DatabaseBackupsAdminApi { ); } - /// Download backup + /// Download database backup /// /// Downloads the database backup file /// /// Parameters: /// /// * [String] filename (required): - Future downloadBackup(String filename,) async { - final response = await downloadBackupWithHttpInfo(filename,); + Future downloadDatabaseBackup(String filename,) async { + final response = await downloadDatabaseBackupWithHttpInfo(filename,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -122,12 +122,12 @@ class DatabaseBackupsAdminApi { return null; } - /// List backups + /// List database backups /// /// Get the list of the successful and failed backups /// /// Note: This method returns the HTTP [Response]. - Future listBackupsWithHttpInfo() async { + Future listDatabaseBackupsWithHttpInfo() async { // ignore: prefer_const_declarations final apiPath = r'/admin/database-backups'; @@ -152,11 +152,11 @@ class DatabaseBackupsAdminApi { ); } - /// List backups + /// List database backups /// /// Get the list of the successful and failed backups - Future listBackups() async { - final response = await listBackupsWithHttpInfo(); + Future listDatabaseBackups() async { + final response = await listDatabaseBackupsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -170,12 +170,12 @@ class DatabaseBackupsAdminApi { return null; } - /// Start backup restore flow + /// Start database backup restore flow /// /// Put Immich into maintenance mode to restore a backup (Immich must not be configured) /// /// Note: This method returns the HTTP [Response]. - Future startRestoreFlowWithHttpInfo() async { + Future startDatabaseRestoreFlowWithHttpInfo() async { // ignore: prefer_const_declarations final apiPath = r'/admin/database-backups/start-restore'; @@ -200,11 +200,11 @@ class DatabaseBackupsAdminApi { ); } - /// Start backup restore flow + /// Start database backup restore flow /// /// Put Immich into maintenance mode to restore a backup (Immich must not be configured) - Future startRestoreFlow() async { - final response = await startRestoreFlowWithHttpInfo(); + Future startDatabaseRestoreFlow() async { + final response = await startDatabaseRestoreFlowWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } @@ -219,7 +219,7 @@ class DatabaseBackupsAdminApi { /// Parameters: /// /// * [MultipartFile] file: - Future uploadBackupWithHttpInfo({ MultipartFile? file, }) async { + Future uploadDatabaseBackupWithHttpInfo({ MultipartFile? file, }) async { // ignore: prefer_const_declarations final apiPath = r'/admin/database-backups/upload'; @@ -261,8 +261,8 @@ class DatabaseBackupsAdminApi { /// Parameters: /// /// * [MultipartFile] file: - Future uploadBackup({ MultipartFile? file, }) async { - final response = await uploadBackupWithHttpInfo( file: file, ); + Future uploadDatabaseBackup({ MultipartFile? file, }) async { + final response = await uploadDatabaseBackupWithHttpInfo( file: file, ); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); } diff --git a/mobile/openapi/lib/api/maintenance_admin_api.dart b/mobile/openapi/lib/api/maintenance_admin_api.dart index dce1aa1dac..0f953f1634 100644 --- a/mobile/openapi/lib/api/maintenance_admin_api.dart +++ b/mobile/openapi/lib/api/maintenance_admin_api.dart @@ -49,7 +49,7 @@ class MaintenanceAdminApi { /// Detect existing install /// /// Collect integrity checks and other heuristics about local data. - Future detectPriorInstall() async { + Future detectPriorInstall() async { final response = await detectPriorInstallWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); @@ -58,7 +58,7 @@ class MaintenanceAdminApi { // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" // FormatException when trying to decode an empty string. if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { - return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceIntegrityResponseDto',) as MaintenanceIntegrityResponseDto; + return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceDetectInstallResponseDto',) as MaintenanceDetectInstallResponseDto; } return null; diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index c7bd6f3a1d..5a38a80c91 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -384,16 +384,16 @@ class ApiClient { return MaintenanceActionTypeTransformer().decode(value); case 'MaintenanceAuthDto': return MaintenanceAuthDto.fromJson(value); - case 'MaintenanceIntegrityResponseDto': - return MaintenanceIntegrityResponseDto.fromJson(value); + case 'MaintenanceDetectInstallResponseDto': + return MaintenanceDetectInstallResponseDto.fromJson(value); + case 'MaintenanceDetectInstallStorageFolderDto': + return MaintenanceDetectInstallStorageFolderDto.fromJson(value); case 'MaintenanceListBackupsResponseDto': return MaintenanceListBackupsResponseDto.fromJson(value); case 'MaintenanceLoginDto': return MaintenanceLoginDto.fromJson(value); case 'MaintenanceStatusResponseDto': return MaintenanceStatusResponseDto.fromJson(value); - case 'MaintenanceStorageFolderIntegrityDto': - return MaintenanceStorageFolderIntegrityDto.fromJson(value); case 'ManualJobName': return ManualJobNameTypeTransformer().decode(value); case 'MapMarkerResponseDto': diff --git a/mobile/openapi/lib/model/maintenance_integrity_response_dto.dart b/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart similarity index 51% rename from mobile/openapi/lib/model/maintenance_integrity_response_dto.dart rename to mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart index 1c47a6989b..1c364a6fdc 100644 --- a/mobile/openapi/lib/model/maintenance_integrity_response_dto.dart +++ b/mobile/openapi/lib/model/maintenance_detect_install_response_dto.dart @@ -10,16 +10,16 @@ part of openapi.api; -class MaintenanceIntegrityResponseDto { - /// Returns a new [MaintenanceIntegrityResponseDto] instance. - MaintenanceIntegrityResponseDto({ +class MaintenanceDetectInstallResponseDto { + /// Returns a new [MaintenanceDetectInstallResponseDto] instance. + MaintenanceDetectInstallResponseDto({ this.storage = const [], }); - List storage; + List storage; @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceIntegrityResponseDto && + bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallResponseDto && _deepEquality.equals(other.storage, storage); @override @@ -28,7 +28,7 @@ class MaintenanceIntegrityResponseDto { (storage.hashCode); @override - String toString() => 'MaintenanceIntegrityResponseDto[storage=$storage]'; + String toString() => 'MaintenanceDetectInstallResponseDto[storage=$storage]'; Map toJson() { final json = {}; @@ -36,26 +36,26 @@ class MaintenanceIntegrityResponseDto { return json; } - /// Returns a new [MaintenanceIntegrityResponseDto] instance and imports its values from + /// Returns a new [MaintenanceDetectInstallResponseDto] instance and imports its values from /// [value] if it's a [Map], null otherwise. // ignore: prefer_constructors_over_static_methods - static MaintenanceIntegrityResponseDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceIntegrityResponseDto"); + static MaintenanceDetectInstallResponseDto? fromJson(dynamic value) { + upgradeDto(value, "MaintenanceDetectInstallResponseDto"); if (value is Map) { final json = value.cast(); - return MaintenanceIntegrityResponseDto( - storage: MaintenanceStorageFolderIntegrityDto.listFromJson(json[r'storage']), + return MaintenanceDetectInstallResponseDto( + storage: MaintenanceDetectInstallStorageFolderDto.listFromJson(json[r'storage']), ); } return null; } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; if (json is List && json.isNotEmpty) { for (final row in json) { - final value = MaintenanceIntegrityResponseDto.fromJson(row); + final value = MaintenanceDetectInstallResponseDto.fromJson(row); if (value != null) { result.add(value); } @@ -64,12 +64,12 @@ class MaintenanceIntegrityResponseDto { return result.toList(growable: growable); } - static Map mapFromJson(dynamic json) { - final map = {}; + static Map mapFromJson(dynamic json) { + final map = {}; if (json is Map && json.isNotEmpty) { json = json.cast(); // ignore: parameter_assignments for (final entry in json.entries) { - final value = MaintenanceIntegrityResponseDto.fromJson(entry.value); + final value = MaintenanceDetectInstallResponseDto.fromJson(entry.value); if (value != null) { map[entry.key] = value; } @@ -78,14 +78,14 @@ class MaintenanceIntegrityResponseDto { return map; } - // maps a json object with a list of MaintenanceIntegrityResponseDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; + // maps a json object with a list of MaintenanceDetectInstallResponseDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; if (json is Map && json.isNotEmpty) { // ignore: parameter_assignments json = json.cast(); for (final entry in json.entries) { - map[entry.key] = MaintenanceIntegrityResponseDto.listFromJson(entry.value, growable: growable,); + map[entry.key] = MaintenanceDetectInstallResponseDto.listFromJson(entry.value, growable: growable,); } } return map; diff --git a/mobile/openapi/lib/model/maintenance_storage_folder_integrity_dto.dart b/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart similarity index 60% rename from mobile/openapi/lib/model/maintenance_storage_folder_integrity_dto.dart rename to mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart index 364e096e5b..e2a1e35dea 100644 --- a/mobile/openapi/lib/model/maintenance_storage_folder_integrity_dto.dart +++ b/mobile/openapi/lib/model/maintenance_detect_install_storage_folder_dto.dart @@ -10,9 +10,9 @@ part of openapi.api; -class MaintenanceStorageFolderIntegrityDto { - /// Returns a new [MaintenanceStorageFolderIntegrityDto] instance. - MaintenanceStorageFolderIntegrityDto({ +class MaintenanceDetectInstallStorageFolderDto { + /// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance. + MaintenanceDetectInstallStorageFolderDto({ required this.files, required this.folder, required this.readable, @@ -28,7 +28,7 @@ class MaintenanceStorageFolderIntegrityDto { bool writable; @override - bool operator ==(Object other) => identical(this, other) || other is MaintenanceStorageFolderIntegrityDto && + bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallStorageFolderDto && other.files == files && other.folder == folder && other.readable == readable && @@ -43,7 +43,7 @@ class MaintenanceStorageFolderIntegrityDto { (writable.hashCode); @override - String toString() => 'MaintenanceStorageFolderIntegrityDto[files=$files, folder=$folder, readable=$readable, writable=$writable]'; + String toString() => 'MaintenanceDetectInstallStorageFolderDto[files=$files, folder=$folder, readable=$readable, writable=$writable]'; Map toJson() { final json = {}; @@ -54,15 +54,15 @@ class MaintenanceStorageFolderIntegrityDto { return json; } - /// Returns a new [MaintenanceStorageFolderIntegrityDto] instance and imports its values from + /// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance and imports its values from /// [value] if it's a [Map], null otherwise. // ignore: prefer_constructors_over_static_methods - static MaintenanceStorageFolderIntegrityDto? fromJson(dynamic value) { - upgradeDto(value, "MaintenanceStorageFolderIntegrityDto"); + static MaintenanceDetectInstallStorageFolderDto? fromJson(dynamic value) { + upgradeDto(value, "MaintenanceDetectInstallStorageFolderDto"); if (value is Map) { final json = value.cast(); - return MaintenanceStorageFolderIntegrityDto( + return MaintenanceDetectInstallStorageFolderDto( files: num.parse('${json[r'files']}'), folder: StorageFolder.fromJson(json[r'folder'])!, readable: mapValueOfType(json, r'readable')!, @@ -72,11 +72,11 @@ class MaintenanceStorageFolderIntegrityDto { return null; } - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; if (json is List && json.isNotEmpty) { for (final row in json) { - final value = MaintenanceStorageFolderIntegrityDto.fromJson(row); + final value = MaintenanceDetectInstallStorageFolderDto.fromJson(row); if (value != null) { result.add(value); } @@ -85,12 +85,12 @@ class MaintenanceStorageFolderIntegrityDto { return result.toList(growable: growable); } - static Map mapFromJson(dynamic json) { - final map = {}; + static Map mapFromJson(dynamic json) { + final map = {}; if (json is Map && json.isNotEmpty) { json = json.cast(); // ignore: parameter_assignments for (final entry in json.entries) { - final value = MaintenanceStorageFolderIntegrityDto.fromJson(entry.value); + final value = MaintenanceDetectInstallStorageFolderDto.fromJson(entry.value); if (value != null) { map[entry.key] = value; } @@ -99,14 +99,14 @@ class MaintenanceStorageFolderIntegrityDto { return map; } - // maps a json object with a list of MaintenanceStorageFolderIntegrityDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; + // maps a json object with a list of MaintenanceDetectInstallStorageFolderDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; if (json is Map && json.isNotEmpty) { // ignore: parameter_assignments json = json.cast(); for (final entry in json.entries) { - map[entry.key] = MaintenanceStorageFolderIntegrityDto.listFromJson(entry.value, growable: growable,); + map[entry.key] = MaintenanceDetectInstallStorageFolderDto.listFromJson(entry.value, growable: growable,); } } return map; diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index b1996ba7ff..f185de44d6 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -325,7 +325,7 @@ "/admin/database-backups": { "get": { "description": "Get the list of the successful and failed backups", - "operationId": "listBackups", + "operationId": "listDatabaseBackups", "parameters": [], "responses": { "200": { @@ -350,7 +350,7 @@ "api_key": [] } ], - "summary": "List backups", + "summary": "List database backups", "tags": [ "Database Backups (admin)" ], @@ -372,14 +372,14 @@ "/admin/database-backups/start-restore": { "post": { "description": "Put Immich into maintenance mode to restore a backup (Immich must not be configured)", - "operationId": "startRestoreFlow", + "operationId": "startDatabaseRestoreFlow", "parameters": [], "responses": { "201": { "description": "" } }, - "summary": "Start backup restore flow", + "summary": "Start database backup restore flow", "tags": [ "Database Backups (admin)" ], @@ -399,7 +399,7 @@ "/admin/database-backups/upload": { "post": { "description": "Uploads .sql/.sql.gz file to restore backup from", - "operationId": "uploadBackup", + "operationId": "uploadDatabaseBackup", "parameters": [], "requestBody": { "content": { @@ -450,7 +450,7 @@ "/admin/database-backups/{filename}": { "delete": { "description": "Delete a backup by its filename", - "operationId": "deleteBackup", + "operationId": "deleteDatabaseBackup", "parameters": [ { "name": "filename", @@ -478,7 +478,7 @@ "api_key": [] } ], - "summary": "Delete backup", + "summary": "Delete database backup", "tags": [ "Database Backups (admin)" ], @@ -498,7 +498,7 @@ }, "get": { "description": "Downloads the database backup file", - "operationId": "downloadBackup", + "operationId": "downloadDatabaseBackup", "parameters": [ { "name": "filename", @@ -534,7 +534,7 @@ "api_key": [] } ], - "summary": "Download backup", + "summary": "Download database backup", "tags": [ "Database Backups (admin)" ], diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 418255116c..9512b64d2c 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -50,14 +50,14 @@ export type SetMaintenanceModeDto = { action: MaintenanceAction; restoreBackupFilename?: string; }; -export type MaintenanceStorageFolderIntegrityDto = { +export type MaintenanceDetectInstallStorageFolderDto = { files: number; folder: StorageFolder; readable: boolean; writable: boolean; }; -export type MaintenanceIntegrityResponseDto = { - storage: MaintenanceStorageFolderIntegrityDto[]; +export type MaintenanceDetectInstallResponseDto = { + storage: MaintenanceDetectInstallStorageFolderDto[]; }; export type MaintenanceLoginDto = { token?: string; @@ -1874,9 +1874,9 @@ export function unlinkAllOAuthAccountsAdmin(opts?: Oazapfts.RequestOpts) { })); } /** - * List backups + * List database backups */ -export function listBackups(opts?: Oazapfts.RequestOpts) { +export function listDatabaseBackups(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; data: MaintenanceListBackupsResponseDto; @@ -1885,9 +1885,9 @@ export function listBackups(opts?: Oazapfts.RequestOpts) { })); } /** - * Start backup restore flow + * Start database backup restore flow */ -export function startRestoreFlow(opts?: Oazapfts.RequestOpts) { +export function startDatabaseRestoreFlow(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/start-restore", { ...opts, method: "POST" @@ -1896,7 +1896,7 @@ export function startRestoreFlow(opts?: Oazapfts.RequestOpts) { /** * Upload database backup */ -export function uploadBackup({ maintenanceUploadBackupDto }: { +export function uploadDatabaseBackup({ maintenanceUploadBackupDto }: { maintenanceUploadBackupDto: MaintenanceUploadBackupDto; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/upload", oazapfts.multipart({ @@ -1906,9 +1906,9 @@ export function uploadBackup({ maintenanceUploadBackupDto }: { }))); } /** - * Delete backup + * Delete database backup */ -export function deleteBackup({ filename }: { +export function deleteDatabaseBackup({ filename }: { filename: string; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchText(`/admin/database-backups/${encodeURIComponent(filename)}`, { @@ -1917,9 +1917,9 @@ export function deleteBackup({ filename }: { })); } /** - * Download backup + * Download database backup */ -export function downloadBackup({ filename }: { +export function downloadDatabaseBackup({ filename }: { filename: string; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchBlob<{ @@ -1947,7 +1947,7 @@ export function setMaintenanceMode({ setMaintenanceModeDto }: { export function detectPriorInstall(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; - data: MaintenanceIntegrityResponseDto; + data: MaintenanceDetectInstallResponseDto; }>("/admin/maintenance/detect-install", { ...opts })); diff --git a/server/src/controllers/database-backup.controller.ts b/server/src/controllers/database-backup.controller.ts index 5cbe212d6b..dd8a69356b 100644 --- a/server/src/controllers/database-backup.controller.ts +++ b/server/src/controllers/database-backup.controller.ts @@ -25,24 +25,24 @@ export class DatabaseBackupController { @Get() @Endpoint({ - summary: 'List backups', + summary: 'List database backups', description: 'Get the list of the successful and failed backups', history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'), }) @Authenticated({ permission: Permission.Maintenance, admin: true }) - listBackups(): Promise { + listDatabaseBackups(): Promise { return this.service.listBackups(); } @Get(':filename') @FileResponse() @Endpoint({ - summary: 'Download backup', + summary: 'Download database backup', description: 'Downloads the database backup file', history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'), }) @Authenticated({ permission: Permission.BackupDownload, admin: true }) - async downloadBackup( + async downloadDatabaseBackup( @Param() { filename }: FilenameParamDto, @Res() res: Response, @Next() next: NextFunction, @@ -52,22 +52,22 @@ export class DatabaseBackupController { @Delete(':filename') @Endpoint({ - summary: 'Delete backup', + summary: 'Delete database backup', description: 'Delete a backup by its filename', history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'), }) @Authenticated({ permission: Permission.BackupDelete, admin: true }) - async deleteBackup(@Param() { filename }: FilenameParamDto): Promise { + async deleteDatabaseBackup(@Param() { filename }: FilenameParamDto): Promise { return this.service.deleteBackup(filename); } @Post('start-restore') @Endpoint({ - summary: 'Start backup restore flow', + summary: 'Start database backup restore flow', description: 'Put Immich into maintenance mode to restore a backup (Immich must not be configured)', history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'), }) - async startRestoreFlow( + async startDatabaseRestoreFlow( @GetLoginDetails() loginDetails: LoginDetails, @Res({ passthrough: true }) res: Response, ): Promise { @@ -88,7 +88,7 @@ export class DatabaseBackupController { history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'), }) @UseInterceptors(FileInterceptor('file')) - uploadBackup( + uploadDatabaseBackup( @UploadedFile() file: Express.Multer.File, ): Promise { diff --git a/server/src/maintenance/maintenance-worker.controller.ts b/server/src/maintenance/maintenance-worker.controller.ts index 4d4ef40a65..f9c193dad2 100644 --- a/server/src/maintenance/maintenance-worker.controller.ts +++ b/server/src/maintenance/maintenance-worker.controller.ts @@ -32,6 +32,9 @@ import { sendFile } from 'src/utils/file'; import { respondWithCookie } from 'src/utils/response'; import { FilenameParamDto } from 'src/validation'; +import type { DatabaseBackupController as _DatabaseBackupController } from 'src/controllers/database-backup.controller'; +import type { ServerController as _ServerController } from 'src/controllers/server.controller'; + @Controller() export class MaintenanceWorkerController { constructor( @@ -39,11 +42,58 @@ export class MaintenanceWorkerController { private service: MaintenanceWorkerService, ) {} + /** + * {@link _ServerController.getServerConfig } + */ @Get('server/config') getServerConfig(): ServerConfigDto { return this.service.getSystemConfig(); } + /** + * {@link _DatabaseBackupController.listDatabaseBackups} + */ + @Get('admin/database-backups') + @MaintenanceRoute() + listDatabaseBackups(): Promise { + return this.service.listBackups(); + } + + /** + * {@link _DatabaseBackupController.downloadDatabaseBackup} + */ + @Get('admin/database-backups/:filename') + @MaintenanceRoute() + async downloadDatabaseBackup( + @Param() { filename }: FilenameParamDto, + @Res() res: Response, + @Next() next: NextFunction, + ) { + await sendFile(res, next, () => this.service.downloadBackup(filename), this.logger); + } + + /** + * {@link _DatabaseBackupController.deleteDatabaseBackup} + */ + @Delete('admin/database-backups/:filename') + @MaintenanceRoute() + async deleteDatabaseBackup(@Param() { filename }: FilenameParamDto): Promise { + return this.service.deleteBackup(filename); + } + + /** + * {@link _DatabaseBackupController.uploadDatabaseBackup} + */ + @Post('admin/database-backups/upload') + @MaintenanceRoute() + @UseInterceptors(FileInterceptor('file')) + uploadDatabaseBackup( + @UploadedFile() + file: Express.Multer.File, + ): Promise { + return this.service.uploadBackup(file); + } + @Get('admin/maintenance/status') maintenanceStatus(@Req() request: Request): Promise { return this.service.status(request.cookies[ImmichCookie.MaintenanceToken]); @@ -74,32 +124,4 @@ export class MaintenanceWorkerController { setMaintenanceMode(@Body() dto: SetMaintenanceModeDto): void { void this.service.setAction(dto); } - - @Get('admin/database-backups') - @MaintenanceRoute() - listBackups(): Promise { - return this.service.listBackups(); - } - - @Get('admin/database-backups/:filename') - @MaintenanceRoute() - async downloadBackup(@Param() { filename }: FilenameParamDto, @Res() res: Response, @Next() next: NextFunction) { - await sendFile(res, next, () => this.service.downloadBackup(filename), this.logger); - } - - @Delete('admin/database-backups/:filename') - @MaintenanceRoute() - async deleteBackup(@Param() { filename }: FilenameParamDto): Promise { - return this.service.deleteBackup(filename); - } - - @Post('admin/database-backups/upload') - @MaintenanceRoute() - @UseInterceptors(FileInterceptor('file')) - uploadBackup( - @UploadedFile() - file: Express.Multer.File, - ): Promise { - return this.service.uploadBackup(file); - } } diff --git a/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte b/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte index 16be1296c0..0de63ffa61 100644 --- a/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte +++ b/web/src/lib/components/maintenance/MaintenanceBackupsList.svelte @@ -3,9 +3,9 @@ import { openFilePicker } from '$lib/utils/file-uploader'; import { handleError } from '$lib/utils/handle-error'; import { - deleteBackup, + deleteDatabaseBackup, getBaseUrl, - listBackups, + listDatabaseBackups, MaintenanceAction, setMaintenanceMode, type MaintenanceUploadBackupDto, @@ -55,7 +55,7 @@ onMount(async () => { if (!props.backups) { - const result = await listBackups(); + const result = await listDatabaseBackups(); backups = mapBackups(result.backups); } }); @@ -92,7 +92,7 @@ try { deleting.add(filename); - await deleteBackup({ + await deleteDatabaseBackup({ filename, }); @@ -151,7 +151,7 @@ uploadProgress = 1; - const { backups: newList } = await listBackups(); + const { backups: newList } = await listDatabaseBackups(); backups = mapBackups(newList); } catch (error) { handleError(error, $t('admin.maintenance_upload_backup_error')); diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 1d2fd27714..76dc49a768 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -3,7 +3,7 @@ import { AppRoute } from '$lib/constants'; import { websocketStore } from '$lib/stores/websocket'; import { handleError } from '$lib/utils/handle-error'; - import { startRestoreFlow } from '@immich/sdk'; + import { startDatabaseRestoreFlow } from '@immich/sdk'; import { Button, Heading, Stack } from '@immich/ui'; import { t } from 'svelte-i18n'; @@ -13,7 +13,7 @@ isMaintenanceMode: true, }); - await startRestoreFlow(); + await startDatabaseRestoreFlow(); } catch (error) { handleError(error, $t('admin.maintenance_start_error')); } diff --git a/web/src/routes/admin/maintenance/+page.ts b/web/src/routes/admin/maintenance/+page.ts index 38aa69aa37..38e12fabfa 100644 --- a/web/src/routes/admin/maintenance/+page.ts +++ b/web/src/routes/admin/maintenance/+page.ts @@ -1,11 +1,11 @@ import { authenticate } from '$lib/utils/auth'; import { getFormatter } from '$lib/utils/i18n'; -import { listBackups } from '@immich/sdk'; +import { listDatabaseBackups } from '@immich/sdk'; import type { PageLoad } from './$types'; export const load = (async ({ url }) => { await authenticate(url, { admin: true }); - const { backups } = await listBackups(); + const { backups } = await listDatabaseBackups(); const $t = await getFormatter(); return {