From 39d2c4f37bdc3d4e559a018df56b583ddd024d14 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Fri, 24 May 2024 15:37:01 +0100 Subject: [PATCH] chore: remove all deprecated endpoints/properties from server and mobile app (#9724) * chore: remove deprecated title property from MemoryLaneResponseDto * chore: remove deprecated webpPath and resizePath from MetadataSearchDto * chore: remove deprecated sharedUserIds property from Album AddUsersDto * chore: remove deprecated sharedUsers property from AlbumResponseDto * chore: remove deprecated sharedWithUserIds property from CreateAlbumDto * chore: remove deprecated isExternal and isReadOnly properties from AssetResponseDto * chore: remove deprecated /server-info endpoint * chore: bloody linters --- e2e/src/api/specs/album.e2e-spec.ts | 7 +- e2e/src/api/specs/server-info.e2e-spec.ts | 6 +- mobile/lib/entities/album.entity.dart | 7 +- mobile/lib/services/album.service.dart | 9 +- mobile/lib/services/memory.service.dart | 6 +- mobile/lib/services/sync.service.dart | 10 +- ...e_first_letter.dart => string_helper.dart} | 2 + mobile/openapi/README.md | 2 - mobile/openapi/lib/api.dart | 1 - mobile/openapi/lib/api/deprecated_api.dart | 62 ------------- mobile/openapi/lib/api/server_info_api.dart | 44 --------- mobile/openapi/lib/model/add_users_dto.dart | 16 +--- .../openapi/lib/model/album_response_dto.dart | 11 +-- .../openapi/lib/model/asset_response_dto.dart | 38 +------- .../openapi/lib/model/create_album_dto.dart | 17 +--- .../lib/model/memory_lane_response_dto.dart | 11 +-- .../lib/model/metadata_search_dto.dart | 38 +------- open-api/immich-openapi-specs.json | 92 ------------------- open-api/typescript-sdk/src/fetch-client.ts | 46 ++-------- .../src/controllers/server-info.controller.ts | 8 -- server/src/dtos/album.dto.ts | 13 --- server/src/dtos/asset-response.dto.ts | 9 -- server/src/dtos/search.dto.ts | 13 --- server/src/services/album.service.spec.ts | 4 +- server/src/services/album.service.ts | 15 +-- server/src/services/search.service.ts | 3 - server/test/fixtures/shared-link.stub.ts | 2 - .../album-page/album-options.svelte | 2 +- .../album-page/user-selection-modal.svelte | 4 +- .../asset-viewer/detail-panel.svelte | 2 +- .../[[assetId=id]]/+page.svelte | 16 ++-- web/src/test-data/factories/album-factory.ts | 1 - 32 files changed, 66 insertions(+), 451 deletions(-) rename mobile/lib/utils/{capitalize_first_letter.dart => string_helper.dart} (75%) delete mode 100644 mobile/openapi/lib/api/deprecated_api.dart diff --git a/e2e/src/api/specs/album.e2e-spec.ts b/e2e/src/api/specs/album.e2e-spec.ts index 5cebe8f42c..4a231dbf9b 100644 --- a/e2e/src/api/specs/album.e2e-spec.ts +++ b/e2e/src/api/specs/album.e2e-spec.ts @@ -383,7 +383,6 @@ describe('/albums', () => { description: '', albumThumbnailAssetId: null, shared: false, - sharedUsers: [], albumUsers: [], hasSharedLink: false, assets: [], @@ -611,7 +610,11 @@ describe('/albums', () => { expect(status).toBe(200); expect(body).toEqual( expect.objectContaining({ - sharedUsers: [expect.objectContaining({ id: user2.userId })], + albumUsers: [ + expect.objectContaining({ + user: expect.objectContaining({ id: user2.userId }), + }), + ], }), ); }); diff --git a/e2e/src/api/specs/server-info.e2e-spec.ts b/e2e/src/api/specs/server-info.e2e-spec.ts index 34af159a6c..431971ac85 100644 --- a/e2e/src/api/specs/server-info.e2e-spec.ts +++ b/e2e/src/api/specs/server-info.e2e-spec.ts @@ -15,16 +15,16 @@ describe('/server-info', () => { nonAdmin = await utils.userSetup(admin.accessToken, createUserDto.user1); }); - describe('GET /server-info', () => { + describe('GET /server-info/storage', () => { it('should require authentication', async () => { - const { status, body } = await request(app).get('/server-info'); + const { status, body } = await request(app).get('/server-info/storage'); expect(status).toBe(401); expect(body).toEqual(errorDto.unauthorized); }); it('should return the disk information', async () => { const { status, body } = await request(app) - .get('/server-info') + .get('/server-info/storage') .set('Authorization', `Bearer ${admin.accessToken}`); expect(status).toBe(200); expect(body).toEqual({ diff --git a/mobile/lib/entities/album.entity.dart b/mobile/lib/entities/album.entity.dart index 49a38322ee..c05b849dcd 100644 --- a/mobile/lib/entities/album.entity.dart +++ b/mobile/lib/entities/album.entity.dart @@ -145,9 +145,10 @@ class Album { .remoteIdEqualTo(dto.albumThumbnailAssetId) .findFirst(); } - if (dto.sharedUsers.isNotEmpty) { - final users = await db.users - .getAllById(dto.sharedUsers.map((e) => e.id).toList(growable: false)); + if (dto.albumUsers.isNotEmpty) { + final users = await db.users.getAllById( + dto.albumUsers.map((e) => e.user.id).toList(growable: false), + ); a.sharedUsers.addAll(users.cast()); } if (dto.assets.isNotEmpty) { diff --git a/mobile/lib/services/album.service.dart b/mobile/lib/services/album.service.dart index bdf38a42af..c6d70c269a 100644 --- a/mobile/lib/services/album.service.dart +++ b/mobile/lib/services/album.service.dart @@ -180,7 +180,14 @@ class AlbumService { CreateAlbumDto( albumName: albumName, assetIds: assets.map((asset) => asset.remoteId!).toList(), - sharedWithUserIds: sharedUsers.map((e) => e.id).toList(), + albumUsers: sharedUsers + .map( + (e) => AlbumUserCreateDto( + userId: e.id, + role: AlbumUserRole.editor, + ), + ) + .toList(), ), ); if (remote != null) { diff --git a/mobile/lib/services/memory.service.dart b/mobile/lib/services/memory.service.dart index 96b8c6900e..b426214c03 100644 --- a/mobile/lib/services/memory.service.dart +++ b/mobile/lib/services/memory.service.dart @@ -8,6 +8,8 @@ import 'package:isar/isar.dart'; import 'package:logging/logging.dart'; import 'package:openapi/api.dart'; +import '../utils/string_helper.dart'; + final memoryServiceProvider = StateProvider((ref) { return MemoryService( ref.watch(apiServiceProvider), @@ -36,13 +38,13 @@ class MemoryService { } List memories = []; - for (final MemoryLaneResponseDto(:title, :assets) in data) { + for (final MemoryLaneResponseDto(:yearsAgo, :assets) in data) { final dbAssets = await _db.assets.getAllByRemoteId(assets.map((e) => e.id)); if (dbAssets.isNotEmpty) { memories.add( Memory( - title: title, + title: '$yearsAgo year${s(yearsAgo)} ago', assets: dbAssets, ), ); diff --git a/mobile/lib/services/sync.service.dart b/mobile/lib/services/sync.service.dart index acbd34d183..8ec56e925f 100644 --- a/mobile/lib/services/sync.service.dart +++ b/mobile/lib/services/sync.service.dart @@ -362,15 +362,15 @@ class SyncService { // update shared users final List sharedUsers = album.sharedUsers.toList(growable: false); sharedUsers.sort((a, b) => a.id.compareTo(b.id)); - dto.sharedUsers.sort((a, b) => a.id.compareTo(b.id)); + dto.albumUsers.sort((a, b) => a.user.id.compareTo(b.user.id)); final List userIdsToAdd = []; final List usersToUnlink = []; diffSortedListsSync( - dto.sharedUsers, + dto.albumUsers, sharedUsers, - compare: (UserResponseDto a, User b) => a.id.compareTo(b.id), + compare: (AlbumUserResponseDto a, User b) => a.user.id.compareTo(b.id), both: (a, b) => false, - onlyFirst: (UserResponseDto a) => userIdsToAdd.add(a.id), + onlyFirst: (AlbumUserResponseDto a) => userIdsToAdd.add(a.user.id), onlySecond: (User a) => usersToUnlink.add(a), ); @@ -905,7 +905,7 @@ bool _hasAlbumResponseDtoChanged(AlbumResponseDto dto, Album a) { dto.albumName != a.name || dto.albumThumbnailAssetId != a.thumbnail.value?.remoteId || dto.shared != a.shared || - dto.sharedUsers.length != a.sharedUsers.length || + dto.albumUsers.length != a.sharedUsers.length || !dto.updatedAt.isAtSameMomentAs(a.modifiedAt) || !isAtSameMomentAs(dto.startDate, a.startDate) || !isAtSameMomentAs(dto.endDate, a.endDate) || diff --git a/mobile/lib/utils/capitalize_first_letter.dart b/mobile/lib/utils/string_helper.dart similarity index 75% rename from mobile/lib/utils/capitalize_first_letter.dart rename to mobile/lib/utils/string_helper.dart index c1fbb40f8d..201d141531 100644 --- a/mobile/lib/utils/capitalize_first_letter.dart +++ b/mobile/lib/utils/string_helper.dart @@ -3,3 +3,5 @@ extension StringExtension on String { return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; } } + +String s(num count) => (count == 1 ? '' : 's'); diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 4b5ef2f0dd..402c3ccca0 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -117,7 +117,6 @@ Class | Method | HTTP request | Description *AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout | *AuthenticationApi* | [**signUpAdmin**](doc//AuthenticationApi.md#signupadmin) | **POST** /auth/admin-sign-up | *AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | -*DeprecatedApi* | [**getServerInfo**](doc//DeprecatedApi.md#getserverinfo) | **GET** /server-info | *DownloadApi* | [**downloadArchive**](doc//DownloadApi.md#downloadarchive) | **POST** /download/archive | *DownloadApi* | [**downloadFile**](doc//DownloadApi.md#downloadfile) | **POST** /download/asset/{id} | *DownloadApi* | [**getDownloadInfo**](doc//DownloadApi.md#getdownloadinfo) | **POST** /download/info | @@ -173,7 +172,6 @@ Class | Method | HTTP request | Description *SearchApi* | [**searchSmart**](doc//SearchApi.md#searchsmart) | **POST** /search/smart | *ServerInfoApi* | [**getServerConfig**](doc//ServerInfoApi.md#getserverconfig) | **GET** /server-info/config | *ServerInfoApi* | [**getServerFeatures**](doc//ServerInfoApi.md#getserverfeatures) | **GET** /server-info/features | -*ServerInfoApi* | [**getServerInfo**](doc//ServerInfoApi.md#getserverinfo) | **GET** /server-info | *ServerInfoApi* | [**getServerStatistics**](doc//ServerInfoApi.md#getserverstatistics) | **GET** /server-info/statistics | *ServerInfoApi* | [**getServerVersion**](doc//ServerInfoApi.md#getserverversion) | **GET** /server-info/version | *ServerInfoApi* | [**getStorage**](doc//ServerInfoApi.md#getstorage) | **GET** /server-info/storage | diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index e74fe8e03e..7e71c9db3e 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -35,7 +35,6 @@ part 'api/album_api.dart'; part 'api/asset_api.dart'; part 'api/audit_api.dart'; part 'api/authentication_api.dart'; -part 'api/deprecated_api.dart'; part 'api/download_api.dart'; part 'api/duplicate_api.dart'; part 'api/face_api.dart'; diff --git a/mobile/openapi/lib/api/deprecated_api.dart b/mobile/openapi/lib/api/deprecated_api.dart deleted file mode 100644 index 117735015d..0000000000 --- a/mobile/openapi/lib/api/deprecated_api.dart +++ /dev/null @@ -1,62 +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 DeprecatedApi { - DeprecatedApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient; - - final ApiClient apiClient; - - /// This property was deprecated in v1.106.0 - /// - /// Note: This method returns the HTTP [Response]. - Future getServerInfoWithHttpInfo() async { - // ignore: prefer_const_declarations - final path = r'/server-info'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// This property was deprecated in v1.106.0 - Future getServerInfo() async { - final response = await getServerInfoWithHttpInfo(); - 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), 'ServerStorageResponseDto',) as ServerStorageResponseDto; - - } - return null; - } -} diff --git a/mobile/openapi/lib/api/server_info_api.dart b/mobile/openapi/lib/api/server_info_api.dart index 6e55c62759..76da103b70 100644 --- a/mobile/openapi/lib/api/server_info_api.dart +++ b/mobile/openapi/lib/api/server_info_api.dart @@ -98,50 +98,6 @@ class ServerInfoApi { return null; } - /// This property was deprecated in v1.106.0 - /// - /// Note: This method returns the HTTP [Response]. - Future getServerInfoWithHttpInfo() async { - // ignore: prefer_const_declarations - final path = r'/server-info'; - - // ignore: prefer_final_locals - Object? postBody; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = []; - - - return apiClient.invokeAPI( - path, - 'GET', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// This property was deprecated in v1.106.0 - Future getServerInfo() async { - final response = await getServerInfoWithHttpInfo(); - 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), 'ServerStorageResponseDto',) as ServerStorageResponseDto; - - } - return null; - } - /// Performs an HTTP 'GET /server-info/statistics' operation and returns the [Response]. Future getServerStatisticsWithHttpInfo() async { // ignore: prefer_const_declarations diff --git a/mobile/openapi/lib/model/add_users_dto.dart b/mobile/openapi/lib/model/add_users_dto.dart index 7ecb0de5e8..2daa571265 100644 --- a/mobile/openapi/lib/model/add_users_dto.dart +++ b/mobile/openapi/lib/model/add_users_dto.dart @@ -14,32 +14,25 @@ class AddUsersDto { /// Returns a new [AddUsersDto] instance. AddUsersDto({ this.albumUsers = const [], - this.sharedUserIds = const [], }); List albumUsers; - /// This property was deprecated in v1.102.0 - List sharedUserIds; - @override bool operator ==(Object other) => identical(this, other) || other is AddUsersDto && - _deepEquality.equals(other.albumUsers, albumUsers) && - _deepEquality.equals(other.sharedUserIds, sharedUserIds); + _deepEquality.equals(other.albumUsers, albumUsers); @override int get hashCode => // ignore: unnecessary_parenthesis - (albumUsers.hashCode) + - (sharedUserIds.hashCode); + (albumUsers.hashCode); @override - String toString() => 'AddUsersDto[albumUsers=$albumUsers, sharedUserIds=$sharedUserIds]'; + String toString() => 'AddUsersDto[albumUsers=$albumUsers]'; Map toJson() { final json = {}; json[r'albumUsers'] = this.albumUsers; - json[r'sharedUserIds'] = this.sharedUserIds; return json; } @@ -52,9 +45,6 @@ class AddUsersDto { return AddUsersDto( albumUsers: AlbumUserAddDto.listFromJson(json[r'albumUsers']), - sharedUserIds: json[r'sharedUserIds'] is Iterable - ? (json[r'sharedUserIds'] as Iterable).cast().toList(growable: false) - : const [], ); } return null; diff --git a/mobile/openapi/lib/model/album_response_dto.dart b/mobile/openapi/lib/model/album_response_dto.dart index fcdb6c0960..c98a95775d 100644 --- a/mobile/openapi/lib/model/album_response_dto.dart +++ b/mobile/openapi/lib/model/album_response_dto.dart @@ -29,7 +29,6 @@ class AlbumResponseDto { required this.owner, required this.ownerId, required this.shared, - this.sharedUsers = const [], this.startDate, required this.updatedAt, }); @@ -84,9 +83,6 @@ class AlbumResponseDto { bool shared; - /// This property was deprecated in v1.102.0 - List sharedUsers; - /// /// 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 @@ -115,7 +111,6 @@ class AlbumResponseDto { other.owner == owner && other.ownerId == ownerId && other.shared == shared && - _deepEquality.equals(other.sharedUsers, sharedUsers) && other.startDate == startDate && other.updatedAt == updatedAt; @@ -138,12 +133,11 @@ class AlbumResponseDto { (owner.hashCode) + (ownerId.hashCode) + (shared.hashCode) + - (sharedUsers.hashCode) + (startDate == null ? 0 : startDate!.hashCode) + (updatedAt.hashCode); @override - String toString() => 'AlbumResponseDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, assets=$assets, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, owner=$owner, ownerId=$ownerId, shared=$shared, sharedUsers=$sharedUsers, startDate=$startDate, updatedAt=$updatedAt]'; + String toString() => 'AlbumResponseDto[albumName=$albumName, albumThumbnailAssetId=$albumThumbnailAssetId, albumUsers=$albumUsers, assetCount=$assetCount, assets=$assets, createdAt=$createdAt, description=$description, endDate=$endDate, hasSharedLink=$hasSharedLink, id=$id, isActivityEnabled=$isActivityEnabled, lastModifiedAssetTimestamp=$lastModifiedAssetTimestamp, order=$order, owner=$owner, ownerId=$ownerId, shared=$shared, startDate=$startDate, updatedAt=$updatedAt]'; Map toJson() { final json = {}; @@ -179,7 +173,6 @@ class AlbumResponseDto { json[r'owner'] = this.owner; json[r'ownerId'] = this.ownerId; json[r'shared'] = this.shared; - json[r'sharedUsers'] = this.sharedUsers; if (this.startDate != null) { json[r'startDate'] = this.startDate!.toUtc().toIso8601String(); } else { @@ -213,7 +206,6 @@ class AlbumResponseDto { owner: UserResponseDto.fromJson(json[r'owner'])!, ownerId: mapValueOfType(json, r'ownerId')!, shared: mapValueOfType(json, r'shared')!, - sharedUsers: UserResponseDto.listFromJson(json[r'sharedUsers']), startDate: mapDateTime(json, r'startDate', r''), updatedAt: mapDateTime(json, r'updatedAt', r'')!, ); @@ -276,7 +268,6 @@ class AlbumResponseDto { 'owner', 'ownerId', 'shared', - 'sharedUsers', 'updatedAt', }; } diff --git a/mobile/openapi/lib/model/asset_response_dto.dart b/mobile/openapi/lib/model/asset_response_dto.dart index b9c31e29cb..028331d0c0 100644 --- a/mobile/openapi/lib/model/asset_response_dto.dart +++ b/mobile/openapi/lib/model/asset_response_dto.dart @@ -24,10 +24,8 @@ class AssetResponseDto { required this.hasMetadata, required this.id, required this.isArchived, - this.isExternal, required this.isFavorite, required this.isOffline, - this.isReadOnly, required this.isTrashed, this.libraryId, this.livePhotoVideoId, @@ -77,28 +75,10 @@ class AssetResponseDto { bool isArchived; - /// This property was deprecated in v1.104.0 - /// - /// 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. - /// - bool? isExternal; - bool isFavorite; bool isOffline; - /// This property was deprecated in v1.104.0 - /// - /// 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. - /// - bool? isReadOnly; - bool isTrashed; /// This property was deprecated in v1.106.0 @@ -161,10 +141,8 @@ class AssetResponseDto { other.hasMetadata == hasMetadata && other.id == id && other.isArchived == isArchived && - other.isExternal == isExternal && other.isFavorite == isFavorite && other.isOffline == isOffline && - other.isReadOnly == isReadOnly && other.isTrashed == isTrashed && other.libraryId == libraryId && other.livePhotoVideoId == livePhotoVideoId && @@ -198,10 +176,8 @@ class AssetResponseDto { (hasMetadata.hashCode) + (id.hashCode) + (isArchived.hashCode) + - (isExternal == null ? 0 : isExternal!.hashCode) + (isFavorite.hashCode) + (isOffline.hashCode) + - (isReadOnly == null ? 0 : isReadOnly!.hashCode) + (isTrashed.hashCode) + (libraryId == null ? 0 : libraryId!.hashCode) + (livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) + @@ -222,7 +198,7 @@ class AssetResponseDto { (updatedAt.hashCode); @override - String toString() => 'AssetResponseDto[checksum=$checksum, deviceAssetId=$deviceAssetId, deviceId=$deviceId, duplicateId=$duplicateId, duration=$duration, exifInfo=$exifInfo, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, hasMetadata=$hasMetadata, id=$id, isArchived=$isArchived, isExternal=$isExternal, isFavorite=$isFavorite, isOffline=$isOffline, isReadOnly=$isReadOnly, isTrashed=$isTrashed, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, originalPath=$originalPath, owner=$owner, ownerId=$ownerId, people=$people, resized=$resized, smartInfo=$smartInfo, stack=$stack, stackCount=$stackCount, stackParentId=$stackParentId, tags=$tags, thumbhash=$thumbhash, type=$type, updatedAt=$updatedAt]'; + String toString() => 'AssetResponseDto[checksum=$checksum, deviceAssetId=$deviceAssetId, deviceId=$deviceId, duplicateId=$duplicateId, duration=$duration, exifInfo=$exifInfo, fileCreatedAt=$fileCreatedAt, fileModifiedAt=$fileModifiedAt, hasMetadata=$hasMetadata, id=$id, isArchived=$isArchived, isFavorite=$isFavorite, isOffline=$isOffline, isTrashed=$isTrashed, libraryId=$libraryId, livePhotoVideoId=$livePhotoVideoId, localDateTime=$localDateTime, originalFileName=$originalFileName, originalPath=$originalPath, owner=$owner, ownerId=$ownerId, people=$people, resized=$resized, smartInfo=$smartInfo, stack=$stack, stackCount=$stackCount, stackParentId=$stackParentId, tags=$tags, thumbhash=$thumbhash, type=$type, updatedAt=$updatedAt]'; Map toJson() { final json = {}; @@ -245,18 +221,8 @@ class AssetResponseDto { json[r'hasMetadata'] = this.hasMetadata; json[r'id'] = this.id; json[r'isArchived'] = this.isArchived; - if (this.isExternal != null) { - json[r'isExternal'] = this.isExternal; - } else { - // json[r'isExternal'] = null; - } json[r'isFavorite'] = this.isFavorite; json[r'isOffline'] = this.isOffline; - if (this.isReadOnly != null) { - json[r'isReadOnly'] = this.isReadOnly; - } else { - // json[r'isReadOnly'] = null; - } json[r'isTrashed'] = this.isTrashed; if (this.libraryId != null) { json[r'libraryId'] = this.libraryId; @@ -325,10 +291,8 @@ class AssetResponseDto { hasMetadata: mapValueOfType(json, r'hasMetadata')!, id: mapValueOfType(json, r'id')!, isArchived: mapValueOfType(json, r'isArchived')!, - isExternal: mapValueOfType(json, r'isExternal'), isFavorite: mapValueOfType(json, r'isFavorite')!, isOffline: mapValueOfType(json, r'isOffline')!, - isReadOnly: mapValueOfType(json, r'isReadOnly'), isTrashed: mapValueOfType(json, r'isTrashed')!, libraryId: mapValueOfType(json, r'libraryId'), livePhotoVideoId: mapValueOfType(json, r'livePhotoVideoId'), diff --git a/mobile/openapi/lib/model/create_album_dto.dart b/mobile/openapi/lib/model/create_album_dto.dart index b6d55c967c..fa28b782ac 100644 --- a/mobile/openapi/lib/model/create_album_dto.dart +++ b/mobile/openapi/lib/model/create_album_dto.dart @@ -17,12 +17,10 @@ class CreateAlbumDto { this.albumUsers = const [], this.assetIds = const [], this.description, - this.sharedWithUserIds = const [], }); String albumName; - /// This property was added in v1.104.0 List albumUsers; List assetIds; @@ -35,16 +33,12 @@ class CreateAlbumDto { /// String? description; - /// This property was deprecated in v1.104.0 - List sharedWithUserIds; - @override bool operator ==(Object other) => identical(this, other) || other is CreateAlbumDto && other.albumName == albumName && _deepEquality.equals(other.albumUsers, albumUsers) && _deepEquality.equals(other.assetIds, assetIds) && - other.description == description && - _deepEquality.equals(other.sharedWithUserIds, sharedWithUserIds); + other.description == description; @override int get hashCode => @@ -52,11 +46,10 @@ class CreateAlbumDto { (albumName.hashCode) + (albumUsers.hashCode) + (assetIds.hashCode) + - (description == null ? 0 : description!.hashCode) + - (sharedWithUserIds.hashCode); + (description == null ? 0 : description!.hashCode); @override - String toString() => 'CreateAlbumDto[albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description, sharedWithUserIds=$sharedWithUserIds]'; + String toString() => 'CreateAlbumDto[albumName=$albumName, albumUsers=$albumUsers, assetIds=$assetIds, description=$description]'; Map toJson() { final json = {}; @@ -68,7 +61,6 @@ class CreateAlbumDto { } else { // json[r'description'] = null; } - json[r'sharedWithUserIds'] = this.sharedWithUserIds; return json; } @@ -86,9 +78,6 @@ class CreateAlbumDto { ? (json[r'assetIds'] as Iterable).cast().toList(growable: false) : const [], description: mapValueOfType(json, r'description'), - sharedWithUserIds: json[r'sharedWithUserIds'] is Iterable - ? (json[r'sharedWithUserIds'] as Iterable).cast().toList(growable: false) - : const [], ); } return null; diff --git a/mobile/openapi/lib/model/memory_lane_response_dto.dart b/mobile/openapi/lib/model/memory_lane_response_dto.dart index bf6e8e2cce..4abe607381 100644 --- a/mobile/openapi/lib/model/memory_lane_response_dto.dart +++ b/mobile/openapi/lib/model/memory_lane_response_dto.dart @@ -14,37 +14,30 @@ class MemoryLaneResponseDto { /// Returns a new [MemoryLaneResponseDto] instance. MemoryLaneResponseDto({ this.assets = const [], - required this.title, required this.yearsAgo, }); List assets; - /// This property was deprecated in v1.100.0 - String title; - int yearsAgo; @override bool operator ==(Object other) => identical(this, other) || other is MemoryLaneResponseDto && _deepEquality.equals(other.assets, assets) && - other.title == title && other.yearsAgo == yearsAgo; @override int get hashCode => // ignore: unnecessary_parenthesis (assets.hashCode) + - (title.hashCode) + (yearsAgo.hashCode); @override - String toString() => 'MemoryLaneResponseDto[assets=$assets, title=$title, yearsAgo=$yearsAgo]'; + String toString() => 'MemoryLaneResponseDto[assets=$assets, yearsAgo=$yearsAgo]'; Map toJson() { final json = {}; json[r'assets'] = this.assets; - json[r'title'] = this.title; json[r'yearsAgo'] = this.yearsAgo; return json; } @@ -58,7 +51,6 @@ class MemoryLaneResponseDto { return MemoryLaneResponseDto( assets: AssetResponseDto.listFromJson(json[r'assets']), - title: mapValueOfType(json, r'title')!, yearsAgo: mapValueOfType(json, r'yearsAgo')!, ); } @@ -108,7 +100,6 @@ class MemoryLaneResponseDto { /// The list of required keys that must be present in a JSON. static const requiredKeys = { 'assets', - 'title', 'yearsAgo', }; } diff --git a/mobile/openapi/lib/model/metadata_search_dto.dart b/mobile/openapi/lib/model/metadata_search_dto.dart index c5aeb11066..322373ee58 100644 --- a/mobile/openapi/lib/model/metadata_search_dto.dart +++ b/mobile/openapi/lib/model/metadata_search_dto.dart @@ -39,7 +39,6 @@ class MetadataSearchDto { this.page, this.personIds = const [], this.previewPath, - this.resizePath, this.size, this.state, this.takenAfter, @@ -50,7 +49,6 @@ class MetadataSearchDto { this.type, this.updatedAfter, this.updatedBefore, - this.webpPath, this.withArchived = false, this.withDeleted, this.withExif, @@ -261,15 +259,6 @@ class MetadataSearchDto { /// String? previewPath; - /// This property was deprecated in v1.100.0 - /// - /// 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? resizePath; - /// Minimum value: 1 /// Maximum value: 1000 /// @@ -352,15 +341,6 @@ class MetadataSearchDto { /// DateTime? updatedBefore; - /// This property was deprecated in v1.100.0 - /// - /// 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? webpPath; - bool withArchived; /// @@ -423,7 +403,6 @@ class MetadataSearchDto { other.page == page && _deepEquality.equals(other.personIds, personIds) && other.previewPath == previewPath && - other.resizePath == resizePath && other.size == size && other.state == state && other.takenAfter == takenAfter && @@ -434,7 +413,6 @@ class MetadataSearchDto { other.type == type && other.updatedAfter == updatedAfter && other.updatedBefore == updatedBefore && - other.webpPath == webpPath && other.withArchived == withArchived && other.withDeleted == withDeleted && other.withExif == withExif && @@ -470,7 +448,6 @@ class MetadataSearchDto { (page == null ? 0 : page!.hashCode) + (personIds.hashCode) + (previewPath == null ? 0 : previewPath!.hashCode) + - (resizePath == null ? 0 : resizePath!.hashCode) + (size == null ? 0 : size!.hashCode) + (state == null ? 0 : state!.hashCode) + (takenAfter == null ? 0 : takenAfter!.hashCode) + @@ -481,7 +458,6 @@ class MetadataSearchDto { (type == null ? 0 : type!.hashCode) + (updatedAfter == null ? 0 : updatedAfter!.hashCode) + (updatedBefore == null ? 0 : updatedBefore!.hashCode) + - (webpPath == null ? 0 : webpPath!.hashCode) + (withArchived.hashCode) + (withDeleted == null ? 0 : withDeleted!.hashCode) + (withExif == null ? 0 : withExif!.hashCode) + @@ -489,7 +465,7 @@ class MetadataSearchDto { (withStacked == null ? 0 : withStacked!.hashCode); @override - String toString() => 'MetadataSearchDto[checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceAssetId=$deviceAssetId, deviceId=$deviceId, encodedVideoPath=$encodedVideoPath, id=$id, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, resizePath=$resizePath, size=$size, state=$state, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, webpPath=$webpPath, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; + String toString() => 'MetadataSearchDto[checksum=$checksum, city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceAssetId=$deviceAssetId, deviceId=$deviceId, encodedVideoPath=$encodedVideoPath, id=$id, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, order=$order, originalFileName=$originalFileName, originalPath=$originalPath, page=$page, personIds=$personIds, previewPath=$previewPath, size=$size, state=$state, takenAfter=$takenAfter, takenBefore=$takenBefore, thumbnailPath=$thumbnailPath, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif, withPeople=$withPeople, withStacked=$withStacked]'; Map toJson() { final json = {}; @@ -619,11 +595,6 @@ class MetadataSearchDto { } else { // json[r'previewPath'] = null; } - if (this.resizePath != null) { - json[r'resizePath'] = this.resizePath; - } else { - // json[r'resizePath'] = null; - } if (this.size != null) { json[r'size'] = this.size; } else { @@ -673,11 +644,6 @@ class MetadataSearchDto { json[r'updatedBefore'] = this.updatedBefore!.toUtc().toIso8601String(); } else { // json[r'updatedBefore'] = null; - } - if (this.webpPath != null) { - json[r'webpPath'] = this.webpPath; - } else { - // json[r'webpPath'] = null; } json[r'withArchived'] = this.withArchived; if (this.withDeleted != null) { @@ -739,7 +705,6 @@ class MetadataSearchDto { ? (json[r'personIds'] as Iterable).cast().toList(growable: false) : const [], previewPath: mapValueOfType(json, r'previewPath'), - resizePath: mapValueOfType(json, r'resizePath'), size: num.parse('${json[r'size']}'), state: mapValueOfType(json, r'state'), takenAfter: mapDateTime(json, r'takenAfter', r''), @@ -750,7 +715,6 @@ class MetadataSearchDto { type: AssetTypeEnum.fromJson(json[r'type']), updatedAfter: mapDateTime(json, r'updatedAfter', r''), updatedBefore: mapDateTime(json, r'updatedBefore', r''), - webpPath: mapValueOfType(json, r'webpPath'), withArchived: mapValueOfType(json, r'withArchived') ?? false, withDeleted: mapValueOfType(json, r'withDeleted'), withExif: mapValueOfType(json, r'withExif'), diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 4bec15e4ac..9809611535 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -4399,44 +4399,6 @@ ] } }, - "/server-info": { - "get": { - "deprecated": true, - "description": "This property was deprecated in v1.106.0", - "operationId": "getServerInfo", - "parameters": [], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServerStorageResponseDto" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "Server Info", - "Deprecated" - ], - "x-immich-lifecycle": { - "deprecatedAt": "v1.106.0" - } - } - }, "/server-info/config": { "get": { "operationId": "getServerConfig", @@ -6738,15 +6700,6 @@ "$ref": "#/components/schemas/AlbumUserAddDto" }, "type": "array" - }, - "sharedUserIds": { - "deprecated": true, - "description": "This property was deprecated in v1.102.0", - "items": { - "format": "uuid", - "type": "string" - }, - "type": "array" } }, "required": [ @@ -6844,14 +6797,6 @@ "shared": { "type": "boolean" }, - "sharedUsers": { - "deprecated": true, - "description": "This property was deprecated in v1.102.0", - "items": { - "$ref": "#/components/schemas/UserResponseDto" - }, - "type": "array" - }, "startDate": { "format": "date-time", "type": "string" @@ -6875,7 +6820,6 @@ "owner", "ownerId", "shared", - "sharedUsers", "updatedAt" ], "type": "object" @@ -7495,22 +7439,12 @@ "isArchived": { "type": "boolean" }, - "isExternal": { - "deprecated": true, - "description": "This property was deprecated in v1.104.0", - "type": "boolean" - }, "isFavorite": { "type": "boolean" }, "isOffline": { "type": "boolean" }, - "isReadOnly": { - "deprecated": true, - "description": "This property was deprecated in v1.104.0", - "type": "boolean" - }, "isTrashed": { "type": "boolean" }, @@ -7801,7 +7735,6 @@ "type": "string" }, "albumUsers": { - "description": "This property was added in v1.104.0", "items": { "$ref": "#/components/schemas/AlbumUserCreateDto" }, @@ -7816,15 +7749,6 @@ }, "description": { "type": "string" - }, - "sharedWithUserIds": { - "deprecated": true, - "description": "This property was deprecated in v1.104.0", - "items": { - "format": "uuid", - "type": "string" - }, - "type": "array" } }, "required": [ @@ -8672,18 +8596,12 @@ }, "type": "array" }, - "title": { - "deprecated": true, - "description": "This property was deprecated in v1.100.0", - "type": "string" - }, "yearsAgo": { "type": "integer" } }, "required": [ "assets", - "title", "yearsAgo" ], "type": "object" @@ -8874,11 +8792,6 @@ "previewPath": { "type": "string" }, - "resizePath": { - "deprecated": true, - "description": "This property was deprecated in v1.100.0", - "type": "string" - }, "size": { "maximum": 1000, "minimum": 1, @@ -8917,11 +8830,6 @@ "format": "date-time", "type": "string" }, - "webpPath": { - "deprecated": true, - "description": "This property was deprecated in v1.100.0", - "type": "string" - }, "withArchived": { "default": false, "type": "boolean" diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 2f895a76e8..29ae94c428 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -123,12 +123,8 @@ export type AssetResponseDto = { hasMetadata: boolean; id: string; isArchived: boolean; - /** This property was deprecated in v1.104.0 */ - isExternal?: boolean; isFavorite: boolean; isOffline: boolean; - /** This property was deprecated in v1.104.0 */ - isReadOnly?: boolean; isTrashed: boolean; /** This property was deprecated in v1.106.0 */ libraryId?: string | null; @@ -166,8 +162,6 @@ export type AlbumResponseDto = { owner: UserResponseDto; ownerId: string; shared: boolean; - /** This property was deprecated in v1.102.0 */ - sharedUsers: UserResponseDto[]; startDate?: string; updatedAt: string; }; @@ -177,12 +171,9 @@ export type AlbumUserCreateDto = { }; export type CreateAlbumDto = { albumName: string; - /** This property was added in v1.104.0 */ albumUsers?: AlbumUserCreateDto[]; assetIds?: string[]; description?: string; - /** This property was deprecated in v1.104.0 */ - sharedWithUserIds?: string[]; }; export type AlbumCountResponseDto = { notShared: number; @@ -213,8 +204,6 @@ export type AlbumUserAddDto = { }; export type AddUsersDto = { albumUsers: AlbumUserAddDto[]; - /** This property was deprecated in v1.102.0 */ - sharedUserIds?: string[]; }; export type ApiKeyResponseDto = { createdAt: string; @@ -285,8 +274,6 @@ export type MapMarkerResponseDto = { }; export type MemoryLaneResponseDto = { assets: AssetResponseDto[]; - /** This property was deprecated in v1.100.0 */ - title: string; yearsAgo: number; }; export type UpdateStackParentDto = { @@ -660,8 +647,6 @@ export type MetadataSearchDto = { page?: number; personIds?: string[]; previewPath?: string; - /** This property was deprecated in v1.100.0 */ - resizePath?: string; size?: number; state?: string; takenAfter?: string; @@ -672,8 +657,6 @@ export type MetadataSearchDto = { "type"?: AssetTypeEnum; updatedAfter?: string; updatedBefore?: string; - /** This property was deprecated in v1.100.0 */ - webpPath?: string; withArchived?: boolean; withDeleted?: boolean; withExif?: boolean; @@ -745,15 +728,6 @@ export type SmartSearchDto = { withDeleted?: boolean; withExif?: boolean; }; -export type ServerStorageResponseDto = { - diskAvailable: string; - diskAvailableRaw: number; - diskSize: string; - diskSizeRaw: number; - diskUsagePercentage: number; - diskUse: string; - diskUseRaw: number; -}; export type ServerConfigDto = { externalDomain: string; isInitialized: boolean; @@ -801,6 +775,15 @@ export type ServerStatsResponseDto = { usageByUser: UsageByUserDto[]; videos: number; }; +export type ServerStorageResponseDto = { + diskAvailable: string; + diskAvailableRaw: number; + diskSize: string; + diskSizeRaw: number; + diskUsagePercentage: number; + diskUse: string; + diskUseRaw: number; +}; export type ServerThemeDto = { customCss: string; }; @@ -2277,17 +2260,6 @@ export function getSearchSuggestions({ country, make, model, state, $type }: { ...opts })); } -/** - * This property was deprecated in v1.106.0 - */ -export function getServerInfo(opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 200; - data: ServerStorageResponseDto; - }>("/server-info", { - ...opts - })); -} export function getServerConfig(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; diff --git a/server/src/controllers/server-info.controller.ts b/server/src/controllers/server-info.controller.ts index 308778dbb5..03968c1f5e 100644 --- a/server/src/controllers/server-info.controller.ts +++ b/server/src/controllers/server-info.controller.ts @@ -1,6 +1,5 @@ import { Controller, Get } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { EndpointLifecycle } from 'src/decorators'; import { ServerConfigDto, ServerFeaturesDto, @@ -23,13 +22,6 @@ export class ServerInfoController { private versionService: VersionService, ) {} - @Get() - @EndpointLifecycle({ deprecatedAt: 'v1.106.0' }) - @Authenticated() - getServerInfo(): Promise { - return this.service.getStorage(); - } - @Get('storage') @Authenticated() getStorage(): Promise { diff --git a/server/src/dtos/album.dto.ts b/server/src/dtos/album.dto.ts index 19d03a4d8e..21eb649e11 100644 --- a/server/src/dtos/album.dto.ts +++ b/server/src/dtos/album.dto.ts @@ -2,7 +2,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { ArrayNotEmpty, IsArray, IsEnum, IsString, ValidateNested } from 'class-validator'; import _ from 'lodash'; -import { PropertyLifecycle } from 'src/decorators'; import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; import { UserResponseDto, mapUser } from 'src/dtos/user.dto'; @@ -25,10 +24,6 @@ export class AlbumUserAddDto { } export class AddUsersDto { - @ValidateUUID({ each: true, optional: true }) - @PropertyLifecycle({ deprecatedAt: 'v1.102.0' }) - sharedUserIds?: string[]; - @ArrayNotEmpty() albumUsers!: AlbumUserAddDto[]; } @@ -55,13 +50,8 @@ export class CreateAlbumDto { @IsArray() @ValidateNested({ each: true }) @Type(() => AlbumUserCreateDto) - @PropertyLifecycle({ addedAt: 'v1.104.0' }) albumUsers?: AlbumUserCreateDto[]; - @ValidateUUID({ optional: true, each: true }) - @PropertyLifecycle({ deprecatedAt: 'v1.104.0' }) - sharedWithUserIds?: string[]; - @ValidateUUID({ optional: true, each: true }) assetIds?: string[]; } @@ -137,8 +127,6 @@ export class AlbumResponseDto { updatedAt!: Date; albumThumbnailAssetId!: string | null; shared!: boolean; - @PropertyLifecycle({ deprecatedAt: 'v1.102.0' }) - sharedUsers!: UserResponseDto[]; albumUsers!: AlbumUserResponseDto[]; hasSharedLink!: boolean; assets!: AssetResponseDto[]; @@ -192,7 +180,6 @@ export const mapAlbum = (entity: AlbumEntity, withAssets: boolean, auth?: AuthDt id: entity.id, ownerId: entity.ownerId, owner: mapUser(entity.owner), - sharedUsers, albumUsers: albumUsersSorted, shared: hasSharedUser || hasSharedLink, hasSharedLink, diff --git a/server/src/dtos/asset-response.dto.ts b/server/src/dtos/asset-response.dto.ts index 2cf12061d1..3d6cd4cad5 100644 --- a/server/src/dtos/asset-response.dto.ts +++ b/server/src/dtos/asset-response.dto.ts @@ -37,10 +37,6 @@ export class AssetResponseDto extends SanitizedAssetResponseDto { isArchived!: boolean; isTrashed!: boolean; isOffline!: boolean; - @PropertyLifecycle({ deprecatedAt: 'v1.104.0' }) - isExternal?: boolean; - @PropertyLifecycle({ deprecatedAt: 'v1.104.0' }) - isReadOnly?: boolean; exifInfo?: ExifResponseDto; smartInfo?: SmartInfoResponseDto; tags?: TagResponseDto[]; @@ -129,17 +125,12 @@ export function mapAsset(entity: AssetEntity, options: AssetMapOptions = {}): As : undefined, stackCount: entity.stack?.assets?.length ?? null, isOffline: entity.isOffline, - isExternal: false, - isReadOnly: false, hasMetadata: true, duplicateId: entity.duplicateId, }; } export class MemoryLaneResponseDto { - @PropertyLifecycle({ deprecatedAt: 'v1.100.0' }) - title!: string; - @ApiProperty({ type: 'integer' }) yearsAgo!: number; diff --git a/server/src/dtos/search.dto.ts b/server/src/dtos/search.dto.ts index 4d05b9f3aa..5927aa86fc 100644 --- a/server/src/dtos/search.dto.ts +++ b/server/src/dtos/search.dto.ts @@ -1,7 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { IsEnum, IsInt, IsNotEmpty, IsString, Max, Min } from 'class-validator'; -import { PropertyLifecycle } from 'src/decorators'; import { AlbumResponseDto } from 'src/dtos/album.dto'; import { AssetResponseDto } from 'src/dtos/asset-response.dto'; import { AssetOrder } from 'src/entities/album.entity'; @@ -155,18 +154,6 @@ export class MetadataSearchDto extends BaseSearchDto { @Optional() originalPath?: string; - @IsString() - @IsNotEmpty() - @Optional() - @PropertyLifecycle({ deprecatedAt: 'v1.100.0' }) - resizePath?: string; - - @IsString() - @IsNotEmpty() - @Optional() - @PropertyLifecycle({ deprecatedAt: 'v1.100.0' }) - webpPath?: string; - @IsString() @IsNotEmpty() @Optional() diff --git a/server/src/services/album.service.spec.ts b/server/src/services/album.service.spec.ts index e2a7fc49c4..3d20a6a559 100644 --- a/server/src/services/album.service.spec.ts +++ b/server/src/services/album.service.spec.ts @@ -185,7 +185,7 @@ describe(AlbumService.name, () => { await sut.create(authStub.admin, { albumName: 'Empty album', - sharedWithUserIds: ['user-id'], + albumUsers: [{ userId: 'user-id', role: AlbumUserRole.EDITOR }], description: '', assetIds: ['123'], }); @@ -208,7 +208,7 @@ describe(AlbumService.name, () => { await expect( sut.create(authStub.admin, { albumName: 'Empty album', - sharedWithUserIds: ['user-3'], + albumUsers: [{ userId: 'user-3', role: AlbumUserRole.EDITOR }], }), ).rejects.toBeInstanceOf(BadRequestException); expect(userMock.get).toHaveBeenCalledWith('user-3', {}); diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index 38464bd75a..643d060494 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -14,7 +14,7 @@ import { } from 'src/dtos/album.dto'; import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto'; import { AuthDto } from 'src/dtos/auth.dto'; -import { AlbumUserEntity, AlbumUserRole } from 'src/entities/album-user.entity'; +import { AlbumUserEntity } from 'src/entities/album-user.entity'; import { AlbumEntity } from 'src/entities/album.entity'; import { AssetEntity } from 'src/entities/asset.entity'; import { IAccessRepository } from 'src/interfaces/access.interface'; @@ -115,9 +115,6 @@ export class AlbumService { async create(auth: AuthDto, dto: CreateAlbumDto): Promise { const albumUsers = dto.albumUsers || []; - for (const userId of dto.sharedWithUserIds || []) { - albumUsers.push({ userId, role: AlbumUserRole.EDITOR }); - } for (const { userId } of albumUsers) { const exists = await this.userRepository.get(userId, {}); @@ -216,15 +213,7 @@ export class AlbumService { return results; } - async addUsers(auth: AuthDto, id: string, { albumUsers, sharedUserIds }: AddUsersDto): Promise { - // Remove once deprecated sharedUserIds is removed - if (!albumUsers) { - if (!sharedUserIds) { - throw new BadRequestException('No users provided'); - } - albumUsers = sharedUserIds.map((userId) => ({ userId, role: AlbumUserRole.EDITOR })); - } - + async addUsers(auth: AuthDto, id: string, { albumUsers }: AddUsersDto): Promise { await this.access.requirePermission(auth, Permission.ALBUM_SHARE, id); const album = await this.findOrFail(id, { withAssets: false }); diff --git a/server/src/services/search.service.ts b/server/src/services/search.service.ts index 10a2ccda2a..8c89218138 100644 --- a/server/src/services/search.service.ts +++ b/server/src/services/search.service.ts @@ -78,9 +78,6 @@ export class SearchService { checksum = Buffer.from(dto.checksum, encoding); } - dto.previewPath ??= dto.resizePath; - dto.thumbnailPath ??= dto.webpPath; - const page = dto.page ?? 1; const size = dto.size || 250; const enumToOrder = { [AssetOrder.ASC]: 'ASC', [AssetOrder.DESC]: 'DESC' } as const; diff --git a/server/test/fixtures/shared-link.stub.ts b/server/test/fixtures/shared-link.stub.ts index ebadc63fac..acea121609 100644 --- a/server/test/fixtures/shared-link.stub.ts +++ b/server/test/fixtures/shared-link.stub.ts @@ -57,7 +57,6 @@ const assetResponse: AssetResponseDto = { resized: false, thumbhash: null, fileModifiedAt: today, - isExternal: false, isOffline: false, fileCreatedAt: today, localDateTime: today, @@ -100,7 +99,6 @@ const albumResponse: AlbumResponseDto = { id: 'album-123', ownerId: 'admin_id', owner: mapUser(userStub.admin), - sharedUsers: [], albumUsers: [], shared: false, hasSharedLink: false, diff --git a/web/src/lib/components/album-page/album-options.svelte b/web/src/lib/components/album-page/album-options.svelte index e0d11b3b22..0b91dbb027 100644 --- a/web/src/lib/components/album-page/album-options.svelte +++ b/web/src/lib/components/album-page/album-options.svelte @@ -88,7 +88,7 @@
{user.name}
Owner
- {#each album.sharedUsers as user (user.id)} + {#each album.albumUsers as { user } (user.id)}
diff --git a/web/src/lib/components/album-page/user-selection-modal.svelte b/web/src/lib/components/album-page/user-selection-modal.svelte index ffe8adf480..78947c2032 100644 --- a/web/src/lib/components/album-page/user-selection-modal.svelte +++ b/web/src/lib/components/album-page/user-selection-modal.svelte @@ -42,8 +42,8 @@ users = data.filter((user) => !(user.deletedAt || user.id === album.ownerId)); // Remove the existed shared users from the album - for (const sharedUser of album.sharedUsers) { - users = users.filter((user) => user.id !== sharedUser.id); + for (const sharedUser of album.albumUsers) { + users = users.filter((user) => user.id !== sharedUser.user.id); } }); diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index c921faafff..52a80e3baa 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -571,7 +571,7 @@
{/if} -{#if currentAlbum && currentAlbum.sharedUsers.length > 0 && asset.owner} +{#if currentAlbum && currentAlbum.albumUsers.length > 0 && asset.owner}

SHARED BY

diff --git a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte index d63776342c..32fb7c01ee 100644 --- a/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/albums/[albumId=id]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -136,7 +136,7 @@ assetGridWidth = isShowActivity ? globalWidth - (globalWidth < 768 ? 360 : 460) : globalWidth; } $: showActivityStatus = - album.sharedUsers.length > 0 && !$showAssetViewer && (album.isActivityEnabled || $numberOfComments > 0); + album.albumUsers.length > 0 && !$showAssetViewer && (album.isActivityEnabled || $numberOfComments > 0); $: isEditor = album.albumUsers.find(({ user: { id } }) => id === $user.id)?.role === AlbumUserRole.Editor || @@ -158,7 +158,7 @@ backUrl = url || AppRoute.ALBUMS; - if (backUrl === AppRoute.SHARING && album.sharedUsers.length === 0 && !album.hasSharedLink) { + if (backUrl === AppRoute.SHARING && album.albumUsers.length === 0 && !album.hasSharedLink) { isCreatingSharedAlbum = true; } }); @@ -229,7 +229,7 @@ isShowActivity = !isShowActivity; }; - $: if (album.sharedUsers.length > 0) { + $: if (album.albumUsers.length > 0) { handlePromiseError(getFavorite()); handlePromiseError(getNumberOfComments()); } @@ -342,7 +342,7 @@ try { await refreshAlbum(); - viewMode = album.sharedUsers.length > 0 ? ViewMode.VIEW_USERS : ViewMode.VIEW; + viewMode = album.albumUsers.length > 0 ? ViewMode.VIEW_USERS : ViewMode.VIEW; } catch (error) { handleError(error, 'Error deleting shared user'); } @@ -482,7 +482,7 @@ {/if} {/if} - {#if isCreatingSharedAlbum && album.sharedUsers.length === 0} + {#if isCreatingSharedAlbum && album.albumUsers.length === 0}