From bffbf02f3a28e2813355b20210bac5facf025e89 Mon Sep 17 00:00:00 2001 From: izzy Date: Wed, 21 Jan 2026 17:02:30 +0000 Subject: [PATCH] chore: merge fixes --- mobile/openapi/README.md | 14 + mobile/openapi/lib/api.dart | 8 + .../lib/api/maintenance_admin_api.dart | 96 ++++ mobile/openapi/lib/api_client.dart | 14 + mobile/openapi/lib/api_helper.dart | 3 + open-api/immich-openapi-specs.json | 439 ++++++++++-------- open-api/typescript-sdk/src/fetch-client.ts | 141 +++--- web/src/lib/route.ts | 4 +- .../integrity-report/[type]/+page.svelte | 4 +- 9 files changed, 448 insertions(+), 275 deletions(-) diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index f9961d026e..69e8e3d207 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -138,6 +138,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* | [**deleteDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup) | **DELETE** /admin/database-backups | 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 @@ -167,10 +172,12 @@ Class | Method | HTTP request | Description *LibrariesApi* | [**updateLibrary**](doc//LibrariesApi.md#updatelibrary) | **PUT** /libraries/{id} | Update a library *LibrariesApi* | [**validate**](doc//LibrariesApi.md#validate) | **POST** /libraries/{id}/validate | Validate library settings *MaintenanceAdminApi* | [**deleteIntegrityReport**](doc//MaintenanceAdminApi.md#deleteintegrityreport) | **DELETE** /admin/integrity/report/{id} | Delete integrity report item +*MaintenanceAdminApi* | [**detectPriorInstall**](doc//MaintenanceAdminApi.md#detectpriorinstall) | **GET** /admin/maintenance/detect-install | Detect existing install *MaintenanceAdminApi* | [**getIntegrityReport**](doc//MaintenanceAdminApi.md#getintegrityreport) | **POST** /admin/integrity/report | Get integrity report by type *MaintenanceAdminApi* | [**getIntegrityReportCsv**](doc//MaintenanceAdminApi.md#getintegrityreportcsv) | **GET** /admin/integrity/report/{type}/csv | Export integrity report by type as CSV *MaintenanceAdminApi* | [**getIntegrityReportFile**](doc//MaintenanceAdminApi.md#getintegrityreportfile) | **GET** /admin/integrity/report/{id}/file | Download flagged file *MaintenanceAdminApi* | [**getIntegrityReportSummary**](doc//MaintenanceAdminApi.md#getintegrityreportsummary) | **GET** /admin/integrity/summary | Get integrity report summary +*MaintenanceAdminApi* | [**getMaintenanceStatus**](doc//MaintenanceAdminApi.md#getmaintenancestatus) | **GET** /admin/maintenance/status | Get maintenance mode status *MaintenanceAdminApi* | [**maintenanceLogin**](doc//MaintenanceAdminApi.md#maintenancelogin) | **POST** /admin/maintenance/login | Log into maintenance mode *MaintenanceAdminApi* | [**setMaintenanceMode**](doc//MaintenanceAdminApi.md#setmaintenancemode) | **POST** /admin/maintenance | Set maintenance mode *MapApi* | [**getMapMarkers**](doc//MapApi.md#getmapmarkers) | **GET** /map/markers | Retrieve map markers @@ -410,6 +417,9 @@ Class | Method | HTTP request | Description - [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md) - [CropParameters](doc//CropParameters.md) - [DatabaseBackupConfig](doc//DatabaseBackupConfig.md) + - [DatabaseBackupDeleteDto](doc//DatabaseBackupDeleteDto.md) + - [DatabaseBackupDto](doc//DatabaseBackupDto.md) + - [DatabaseBackupListResponseDto](doc//DatabaseBackupListResponseDto.md) - [DownloadArchiveInfo](doc//DownloadArchiveInfo.md) - [DownloadInfoDto](doc//DownloadInfoDto.md) - [DownloadResponse](doc//DownloadResponse.md) @@ -444,7 +454,10 @@ Class | Method | HTTP request | Description - [MachineLearningAvailabilityChecksDto](doc//MachineLearningAvailabilityChecksDto.md) - [MaintenanceAction](doc//MaintenanceAction.md) - [MaintenanceAuthDto](doc//MaintenanceAuthDto.md) + - [MaintenanceDetectInstallResponseDto](doc//MaintenanceDetectInstallResponseDto.md) + - [MaintenanceDetectInstallStorageFolderDto](doc//MaintenanceDetectInstallStorageFolderDto.md) - [MaintenanceLoginDto](doc//MaintenanceLoginDto.md) + - [MaintenanceStatusResponseDto](doc//MaintenanceStatusResponseDto.md) - [ManualJobName](doc//ManualJobName.md) - [MapMarkerResponseDto](doc//MapMarkerResponseDto.md) - [MapReverseGeocodeResponseDto](doc//MapReverseGeocodeResponseDto.md) @@ -560,6 +573,7 @@ Class | Method | HTTP request | Description - [StackResponseDto](doc//StackResponseDto.md) - [StackUpdateDto](doc//StackUpdateDto.md) - [StatisticsSearchDto](doc//StatisticsSearchDto.md) + - [StorageFolder](doc//StorageFolder.md) - [SyncAckDeleteDto](doc//SyncAckDeleteDto.md) - [SyncAckDto](doc//SyncAckDto.md) - [SyncAckSetDto](doc//SyncAckSetDto.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 238932ae84..e29264478b 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -36,6 +36,7 @@ part 'api/albums_api.dart'; part 'api/assets_api.dart'; part 'api/authentication_api.dart'; part 'api/authentication_admin_api.dart'; +part 'api/database_backups_admin_api.dart'; part 'api/deprecated_api.dart'; part 'api/download_api.dart'; part 'api/duplicates_api.dart'; @@ -151,6 +152,9 @@ part 'model/create_library_dto.dart'; part 'model/create_profile_image_response_dto.dart'; part 'model/crop_parameters.dart'; part 'model/database_backup_config.dart'; +part 'model/database_backup_delete_dto.dart'; +part 'model/database_backup_dto.dart'; +part 'model/database_backup_list_response_dto.dart'; part 'model/download_archive_info.dart'; part 'model/download_info_dto.dart'; part 'model/download_response.dart'; @@ -185,7 +189,10 @@ 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_detect_install_response_dto.dart'; +part 'model/maintenance_detect_install_storage_folder_dto.dart'; part 'model/maintenance_login_dto.dart'; +part 'model/maintenance_status_response_dto.dart'; part 'model/manual_job_name.dart'; part 'model/map_marker_response_dto.dart'; part 'model/map_reverse_geocode_response_dto.dart'; @@ -301,6 +308,7 @@ part 'model/stack_create_dto.dart'; part 'model/stack_response_dto.dart'; part 'model/stack_update_dto.dart'; part 'model/statistics_search_dto.dart'; +part 'model/storage_folder.dart'; part 'model/sync_ack_delete_dto.dart'; part 'model/sync_ack_dto.dart'; part 'model/sync_ack_set_dto.dart'; diff --git a/mobile/openapi/lib/api/maintenance_admin_api.dart b/mobile/openapi/lib/api/maintenance_admin_api.dart index 164f0c6661..b662dd9194 100644 --- a/mobile/openapi/lib/api/maintenance_admin_api.dart +++ b/mobile/openapi/lib/api/maintenance_admin_api.dart @@ -65,6 +65,54 @@ class MaintenanceAdminApi { } } + /// Detect existing install + /// + /// Collect integrity checks and other heuristics about local data. + /// + /// Note: This method returns the HTTP [Response]. + Future detectPriorInstallWithHttpInfo() async { + // ignore: prefer_const_declarations + final apiPath = r'/admin/maintenance/detect-install'; + + // ignore: prefer_final_locals + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + + return apiClient.invokeAPI( + apiPath, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Detect existing install + /// + /// Collect integrity checks and other heuristics about local data. + Future detectPriorInstall() async { + final response = await detectPriorInstallWithHttpInfo(); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + // When a remote server returns no body with a status of 204, we shall not decode it. + // 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), 'MaintenanceDetectInstallResponseDto',) as MaintenanceDetectInstallResponseDto; + + } + return null; + } + /// Get integrity report by type /// /// Get all flagged items by integrity report type @@ -283,6 +331,54 @@ class MaintenanceAdminApi { return null; } + /// Get maintenance mode status + /// + /// Fetch information about the currently running maintenance action. + /// + /// Note: This method returns the HTTP [Response]. + Future getMaintenanceStatusWithHttpInfo() async { + // ignore: prefer_const_declarations + final apiPath = r'/admin/maintenance/status'; + + // ignore: prefer_final_locals + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + + return apiClient.invokeAPI( + apiPath, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Get maintenance mode status + /// + /// Fetch information about the currently running maintenance action. + Future getMaintenanceStatus() async { + final response = await getMaintenanceStatusWithHttpInfo(); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + // When a remote server returns no body with a status of 204, we shall not decode it. + // 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), 'MaintenanceStatusResponseDto',) as MaintenanceStatusResponseDto; + + } + return null; + } + /// Log into maintenance mode /// /// Login with maintenance token or cookie to receive current information and perform further actions. diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index f79e6605ec..9e543373cb 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -350,6 +350,12 @@ class ApiClient { return CropParameters.fromJson(value); case 'DatabaseBackupConfig': return DatabaseBackupConfig.fromJson(value); + case 'DatabaseBackupDeleteDto': + return DatabaseBackupDeleteDto.fromJson(value); + case 'DatabaseBackupDto': + return DatabaseBackupDto.fromJson(value); + case 'DatabaseBackupListResponseDto': + return DatabaseBackupListResponseDto.fromJson(value); case 'DownloadArchiveInfo': return DownloadArchiveInfo.fromJson(value); case 'DownloadInfoDto': @@ -418,8 +424,14 @@ class ApiClient { return MaintenanceActionTypeTransformer().decode(value); case 'MaintenanceAuthDto': return MaintenanceAuthDto.fromJson(value); + case 'MaintenanceDetectInstallResponseDto': + return MaintenanceDetectInstallResponseDto.fromJson(value); + case 'MaintenanceDetectInstallStorageFolderDto': + return MaintenanceDetectInstallStorageFolderDto.fromJson(value); case 'MaintenanceLoginDto': return MaintenanceLoginDto.fromJson(value); + case 'MaintenanceStatusResponseDto': + return MaintenanceStatusResponseDto.fromJson(value); case 'ManualJobName': return ManualJobNameTypeTransformer().decode(value); case 'MapMarkerResponseDto': @@ -650,6 +662,8 @@ class ApiClient { return StackUpdateDto.fromJson(value); case 'StatisticsSearchDto': return StatisticsSearchDto.fromJson(value); + case 'StorageFolder': + return StorageFolderTypeTransformer().decode(value); case 'SyncAckDeleteDto': return SyncAckDeleteDto.fromJson(value); case 'SyncAckDto': diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index f18304734a..1a9beb4da3 100644 --- a/mobile/openapi/lib/api_helper.dart +++ b/mobile/openapi/lib/api_helper.dart @@ -163,6 +163,9 @@ String parameterToString(dynamic value) { if (value is SourceType) { return SourceTypeTypeTransformer().encode(value).toString(); } + if (value is StorageFolder) { + return StorageFolderTypeTransformer().encode(value).toString(); + } if (value is SyncEntityType) { return SyncEntityTypeTypeTransformer().encode(value).toString(); } diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 804677c663..07bf2b6945 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -322,27 +322,16 @@ "x-immich-state": "Stable" } }, -<<<<<<< HEAD - "/admin/integrity/report": { - "post": { - "description": "Get all flagged items by integrity report type", - "operationId": "getIntegrityReport", -======= "/admin/database-backups": { "delete": { "description": "Delete a backup by its filename", "operationId": "deleteDatabaseBackup", ->>>>>>> origin/main "parameters": [], "requestBody": { "content": { "application/json": { "schema": { -<<<<<<< HEAD - "$ref": "#/components/schemas/IntegrityGetReportDto" -======= "$ref": "#/components/schemas/DatabaseBackupDeleteDto" ->>>>>>> origin/main } } }, @@ -350,16 +339,6 @@ }, "responses": { "200": { -<<<<<<< HEAD - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IntegrityReportResponseDto" - } - } - }, -======= ->>>>>>> origin/main "description": "" } }, @@ -374,20 +353,251 @@ "api_key": [] } ], -<<<<<<< HEAD - "summary": "Get integrity report by type", - "tags": [ - "Maintenance (admin)" -======= "summary": "Delete database backup", "tags": [ "Database Backups (admin)" ->>>>>>> origin/main ], "x-immich-admin-only": true, "x-immich-history": [ { -<<<<<<< HEAD + "version": "v2.5.0", + "state": "Added" + }, + { + "version": "v2.5.0", + "state": "Alpha" + } + ], + "x-immich-permission": "backup.delete", + "x-immich-state": "Alpha" + }, + "get": { + "description": "Get the list of the successful and failed backups", + "operationId": "listDatabaseBackups", + "parameters": [], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBackupListResponseDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "summary": "List database backups", + "tags": [ + "Database Backups (admin)" + ], + "x-immich-admin-only": true, + "x-immich-history": [ + { + "version": "v2.5.0", + "state": "Added" + }, + { + "version": "v2.5.0", + "state": "Alpha" + } + ], + "x-immich-permission": "maintenance", + "x-immich-state": "Alpha" + } + }, + "/admin/database-backups/start-restore": { + "post": { + "description": "Put Immich into maintenance mode to restore a backup (Immich must not be configured)", + "operationId": "startDatabaseRestoreFlow", + "parameters": [], + "responses": { + "201": { + "description": "" + } + }, + "summary": "Start database backup restore flow", + "tags": [ + "Database Backups (admin)" + ], + "x-immich-history": [ + { + "version": "v2.5.0", + "state": "Added" + }, + { + "version": "v2.5.0", + "state": "Alpha" + } + ], + "x-immich-state": "Alpha" + } + }, + "/admin/database-backups/upload": { + "post": { + "description": "Uploads .sql/.sql.gz file to restore backup from", + "operationId": "uploadDatabaseBackup", + "parameters": [], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/DatabaseBackupUploadDto" + } + } + }, + "description": "Backup Upload", + "required": true + }, + "responses": { + "201": { + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "summary": "Upload database backup", + "tags": [ + "Database Backups (admin)" + ], + "x-immich-admin-only": true, + "x-immich-history": [ + { + "version": "v2.5.0", + "state": "Added" + }, + { + "version": "v2.5.0", + "state": "Alpha" + } + ], + "x-immich-permission": "backup.upload", + "x-immich-state": "Alpha" + } + }, + "/admin/database-backups/{filename}": { + "get": { + "description": "Downloads the database backup file", + "operationId": "downloadDatabaseBackup", + "parameters": [ + { + "name": "filename", + "required": true, + "in": "path", + "schema": { + "format": "string", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "summary": "Download database backup", + "tags": [ + "Database Backups (admin)" + ], + "x-immich-admin-only": true, + "x-immich-history": [ + { + "version": "v2.5.0", + "state": "Added" + }, + { + "version": "v2.5.0", + "state": "Alpha" + } + ], + "x-immich-permission": "backup.download", + "x-immich-state": "Alpha" + } + }, + "/admin/integrity/report": { + "post": { + "description": "Get all flagged items by integrity report type", + "operationId": "getIntegrityReport", + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrityGetReportDto" + } + } + }, + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IntegrityReportResponseDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "summary": "Get integrity report by type", + "tags": [ + "Maintenance (admin)" + ], + "x-immich-admin-only": true, + "x-immich-history": [ + { "version": "v2.6.0", "state": "Added" }, @@ -569,33 +779,13 @@ "get": { "description": "Get a count of the items flagged in each integrity report", "operationId": "getIntegrityReportSummary", -======= - "version": "v2.5.0", - "state": "Added" - }, - { - "version": "v2.5.0", - "state": "Alpha" - } - ], - "x-immich-permission": "backup.delete", - "x-immich-state": "Alpha" - }, - "get": { - "description": "Get the list of the successful and failed backups", - "operationId": "listDatabaseBackups", ->>>>>>> origin/main "parameters": [], "responses": { "200": { "content": { "application/json": { "schema": { -<<<<<<< HEAD "$ref": "#/components/schemas/IntegrityReportSummaryResponseDto" -======= - "$ref": "#/components/schemas/DatabaseBackupListResponseDto" ->>>>>>> origin/main } } }, @@ -613,32 +803,18 @@ "api_key": [] } ], -<<<<<<< HEAD "summary": "Get integrity report summary", "tags": [ "Maintenance (admin)" -======= - "summary": "List database backups", - "tags": [ - "Database Backups (admin)" ->>>>>>> origin/main ], "x-immich-admin-only": true, "x-immich-history": [ { -<<<<<<< HEAD "version": "v2.6.0", "state": "Added" }, { "version": "v2.6.0", -======= - "version": "v2.5.0", - "state": "Added" - }, - { - "version": "v2.5.0", ->>>>>>> origin/main "state": "Alpha" } ], @@ -646,145 +822,6 @@ "x-immich-state": "Alpha" } }, -<<<<<<< HEAD -======= - "/admin/database-backups/start-restore": { - "post": { - "description": "Put Immich into maintenance mode to restore a backup (Immich must not be configured)", - "operationId": "startDatabaseRestoreFlow", - "parameters": [], - "responses": { - "201": { - "description": "" - } - }, - "summary": "Start database backup restore flow", - "tags": [ - "Database Backups (admin)" - ], - "x-immich-history": [ - { - "version": "v2.5.0", - "state": "Added" - }, - { - "version": "v2.5.0", - "state": "Alpha" - } - ], - "x-immich-state": "Alpha" - } - }, - "/admin/database-backups/upload": { - "post": { - "description": "Uploads .sql/.sql.gz file to restore backup from", - "operationId": "uploadDatabaseBackup", - "parameters": [], - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/DatabaseBackupUploadDto" - } - } - }, - "description": "Backup Upload", - "required": true - }, - "responses": { - "201": { - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "summary": "Upload database backup", - "tags": [ - "Database Backups (admin)" - ], - "x-immich-admin-only": true, - "x-immich-history": [ - { - "version": "v2.5.0", - "state": "Added" - }, - { - "version": "v2.5.0", - "state": "Alpha" - } - ], - "x-immich-permission": "backup.upload", - "x-immich-state": "Alpha" - } - }, - "/admin/database-backups/{filename}": { - "get": { - "description": "Downloads the database backup file", - "operationId": "downloadDatabaseBackup", - "parameters": [ - { - "name": "filename", - "required": true, - "in": "path", - "schema": { - "format": "string", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/octet-stream": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "summary": "Download database backup", - "tags": [ - "Database Backups (admin)" - ], - "x-immich-admin-only": true, - "x-immich-history": [ - { - "version": "v2.5.0", - "state": "Added" - }, - { - "version": "v2.5.0", - "state": "Alpha" - } - ], - "x-immich-permission": "backup.download", - "x-immich-state": "Alpha" - } - }, ->>>>>>> origin/main "/admin/maintenance": { "post": { "description": "Put Immich into or take it out of maintenance mode", diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 8d6b90c013..a1d2817234 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -40,7 +40,19 @@ export type ActivityStatisticsResponseDto = { comments: number; likes: number; }; -<<<<<<< HEAD +export type DatabaseBackupDeleteDto = { + backups: string[]; +}; +export type DatabaseBackupDto = { + filename: string; + filesize: number; +}; +export type DatabaseBackupListResponseDto = { + backups: DatabaseBackupDto[]; +}; +export type DatabaseBackupUploadDto = { + file?: Blob; +}; export type IntegrityGetReportDto = { cursor?: string; limit?: number; @@ -59,20 +71,6 @@ export type IntegrityReportSummaryResponseDto = { checksum_mismatch: number; missing_file: number; untracked_file: number; -======= -export type DatabaseBackupDeleteDto = { - backups: string[]; -}; -export type DatabaseBackupDto = { - filename: string; - filesize: number; -}; -export type DatabaseBackupListResponseDto = { - backups: DatabaseBackupDto[]; -}; -export type DatabaseBackupUploadDto = { - file?: Blob; ->>>>>>> origin/main }; export type SetMaintenanceModeDto = { action: MaintenanceAction; @@ -1990,7 +1988,63 @@ export function unlinkAllOAuthAccountsAdmin(opts?: Oazapfts.RequestOpts) { })); } /** -<<<<<<< HEAD + * Delete database backup + */ +export function deleteDatabaseBackup({ databaseBackupDeleteDto }: { + databaseBackupDeleteDto: DatabaseBackupDeleteDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/admin/database-backups", oazapfts.json({ + ...opts, + method: "DELETE", + body: databaseBackupDeleteDto + }))); +} +/** + * List database backups + */ +export function listDatabaseBackups(opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 200; + data: DatabaseBackupListResponseDto; + }>("/admin/database-backups", { + ...opts + })); +} +/** + * Start database backup restore flow + */ +export function startDatabaseRestoreFlow(opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/start-restore", { + ...opts, + method: "POST" + })); +} +/** + * Upload database backup + */ +export function uploadDatabaseBackup({ databaseBackupUploadDto }: { + databaseBackupUploadDto: DatabaseBackupUploadDto; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/upload", oazapfts.multipart({ + ...opts, + method: "POST", + body: databaseBackupUploadDto + }))); +} +/** + * Download database backup + */ +export function downloadDatabaseBackup({ filename }: { + filename: string; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchBlob<{ + status: 200; + data: Blob; + }>(`/admin/database-backups/${encodeURIComponent(filename)}`, { + ...opts + })); +} +/** * Get integrity report by type */ export function getIntegrityReport({ integrityGetReportDto }: { @@ -2050,61 +2104,6 @@ export function getIntegrityReportSummary(opts?: Oazapfts.RequestOpts) { status: 200; data: IntegrityReportSummaryResponseDto; }>("/admin/integrity/summary", { -======= - * Delete database backup - */ -export function deleteDatabaseBackup({ databaseBackupDeleteDto }: { - databaseBackupDeleteDto: DatabaseBackupDeleteDto; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchText("/admin/database-backups", oazapfts.json({ - ...opts, - method: "DELETE", - body: databaseBackupDeleteDto - }))); -} -/** - * List database backups - */ -export function listDatabaseBackups(opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 200; - data: DatabaseBackupListResponseDto; - }>("/admin/database-backups", { - ...opts - })); -} -/** - * Start database backup restore flow - */ -export function startDatabaseRestoreFlow(opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/start-restore", { - ...opts, - method: "POST" - })); -} -/** - * Upload database backup - */ -export function uploadDatabaseBackup({ databaseBackupUploadDto }: { - databaseBackupUploadDto: DatabaseBackupUploadDto; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/upload", oazapfts.multipart({ - ...opts, - method: "POST", - body: databaseBackupUploadDto - }))); -} -/** - * Download database backup - */ -export function downloadDatabaseBackup({ filename }: { - filename: string; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchBlob<{ - status: 200; - data: Blob; - }>(`/admin/database-backups/${encodeURIComponent(filename)}`, { ->>>>>>> origin/main ...opts })); } diff --git a/web/src/lib/route.ts b/web/src/lib/route.ts index 5a59ec704c..80cfc98a72 100644 --- a/web/src/lib/route.ts +++ b/web/src/lib/route.ts @@ -1,5 +1,5 @@ import { OpenQueryParam, type SharedLinkTab } from '$lib/constants'; -import { QueueName, type MetadataSearchDto, type SmartSearchDto } from '@immich/sdk'; +import { IntegrityReportType, QueueName, type MetadataSearchDto, type SmartSearchDto } from '@immich/sdk'; import { omitBy } from 'lodash-es'; const asQueueSlug = (name: QueueName) => { @@ -121,6 +121,8 @@ export const Route = { systemSettings: (params?: { isOpen?: OpenQueryParam }) => '/admin/system-settings' + asQueryString(params), systemStatistics: () => '/admin/server-status', systemMaintenance: (params?: { continue?: string }) => '/admin/maintenance' + asQueryString(params), + systemMaintenanceIntegrityReport: ({ reportType }: { reportType: IntegrityReportType }) => + `/admin/maintenance/integrity-report/${reportType}`, // tags tags: (params?: { path?: string }) => '/tags' + asQueryString(params), diff --git a/web/src/routes/admin/maintenance/integrity-report/[type]/+page.svelte b/web/src/routes/admin/maintenance/integrity-report/[type]/+page.svelte index 8a5bfe3df2..e135a2e9fe 100644 --- a/web/src/routes/admin/maintenance/integrity-report/[type]/+page.svelte +++ b/web/src/routes/admin/maintenance/integrity-report/[type]/+page.svelte @@ -2,7 +2,7 @@ import AdminPageLayout from '$lib/components/layouts/AdminPageLayout.svelte'; import IntegrityReportTableItem from '$lib/components/maintenance/integrity/IntegrityReportTableItem.svelte'; import OnEvents from '$lib/components/OnEvents.svelte'; - import { AppRoute } from '$lib/constants'; + import { Route } from '$lib/route'; import { getIntegrityReportActions } from '$lib/services/integrity.service'; import { asyncTimeout } from '$lib/utils'; import { getIntegrityReport, getQueuesLegacy, IntegrityReportType } from '@immich/sdk'; @@ -72,7 +72,7 @@