diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 1973c96bca..a5ad9c5181 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -552,7 +552,6 @@ Class | Method | HTTP request | Description - [SystemConfigNotificationsDto](doc//SystemConfigNotificationsDto.md) - [SystemConfigOAuthDto](doc//SystemConfigOAuthDto.md) - [SystemConfigPasswordLoginDto](doc//SystemConfigPasswordLoginDto.md) - - [SystemConfigRemovePartialUploadsDto](doc//SystemConfigRemovePartialUploadsDto.md) - [SystemConfigReverseGeocodingDto](doc//SystemConfigReverseGeocodingDto.md) - [SystemConfigServerDto](doc//SystemConfigServerDto.md) - [SystemConfigSmtpDto](doc//SystemConfigSmtpDto.md) @@ -585,6 +584,7 @@ Class | Method | HTTP request | Description - [UpdateAlbumUserDto](doc//UpdateAlbumUserDto.md) - [UpdateAssetDto](doc//UpdateAssetDto.md) - [UpdateLibraryDto](doc//UpdateLibraryDto.md) + - [UploadBackupConfig](doc//UploadBackupConfig.md) - [UploadOkDto](doc//UploadOkDto.md) - [UsageByUserDto](doc//UsageByUserDto.md) - [UserAdminCreateDto](doc//UserAdminCreateDto.md) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 96e83561cf..99df6bb220 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -316,7 +316,6 @@ part 'model/system_config_nightly_tasks_dto.dart'; part 'model/system_config_notifications_dto.dart'; part 'model/system_config_o_auth_dto.dart'; part 'model/system_config_password_login_dto.dart'; -part 'model/system_config_remove_partial_uploads_dto.dart'; part 'model/system_config_reverse_geocoding_dto.dart'; part 'model/system_config_server_dto.dart'; part 'model/system_config_smtp_dto.dart'; @@ -349,6 +348,7 @@ part 'model/update_album_dto.dart'; part 'model/update_album_user_dto.dart'; part 'model/update_asset_dto.dart'; part 'model/update_library_dto.dart'; +part 'model/upload_backup_config.dart'; part 'model/upload_ok_dto.dart'; part 'model/usage_by_user_dto.dart'; part 'model/user_admin_create_dto.dart'; diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 18b2a12236..0ca9604ad3 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -684,8 +684,6 @@ class ApiClient { return SystemConfigOAuthDto.fromJson(value); case 'SystemConfigPasswordLoginDto': return SystemConfigPasswordLoginDto.fromJson(value); - case 'SystemConfigRemovePartialUploadsDto': - return SystemConfigRemovePartialUploadsDto.fromJson(value); case 'SystemConfigReverseGeocodingDto': return SystemConfigReverseGeocodingDto.fromJson(value); case 'SystemConfigServerDto': @@ -750,6 +748,8 @@ class ApiClient { return UpdateAssetDto.fromJson(value); case 'UpdateLibraryDto': return UpdateLibraryDto.fromJson(value); + case 'UploadBackupConfig': + return UploadBackupConfig.fromJson(value); case 'UploadOkDto': return UploadOkDto.fromJson(value); case 'UsageByUserDto': diff --git a/mobile/openapi/lib/model/system_config_backups_dto.dart b/mobile/openapi/lib/model/system_config_backups_dto.dart index 82cd6e59eb..f937f1a0e9 100644 --- a/mobile/openapi/lib/model/system_config_backups_dto.dart +++ b/mobile/openapi/lib/model/system_config_backups_dto.dart @@ -14,25 +14,31 @@ class SystemConfigBackupsDto { /// Returns a new [SystemConfigBackupsDto] instance. SystemConfigBackupsDto({ required this.database, + required this.upload, }); DatabaseBackupConfig database; + UploadBackupConfig upload; + @override bool operator ==(Object other) => identical(this, other) || other is SystemConfigBackupsDto && - other.database == database; + other.database == database && + other.upload == upload; @override int get hashCode => // ignore: unnecessary_parenthesis - (database.hashCode); + (database.hashCode) + + (upload.hashCode); @override - String toString() => 'SystemConfigBackupsDto[database=$database]'; + String toString() => 'SystemConfigBackupsDto[database=$database, upload=$upload]'; Map toJson() { final json = {}; json[r'database'] = this.database; + json[r'upload'] = this.upload; return json; } @@ -46,6 +52,7 @@ class SystemConfigBackupsDto { return SystemConfigBackupsDto( database: DatabaseBackupConfig.fromJson(json[r'database'])!, + upload: UploadBackupConfig.fromJson(json[r'upload'])!, ); } return null; @@ -94,6 +101,7 @@ class SystemConfigBackupsDto { /// The list of required keys that must be present in a JSON. static const requiredKeys = { 'database', + 'upload', }; } diff --git a/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart b/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart index c925909994..3d360e69b7 100644 --- a/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart +++ b/mobile/openapi/lib/model/system_config_nightly_tasks_dto.dart @@ -30,7 +30,7 @@ class SystemConfigNightlyTasksDto { bool missingThumbnails; - SystemConfigRemovePartialUploadsDto removeStaleUploads; + bool removeStaleUploads; String startTime; @@ -85,7 +85,7 @@ class SystemConfigNightlyTasksDto { databaseCleanup: mapValueOfType(json, r'databaseCleanup')!, generateMemories: mapValueOfType(json, r'generateMemories')!, missingThumbnails: mapValueOfType(json, r'missingThumbnails')!, - removeStaleUploads: SystemConfigRemovePartialUploadsDto.fromJson(json[r'removeStaleUploads'])!, + removeStaleUploads: mapValueOfType(json, r'removeStaleUploads')!, startTime: mapValueOfType(json, r'startTime')!, syncQuotaUsage: mapValueOfType(json, r'syncQuotaUsage')!, ); diff --git a/mobile/openapi/lib/model/system_config_remove_partial_uploads_dto.dart b/mobile/openapi/lib/model/system_config_remove_partial_uploads_dto.dart deleted file mode 100644 index 8a14dbe6ca..0000000000 --- a/mobile/openapi/lib/model/system_config_remove_partial_uploads_dto.dart +++ /dev/null @@ -1,108 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.18 - -// ignore_for_file: unused_element, unused_import -// ignore_for_file: always_put_required_named_parameters_first -// ignore_for_file: constant_identifier_names -// ignore_for_file: lines_longer_than_80_chars - -part of openapi.api; - -class SystemConfigRemovePartialUploadsDto { - /// Returns a new [SystemConfigRemovePartialUploadsDto] instance. - SystemConfigRemovePartialUploadsDto({ - required this.enabled, - required this.hoursAgo, - }); - - bool enabled; - - /// Minimum value: 1 - int hoursAgo; - - @override - bool operator ==(Object other) => identical(this, other) || other is SystemConfigRemovePartialUploadsDto && - other.enabled == enabled && - other.hoursAgo == hoursAgo; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (enabled.hashCode) + - (hoursAgo.hashCode); - - @override - String toString() => 'SystemConfigRemovePartialUploadsDto[enabled=$enabled, hoursAgo=$hoursAgo]'; - - Map toJson() { - final json = {}; - json[r'enabled'] = this.enabled; - json[r'hoursAgo'] = this.hoursAgo; - return json; - } - - /// Returns a new [SystemConfigRemovePartialUploadsDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static SystemConfigRemovePartialUploadsDto? fromJson(dynamic value) { - upgradeDto(value, "SystemConfigRemovePartialUploadsDto"); - if (value is Map) { - final json = value.cast(); - - return SystemConfigRemovePartialUploadsDto( - enabled: mapValueOfType(json, r'enabled')!, - hoursAgo: mapValueOfType(json, r'hoursAgo')!, - ); - } - return null; - } - - static List listFromJson(dynamic json, {bool growable = false,}) { - final result = []; - if (json is List && json.isNotEmpty) { - for (final row in json) { - final value = SystemConfigRemovePartialUploadsDto.fromJson(row); - if (value != null) { - result.add(value); - } - } - } - return result.toList(growable: growable); - } - - 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 = SystemConfigRemovePartialUploadsDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - // maps a json object with a list of SystemConfigRemovePartialUploadsDto-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] = SystemConfigRemovePartialUploadsDto.listFromJson(entry.value, growable: growable,); - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'enabled', - 'hoursAgo', - }; -} - diff --git a/mobile/openapi/lib/model/upload_backup_config.dart b/mobile/openapi/lib/model/upload_backup_config.dart new file mode 100644 index 0000000000..454616634e --- /dev/null +++ b/mobile/openapi/lib/model/upload_backup_config.dart @@ -0,0 +1,100 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.18 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class UploadBackupConfig { + /// Returns a new [UploadBackupConfig] instance. + UploadBackupConfig({ + required this.maxAgeHours, + }); + + /// Minimum value: 1 + num maxAgeHours; + + @override + bool operator ==(Object other) => identical(this, other) || other is UploadBackupConfig && + other.maxAgeHours == maxAgeHours; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (maxAgeHours.hashCode); + + @override + String toString() => 'UploadBackupConfig[maxAgeHours=$maxAgeHours]'; + + Map toJson() { + final json = {}; + json[r'maxAgeHours'] = this.maxAgeHours; + return json; + } + + /// Returns a new [UploadBackupConfig] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static UploadBackupConfig? fromJson(dynamic value) { + upgradeDto(value, "UploadBackupConfig"); + if (value is Map) { + final json = value.cast(); + + return UploadBackupConfig( + maxAgeHours: num.parse('${json[r'maxAgeHours']}'), + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = UploadBackupConfig.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + 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 = UploadBackupConfig.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of UploadBackupConfig-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] = UploadBackupConfig.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'maxAgeHours', + }; +} + diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index d200cdc3f3..231f106a3a 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -16658,10 +16658,14 @@ "properties": { "database": { "$ref": "#/components/schemas/DatabaseBackupConfig" + }, + "upload": { + "$ref": "#/components/schemas/UploadBackupConfig" } }, "required": [ - "database" + "database", + "upload" ], "type": "object" }, @@ -17195,7 +17199,7 @@ "type": "boolean" }, "removeStaleUploads": { - "$ref": "#/components/schemas/SystemConfigRemovePartialUploadsDto" + "type": "boolean" }, "startTime": { "type": "string" @@ -17325,22 +17329,6 @@ ], "type": "object" }, - "SystemConfigRemovePartialUploadsDto": { - "properties": { - "enabled": { - "type": "boolean" - }, - "hoursAgo": { - "minimum": 1, - "type": "integer" - } - }, - "required": [ - "enabled", - "hoursAgo" - ], - "type": "object" - }, "SystemConfigReverseGeocodingDto": { "properties": { "enabled": { @@ -18078,6 +18066,18 @@ }, "type": "object" }, + "UploadBackupConfig": { + "properties": { + "maxAgeHours": { + "minimum": 1, + "type": "number" + } + }, + "required": [ + "maxAgeHours" + ], + "type": "object" + }, "UploadOkDto": { "properties": { "id": { diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 716e051e4e..317ef389fe 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -1359,8 +1359,12 @@ export type DatabaseBackupConfig = { enabled: boolean; keepLastAmount: number; }; +export type UploadBackupConfig = { + maxAgeHours: number; +}; export type SystemConfigBackupsDto = { database: DatabaseBackupConfig; + upload: UploadBackupConfig; }; export type SystemConfigFFmpegDto = { accel: TranscodeHWAccel; @@ -1484,16 +1488,12 @@ export type SystemConfigMetadataDto = { export type SystemConfigNewVersionCheckDto = { enabled: boolean; }; -export type SystemConfigRemovePartialUploadsDto = { - enabled: boolean; - hoursAgo: number; -}; export type SystemConfigNightlyTasksDto = { clusterNewFaces: boolean; databaseCleanup: boolean; generateMemories: boolean; missingThumbnails: boolean; - removeStaleUploads: SystemConfigRemovePartialUploadsDto; + removeStaleUploads: boolean; startTime: string; syncQuotaUsage: boolean; }; diff --git a/server/src/controllers/asset-upload.controller.ts b/server/src/controllers/asset-upload.controller.ts index e0aeba80f2..96bc392b8f 100644 --- a/server/src/controllers/asset-upload.controller.ts +++ b/server/src/controllers/asset-upload.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Delete, Head, Options, Param, Patch, Post, Req, Res } from '@nestjs/common'; +import { Controller, Delete, Head, HttpCode, HttpStatus, Options, Param, Patch, Post, Req, Res } from '@nestjs/common'; import { ApiHeader, ApiOkResponse, ApiTags } from '@nestjs/swagger'; import { Request, Response } from 'express'; import { @@ -107,6 +107,7 @@ export class AssetUploadController { } @Options() + @HttpCode(HttpStatus.NO_CONTENT) getUploadOptions(@Res() res: Response) { return this.service.getUploadOptions(res); }