diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 56a94fb339..dd3c2b3a66 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -86,7 +86,6 @@ doc/ThumbnailFormat.md doc/TimeGroupEnum.md doc/UpdateAlbumDto.md doc/UpdateAssetDto.md -doc/UpdateAssetsToSharedLinkDto.md doc/UpdateTagDto.md doc/UpdateUserDto.md doc/UpsertDeviceInfoDto.md @@ -189,7 +188,6 @@ lib/model/thumbnail_format.dart lib/model/time_group_enum.dart lib/model/update_album_dto.dart lib/model/update_asset_dto.dart -lib/model/update_assets_to_shared_link_dto.dart lib/model/update_tag_dto.dart lib/model/update_user_dto.dart lib/model/upsert_device_info_dto.dart @@ -281,7 +279,6 @@ test/thumbnail_format_test.dart test/time_group_enum_test.dart test/update_album_dto_test.dart test/update_asset_dto_test.dart -test/update_assets_to_shared_link_dto_test.dart test/update_tag_dto_test.dart test/update_user_dto_test.dart test/upsert_device_info_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 6e2f5c856d..e95dc19083 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -3,7 +3,7 @@ Immich API This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: -- API version: 1.46.1 +- API version: 1.47.2 - Build package: org.openapitools.codegen.languages.DartClientCodegen ## Requirements @@ -75,6 +75,7 @@ Class | Method | HTTP request | Description *AlbumApi* | [**removeAssetFromAlbum**](doc//AlbumApi.md#removeassetfromalbum) | **DELETE** /album/{albumId}/assets | *AlbumApi* | [**removeUserFromAlbum**](doc//AlbumApi.md#removeuserfromalbum) | **DELETE** /album/{albumId}/user/{userId} | *AlbumApi* | [**updateAlbumInfo**](doc//AlbumApi.md#updatealbuminfo) | **PATCH** /album/{albumId} | +*AssetApi* | [**addAssetsToSharedLink**](doc//AssetApi.md#addassetstosharedlink) | **PATCH** /asset/shared-link/add | *AssetApi* | [**checkDuplicateAsset**](doc//AssetApi.md#checkduplicateasset) | **POST** /asset/check | *AssetApi* | [**checkExistingAssets**](doc//AssetApi.md#checkexistingassets) | **POST** /asset/exist | *AssetApi* | [**createAssetsSharedLink**](doc//AssetApi.md#createassetssharedlink) | **POST** /asset/shared-link | @@ -92,10 +93,10 @@ Class | Method | HTTP request | Description *AssetApi* | [**getCuratedLocations**](doc//AssetApi.md#getcuratedlocations) | **GET** /asset/curated-locations | *AssetApi* | [**getCuratedObjects**](doc//AssetApi.md#getcuratedobjects) | **GET** /asset/curated-objects | *AssetApi* | [**getUserAssetsByDeviceId**](doc//AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} | +*AssetApi* | [**removeAssetsFromSharedLink**](doc//AssetApi.md#removeassetsfromsharedlink) | **PATCH** /asset/shared-link/remove | *AssetApi* | [**searchAsset**](doc//AssetApi.md#searchasset) | **POST** /asset/search | *AssetApi* | [**serveFile**](doc//AssetApi.md#servefile) | **GET** /asset/file/{assetId} | *AssetApi* | [**updateAsset**](doc//AssetApi.md#updateasset) | **PUT** /asset/{assetId} | -*AssetApi* | [**updateAssetsInSharedLink**](doc//AssetApi.md#updateassetsinsharedlink) | **PATCH** /asset/shared-link | *AssetApi* | [**uploadFile**](doc//AssetApi.md#uploadfile) | **POST** /asset/upload | *AuthenticationApi* | [**adminSignUp**](doc//AuthenticationApi.md#adminsignup) | **POST** /auth/admin-sign-up | *AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password | @@ -214,7 +215,6 @@ Class | Method | HTTP request | Description - [TimeGroupEnum](doc//TimeGroupEnum.md) - [UpdateAlbumDto](doc//UpdateAlbumDto.md) - [UpdateAssetDto](doc//UpdateAssetDto.md) - - [UpdateAssetsToSharedLinkDto](doc//UpdateAssetsToSharedLinkDto.md) - [UpdateTagDto](doc//UpdateTagDto.md) - [UpdateUserDto](doc//UpdateUserDto.md) - [UpsertDeviceInfoDto](doc//UpsertDeviceInfoDto.md) diff --git a/mobile/openapi/doc/AssetApi.md b/mobile/openapi/doc/AssetApi.md index aa5335d174..595a21d0c9 100644 --- a/mobile/openapi/doc/AssetApi.md +++ b/mobile/openapi/doc/AssetApi.md @@ -9,6 +9,7 @@ All URIs are relative to */api* Method | HTTP request | Description ------------- | ------------- | ------------- +[**addAssetsToSharedLink**](AssetApi.md#addassetstosharedlink) | **PATCH** /asset/shared-link/add | [**checkDuplicateAsset**](AssetApi.md#checkduplicateasset) | **POST** /asset/check | [**checkExistingAssets**](AssetApi.md#checkexistingassets) | **POST** /asset/exist | [**createAssetsSharedLink**](AssetApi.md#createassetssharedlink) | **POST** /asset/shared-link | @@ -26,13 +27,62 @@ Method | HTTP request | Description [**getCuratedLocations**](AssetApi.md#getcuratedlocations) | **GET** /asset/curated-locations | [**getCuratedObjects**](AssetApi.md#getcuratedobjects) | **GET** /asset/curated-objects | [**getUserAssetsByDeviceId**](AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} | +[**removeAssetsFromSharedLink**](AssetApi.md#removeassetsfromsharedlink) | **PATCH** /asset/shared-link/remove | [**searchAsset**](AssetApi.md#searchasset) | **POST** /asset/search | [**serveFile**](AssetApi.md#servefile) | **GET** /asset/file/{assetId} | [**updateAsset**](AssetApi.md#updateasset) | **PUT** /asset/{assetId} | -[**updateAssetsInSharedLink**](AssetApi.md#updateassetsinsharedlink) | **PATCH** /asset/shared-link | [**uploadFile**](AssetApi.md#uploadfile) | **POST** /asset/upload | +# **addAssetsToSharedLink** +> SharedLinkResponseDto addAssetsToSharedLink(addAssetsDto) + + + + + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure HTTP Bearer authorization: bearer +// Case 1. Use String Token +//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); +// Case 2. Use Function which generate token. +// String yourTokenGeneratorFunction() { ... } +//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); + +final api_instance = AssetApi(); +final addAssetsDto = AddAssetsDto(); // AddAssetsDto | + +try { + final result = api_instance.addAssetsToSharedLink(addAssetsDto); + print(result); +} catch (e) { + print('Exception when calling AssetApi->addAssetsToSharedLink: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **addAssetsDto** | [**AddAssetsDto**](AddAssetsDto.md)| | + +### Return type + +[**SharedLinkResponseDto**](SharedLinkResponseDto.md) + +### Authorization + +[bearer](../README.md#bearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **checkDuplicateAsset** > CheckDuplicateAssetResponseDto checkDuplicateAsset(checkDuplicateAssetDto) @@ -856,6 +906,55 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **removeAssetsFromSharedLink** +> SharedLinkResponseDto removeAssetsFromSharedLink(removeAssetsDto) + + + + + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure HTTP Bearer authorization: bearer +// Case 1. Use String Token +//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); +// Case 2. Use Function which generate token. +// String yourTokenGeneratorFunction() { ... } +//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); + +final api_instance = AssetApi(); +final removeAssetsDto = RemoveAssetsDto(); // RemoveAssetsDto | + +try { + final result = api_instance.removeAssetsFromSharedLink(removeAssetsDto); + print(result); +} catch (e) { + print('Exception when calling AssetApi->removeAssetsFromSharedLink: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **removeAssetsDto** | [**RemoveAssetsDto**](RemoveAssetsDto.md)| | + +### Return type + +[**SharedLinkResponseDto**](SharedLinkResponseDto.md) + +### Authorization + +[bearer](../README.md#bearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **searchAsset** > List searchAsset(searchAssetDto) @@ -1009,55 +1108,6 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) -# **updateAssetsInSharedLink** -> SharedLinkResponseDto updateAssetsInSharedLink(updateAssetsToSharedLinkDto) - - - - - -### Example -```dart -import 'package:openapi/api.dart'; -// TODO Configure HTTP Bearer authorization: bearer -// Case 1. Use String Token -//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); -// Case 2. Use Function which generate token. -// String yourTokenGeneratorFunction() { ... } -//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); - -final api_instance = AssetApi(); -final updateAssetsToSharedLinkDto = UpdateAssetsToSharedLinkDto(); // UpdateAssetsToSharedLinkDto | - -try { - final result = api_instance.updateAssetsInSharedLink(updateAssetsToSharedLinkDto); - print(result); -} catch (e) { - print('Exception when calling AssetApi->updateAssetsInSharedLink: $e\n'); -} -``` - -### Parameters - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **updateAssetsToSharedLinkDto** | [**UpdateAssetsToSharedLinkDto**](UpdateAssetsToSharedLinkDto.md)| | - -### Return type - -[**SharedLinkResponseDto**](SharedLinkResponseDto.md) - -### Authorization - -[bearer](../README.md#bearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - # **uploadFile** > AssetFileUploadResponseDto uploadFile(assetType, assetData, deviceAssetId, deviceId, createdAt, modifiedAt, isFavorite, fileExtension, livePhotoData, isVisible, duration) diff --git a/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md b/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md deleted file mode 100644 index 3f7d70c7e7..0000000000 --- a/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md +++ /dev/null @@ -1,15 +0,0 @@ -# openapi.model.UpdateAssetsToSharedLinkDto - -## Load the model package -```dart -import 'package:openapi/api.dart'; -``` - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**assetIds** | **List** | | [default to const []] - -[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) - - diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index edec2eb973..2f426ca699 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -113,7 +113,6 @@ part 'model/thumbnail_format.dart'; part 'model/time_group_enum.dart'; part 'model/update_album_dto.dart'; part 'model/update_asset_dto.dart'; -part 'model/update_assets_to_shared_link_dto.dart'; part 'model/update_tag_dto.dart'; part 'model/update_user_dto.dart'; part 'model/upsert_device_info_dto.dart'; diff --git a/mobile/openapi/lib/api/asset_api.dart b/mobile/openapi/lib/api/asset_api.dart index 72580bc4c9..cf360d2418 100644 --- a/mobile/openapi/lib/api/asset_api.dart +++ b/mobile/openapi/lib/api/asset_api.dart @@ -16,6 +16,58 @@ class AssetApi { final ApiClient apiClient; + /// + /// + /// Note: This method returns the HTTP [Response]. + /// + /// Parameters: + /// + /// * [AddAssetsDto] addAssetsDto (required): + Future addAssetsToSharedLinkWithHttpInfo(AddAssetsDto addAssetsDto,) async { + // ignore: prefer_const_declarations + final path = r'/asset/shared-link/add'; + + // ignore: prefer_final_locals + Object? postBody = addAssetsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + path, + 'PATCH', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// + /// + /// Parameters: + /// + /// * [AddAssetsDto] addAssetsDto (required): + Future addAssetsToSharedLink(AddAssetsDto addAssetsDto,) async { + final response = await addAssetsToSharedLinkWithHttpInfo(addAssetsDto,); + 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), 'SharedLinkResponseDto',) as SharedLinkResponseDto; + + } + return null; + } + /// Check duplicated asset before uploading - for Web upload used /// /// Note: This method returns the HTTP [Response]. @@ -926,6 +978,58 @@ class AssetApi { return null; } + /// + /// + /// Note: This method returns the HTTP [Response]. + /// + /// Parameters: + /// + /// * [RemoveAssetsDto] removeAssetsDto (required): + Future removeAssetsFromSharedLinkWithHttpInfo(RemoveAssetsDto removeAssetsDto,) async { + // ignore: prefer_const_declarations + final path = r'/asset/shared-link/remove'; + + // ignore: prefer_final_locals + Object? postBody = removeAssetsDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + path, + 'PATCH', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// + /// + /// Parameters: + /// + /// * [RemoveAssetsDto] removeAssetsDto (required): + Future removeAssetsFromSharedLink(RemoveAssetsDto removeAssetsDto,) async { + final response = await removeAssetsFromSharedLinkWithHttpInfo(removeAssetsDto,); + 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), 'SharedLinkResponseDto',) as SharedLinkResponseDto; + + } + return null; + } + /// /// /// Note: This method returns the HTTP [Response]. @@ -1106,58 +1210,6 @@ class AssetApi { return null; } - /// - /// - /// Note: This method returns the HTTP [Response]. - /// - /// Parameters: - /// - /// * [UpdateAssetsToSharedLinkDto] updateAssetsToSharedLinkDto (required): - Future updateAssetsInSharedLinkWithHttpInfo(UpdateAssetsToSharedLinkDto updateAssetsToSharedLinkDto,) async { - // ignore: prefer_const_declarations - final path = r'/asset/shared-link'; - - // ignore: prefer_final_locals - Object? postBody = updateAssetsToSharedLinkDto; - - final queryParams = []; - final headerParams = {}; - final formParams = {}; - - const contentTypes = ['application/json']; - - - return apiClient.invokeAPI( - path, - 'PATCH', - queryParams, - postBody, - headerParams, - formParams, - contentTypes.isEmpty ? null : contentTypes.first, - ); - } - - /// - /// - /// Parameters: - /// - /// * [UpdateAssetsToSharedLinkDto] updateAssetsToSharedLinkDto (required): - Future updateAssetsInSharedLink(UpdateAssetsToSharedLinkDto updateAssetsToSharedLinkDto,) async { - final response = await updateAssetsInSharedLinkWithHttpInfo(updateAssetsToSharedLinkDto,); - 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), 'SharedLinkResponseDto',) as SharedLinkResponseDto; - - } - return null; - } - /// /// /// Note: This method returns the HTTP [Response]. diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 632c79f6c9..8fe18d2f79 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -336,8 +336,6 @@ class ApiClient { return UpdateAlbumDto.fromJson(value); case 'UpdateAssetDto': return UpdateAssetDto.fromJson(value); - case 'UpdateAssetsToSharedLinkDto': - return UpdateAssetsToSharedLinkDto.fromJson(value); case 'UpdateTagDto': return UpdateTagDto.fromJson(value); case 'UpdateUserDto': diff --git a/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart b/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart deleted file mode 100644 index fb8a4c780d..0000000000 --- a/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart +++ /dev/null @@ -1,113 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// 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 UpdateAssetsToSharedLinkDto { - /// Returns a new [UpdateAssetsToSharedLinkDto] instance. - UpdateAssetsToSharedLinkDto({ - this.assetIds = const [], - }); - - List assetIds; - - @override - bool operator ==(Object other) => identical(this, other) || other is UpdateAssetsToSharedLinkDto && - other.assetIds == assetIds; - - @override - int get hashCode => - // ignore: unnecessary_parenthesis - (assetIds.hashCode); - - @override - String toString() => 'UpdateAssetsToSharedLinkDto[assetIds=$assetIds]'; - - Map toJson() { - final json = {}; - json[r'assetIds'] = this.assetIds; - return json; - } - - /// Returns a new [UpdateAssetsToSharedLinkDto] instance and imports its values from - /// [value] if it's a [Map], null otherwise. - // ignore: prefer_constructors_over_static_methods - static UpdateAssetsToSharedLinkDto? fromJson(dynamic value) { - if (value is Map) { - final json = value.cast(); - - // Ensure that the map contains the required keys. - // Note 1: the values aren't checked for validity beyond being non-null. - // Note 2: this code is stripped in release mode! - assert(() { - requiredKeys.forEach((key) { - assert(json.containsKey(key), 'Required key "UpdateAssetsToSharedLinkDto[$key]" is missing from JSON.'); - assert(json[key] != null, 'Required key "UpdateAssetsToSharedLinkDto[$key]" has a null value in JSON.'); - }); - return true; - }()); - - return UpdateAssetsToSharedLinkDto( - assetIds: json[r'assetIds'] is List - ? (json[r'assetIds'] as List).cast() - : const [], - ); - } - 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 = UpdateAssetsToSharedLinkDto.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 = UpdateAssetsToSharedLinkDto.fromJson(entry.value); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - // maps a json object with a list of UpdateAssetsToSharedLinkDto-objects as value to a dart map - static Map> mapListFromJson(dynamic json, {bool growable = false,}) { - final map = >{}; - if (json is Map && json.isNotEmpty) { - json = json.cast(); // ignore: parameter_assignments - for (final entry in json.entries) { - final value = UpdateAssetsToSharedLinkDto.listFromJson(entry.value, growable: growable,); - if (value != null) { - map[entry.key] = value; - } - } - } - return map; - } - - /// The list of required keys that must be present in a JSON. - static const requiredKeys = { - 'assetIds', - }; -} - diff --git a/mobile/openapi/test/asset_api_test.dart b/mobile/openapi/test/asset_api_test.dart index b96510494c..6c23680d27 100644 --- a/mobile/openapi/test/asset_api_test.dart +++ b/mobile/openapi/test/asset_api_test.dart @@ -17,6 +17,13 @@ void main() { // final instance = AssetApi(); group('tests for AssetApi', () { + // + // + //Future addAssetsToSharedLink(AddAssetsDto addAssetsDto) async + test('test addAssetsToSharedLink', () async { + // TODO + }); + // Check duplicated asset before uploading - for Web upload used // //Future checkDuplicateAsset(CheckDuplicateAssetDto checkDuplicateAssetDto) async @@ -136,6 +143,13 @@ void main() { // TODO }); + // + // + //Future removeAssetsFromSharedLink(RemoveAssetsDto removeAssetsDto) async + test('test removeAssetsFromSharedLink', () async { + // TODO + }); + // // //Future> searchAsset(SearchAssetDto searchAssetDto) async @@ -157,13 +171,6 @@ void main() { // TODO }); - // - // - //Future updateAssetsInSharedLink(UpdateAssetsToSharedLinkDto updateAssetsToSharedLinkDto) async - test('test updateAssetsInSharedLink', () async { - // TODO - }); - // // //Future uploadFile(AssetTypeEnum assetType, MultipartFile assetData, String deviceAssetId, String deviceId, String createdAt, String modifiedAt, bool isFavorite, String fileExtension, { MultipartFile livePhotoData, bool isVisible, String duration }) async diff --git a/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart b/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart deleted file mode 100644 index 9b0fb4d1da..0000000000 --- a/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart +++ /dev/null @@ -1,27 +0,0 @@ -// -// AUTO-GENERATED FILE, DO NOT MODIFY! -// -// @dart=2.12 - -// 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 - -import 'package:openapi/api.dart'; -import 'package:test/test.dart'; - -// tests for UpdateAssetsToSharedLinkDto -void main() { - // final instance = UpdateAssetsToSharedLinkDto(); - - group('test UpdateAssetsToSharedLinkDto', () { - // List assetIds (default value: const []) - test('to test the property `assetIds`', () async { - // TODO - }); - - - }); - -} diff --git a/server/apps/immich/src/api-v1/asset/asset.controller.ts b/server/apps/immich/src/api-v1/asset/asset.controller.ts index aaafd74f4e..4c4cdd0e93 100644 --- a/server/apps/immich/src/api-v1/asset/asset.controller.ts +++ b/server/apps/immich/src/api-v1/asset/asset.controller.ts @@ -1,3 +1,4 @@ +import { AddAssetsDto } from './../album/dto/add-assets.dto'; import { Controller, Post, @@ -52,10 +53,10 @@ import { import { DownloadFilesDto } from './dto/download-files.dto'; import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; import { SharedLinkResponseDto } from '@app/domain'; -import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; import { AssetSearchDto } from './dto/asset-search.dto'; import { assetUploadOption, ImmichFile } from '../../config/asset-upload.config'; import FileNotEmptyValidator from '../validation/file-not-empty-validator'; +import { RemoveAssetsDto } from '../album/dto/remove-assets.dto'; function asStreamableFile({ stream, type, length }: ImmichReadStream) { return new StreamableFile(stream, { type, length }); @@ -330,11 +331,20 @@ export class AssetController { } @Authenticated({ isShared: true }) - @Patch('/shared-link') - async updateAssetsInSharedLink( + @Patch('/shared-link/add') + async addAssetsToSharedLink( @GetAuthUser() authUser: AuthUserDto, - @Body(ValidationPipe) dto: UpdateAssetsToSharedLinkDto, + @Body(ValidationPipe) dto: AddAssetsDto, ): Promise { - return await this.assetService.updateAssetsInSharedLink(authUser, dto); + return await this.assetService.addAssetsToSharedLink(authUser, dto); + } + + @Authenticated({ isShared: true }) + @Patch('/shared-link/remove') + async removeAssetsFromSharedLink( + @GetAuthUser() authUser: AuthUserDto, + @Body(ValidationPipe) dto: RemoveAssetsDto, + ): Promise { + return await this.assetService.removeAssetsFromSharedLink(authUser, dto); } } diff --git a/server/apps/immich/src/api-v1/asset/asset.service.spec.ts b/server/apps/immich/src/api-v1/asset/asset.service.spec.ts index 08c4ed1aca..6d9f1750a8 100644 --- a/server/apps/immich/src/api-v1/asset/asset.service.spec.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.spec.ts @@ -198,14 +198,31 @@ describe('AssetService', () => { sharedLinkRepositoryMock.get.mockResolvedValue(null); sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); - await expect(sut.updateAssetsInSharedLink(authDto, dto)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.addAssetsToSharedLink(authDto, dto)).rejects.toBeInstanceOf(BadRequestException); expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); - expect(sharedLinkRepositoryMock.hasAssetAccess).toHaveBeenCalledWith(authDto.sharedLinkId, asset1.id); expect(sharedLinkRepositoryMock.save).not.toHaveBeenCalled(); }); + it('should add assets to a shared link', async () => { + const asset1 = _getAsset_1(); + + const authDto = authStub.adminSharedLink; + const dto = { assetIds: [asset1.id] }; + + assetRepositoryMock.getById.mockResolvedValue(asset1); + sharedLinkRepositoryMock.get.mockResolvedValue(sharedLinkStub.valid); + sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); + sharedLinkRepositoryMock.save.mockResolvedValue(sharedLinkStub.valid); + + await expect(sut.addAssetsToSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); + + expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); + expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); + expect(sharedLinkRepositoryMock.save).toHaveBeenCalled(); + }); + it('should remove assets from a shared link', async () => { const asset1 = _getAsset_1(); @@ -217,11 +234,11 @@ describe('AssetService', () => { sharedLinkRepositoryMock.hasAssetAccess.mockResolvedValue(true); sharedLinkRepositoryMock.save.mockResolvedValue(sharedLinkStub.valid); - await expect(sut.updateAssetsInSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); + await expect(sut.removeAssetsFromSharedLink(authDto, dto)).resolves.toEqual(sharedLinkResponseStub.valid); expect(assetRepositoryMock.getById).toHaveBeenCalledWith(asset1.id); expect(sharedLinkRepositoryMock.get).toHaveBeenCalledWith(authDto.id, authDto.sharedLinkId); - expect(sharedLinkRepositoryMock.hasAssetAccess).toHaveBeenCalledWith(authDto.sharedLinkId, asset1.id); + expect(sharedLinkRepositoryMock.save).toHaveBeenCalled(); }); }); diff --git a/server/apps/immich/src/api-v1/asset/asset.service.ts b/server/apps/immich/src/api-v1/asset/asset.service.ts index 35c14e7036..959571f382 100644 --- a/server/apps/immich/src/api-v1/asset/asset.service.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.ts @@ -58,8 +58,9 @@ import { ISharedLinkRepository } from '@app/domain'; import { DownloadFilesDto } from './dto/download-files.dto'; import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; import { mapSharedLink, SharedLinkResponseDto } from '@app/domain'; -import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; import { AssetSearchDto } from './dto/asset-search.dto'; +import { AddAssetsDto } from '../album/dto/add-assets.dto'; +import { RemoveAssetsDto } from '../album/dto/remove-assets.dto'; const fileInfo = promisify(stat); @@ -606,23 +607,35 @@ export class AssetService { return mapSharedLink(sharedLink); } - async updateAssetsInSharedLink( - authUser: AuthUserDto, - dto: UpdateAssetsToSharedLinkDto, - ): Promise { + async addAssetsToSharedLink(authUser: AuthUserDto, dto: AddAssetsDto): Promise { if (!authUser.sharedLinkId) { throw new ForbiddenException(); } const assets = []; - await this.checkAssetsAccess(authUser, dto.assetIds); for (const assetId of dto.assetIds) { const asset = await this._assetRepository.getById(assetId); assets.push(asset); } - const updatedLink = await this.shareCore.updateAssets(authUser.id, authUser.sharedLinkId, assets); + const updatedLink = await this.shareCore.addAssets(authUser.id, authUser.sharedLinkId, assets); + return mapSharedLink(updatedLink); + } + + async removeAssetsFromSharedLink(authUser: AuthUserDto, dto: RemoveAssetsDto): Promise { + if (!authUser.sharedLinkId) { + throw new ForbiddenException(); + } + + const assets = []; + + for (const assetId of dto.assetIds) { + const asset = await this._assetRepository.getById(assetId); + assets.push(asset); + } + + const updatedLink = await this.shareCore.removeAssets(authUser.id, authUser.sharedLinkId, assets); return mapSharedLink(updatedLink); } diff --git a/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts b/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts deleted file mode 100644 index 2eb451d3d3..0000000000 --- a/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IsNotEmpty } from 'class-validator'; - -export class UpdateAssetsToSharedLinkDto { - @IsNotEmpty() - assetIds!: string[]; -} diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 1e28e5c0ae..80d56f07ae 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1869,9 +1869,11 @@ "bearer": [] } ] - }, + } + }, + "/asset/shared-link/add": { "patch": { - "operationId": "updateAssetsInSharedLink", + "operationId": "addAssetsToSharedLink", "description": "", "parameters": [], "requestBody": { @@ -1879,7 +1881,44 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UpdateAssetsToSharedLinkDto" + "$ref": "#/components/schemas/AddAssetsDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SharedLinkResponseDto" + } + } + } + } + }, + "tags": [ + "Asset" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, + "/asset/shared-link/remove": { + "patch": { + "operationId": "removeAssetsFromSharedLink", + "description": "", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RemoveAssetsDto" } } } @@ -4171,7 +4210,21 @@ "assetIds" ] }, - "UpdateAssetsToSharedLinkDto": { + "AddAssetsDto": { + "type": "object", + "properties": { + "assetIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "assetIds" + ] + }, + "RemoveAssetsDto": { "type": "object", "properties": { "assetIds": { @@ -4267,20 +4320,6 @@ "sharedUserIds" ] }, - "AddAssetsDto": { - "type": "object", - "properties": { - "assetIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "assetIds" - ] - }, "AddAssetsResponseDto": { "type": "object", "properties": { @@ -4302,20 +4341,6 @@ "alreadyInAlbum" ] }, - "RemoveAssetsDto": { - "type": "object", - "properties": { - "assetIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "assetIds" - ] - }, "UpdateAlbumDto": { "type": "object", "properties": { diff --git a/server/libs/domain/src/share/share.core.ts b/server/libs/domain/src/share/share.core.ts index d244c8da9a..0fa62cbb6e 100644 --- a/server/libs/domain/src/share/share.core.ts +++ b/server/libs/domain/src/share/share.core.ts @@ -63,13 +63,24 @@ export class ShareCore { return this.repository.remove(link); } - async updateAssets(userId: string, id: string, assets: AssetEntity[]) { + async addAssets(userId: string, id: string, assets: AssetEntity[]) { const link = await this.get(userId, id); if (!link) { throw new BadRequestException('Shared link not found'); } - return this.repository.save({ ...link, assets }); + return this.repository.save({ ...link, assets: [...link.assets, ...assets] }); + } + + async removeAssets(userId: string, id: string, assets: AssetEntity[]) { + const link = await this.get(userId, id); + if (!link) { + throw new BadRequestException('Shared link not found'); + } + + const newAssets = link.assets.filter((asset) => assets.find((a) => a.id === asset.id)); + + return this.repository.save({ ...link, assets: newAssets }); } async hasAssetAccess(id: string, assetId: string): Promise { diff --git a/server/package.json b/server/package.json index 23bfe29b9d..fee823cc94 100644 --- a/server/package.json +++ b/server/package.json @@ -140,9 +140,9 @@ }, "./libs/domain/": { "branches": 80, - "functions": 89, + "functions": 88, "lines": 95, - "statements": 95 + "statements": 94 } }, "testEnvironment": "node", diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 5ceade1fc5..a7cfed1873 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -2083,19 +2083,6 @@ export interface UpdateAssetDto { */ 'isFavorite'?: boolean; } -/** - * - * @export - * @interface UpdateAssetsToSharedLinkDto - */ -export interface UpdateAssetsToSharedLinkDto { - /** - * - * @type {Array} - * @memberof UpdateAssetsToSharedLinkDto - */ - 'assetIds': Array; -} /** * * @export @@ -3588,6 +3575,45 @@ export class AlbumApi extends BaseAPI { */ export const AssetApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addAssetsToSharedLink: async (addAssetsDto: AddAssetsDto, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'addAssetsDto' is not null or undefined + assertParamExists('addAssetsToSharedLink', 'addAssetsDto', addAssetsDto) + const localVarPath = `/asset/shared-link/add`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(addAssetsDto, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4232,6 +4258,45 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeAssetsFromSharedLink: async (removeAssetsDto: RemoveAssetsDto, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'removeAssetsDto' is not null or undefined + assertParamExists('removeAssetsFromSharedLink', 'removeAssetsDto', removeAssetsDto) + const localVarPath = `/asset/shared-link/remove`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(removeAssetsDto, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4361,45 +4426,6 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - updateAssetsInSharedLink: async (updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'updateAssetsToSharedLinkDto' is not null or undefined - assertParamExists('updateAssetsInSharedLink', 'updateAssetsToSharedLinkDto', updateAssetsToSharedLinkDto) - const localVarPath = `/asset/shared-link`; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(updateAssetsToSharedLinkDto, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, /** * * @param {AssetTypeEnum} assetType @@ -4518,6 +4544,16 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = AssetApiAxiosParamCreator(configuration) return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.addAssetsToSharedLink(addAssetsDto, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4687,6 +4723,16 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.getUserAssetsByDeviceId(deviceId, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.removeAssetsFromSharedLink(removeAssetsDto, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4720,16 +4766,6 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.updateAsset(assetId, updateAssetDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options); - return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); - }, /** * * @param {AssetTypeEnum} assetType @@ -4760,6 +4796,15 @@ export const AssetApiFp = function(configuration?: Configuration) { export const AssetApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = AssetApiFp(configuration) return { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: any): AxiosPromise { + return localVarFp.addAssetsToSharedLink(addAssetsDto, options).then((request) => request(axios, basePath)); + }, /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -4912,6 +4957,15 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath getUserAssetsByDeviceId(deviceId: string, options?: any): AxiosPromise> { return localVarFp.getUserAssetsByDeviceId(deviceId, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: any): AxiosPromise { + return localVarFp.removeAssetsFromSharedLink(removeAssetsDto, options).then((request) => request(axios, basePath)); + }, /** * * @param {SearchAssetDto} searchAssetDto @@ -4942,15 +4996,6 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath updateAsset(assetId: string, updateAssetDto: UpdateAssetDto, options?: any): AxiosPromise { return localVarFp.updateAsset(assetId, updateAssetDto, options).then((request) => request(axios, basePath)); }, - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: any): AxiosPromise { - return localVarFp.updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options).then((request) => request(axios, basePath)); - }, /** * * @param {AssetTypeEnum} assetType @@ -4980,6 +5025,17 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath * @extends {BaseAPI} */ export class AssetApi extends BaseAPI { + /** + * + * @param {AddAssetsDto} addAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AssetApi + */ + public addAssetsToSharedLink(addAssetsDto: AddAssetsDto, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).addAssetsToSharedLink(addAssetsDto, options).then((request) => request(this.axios, this.basePath)); + } + /** * Check duplicated asset before uploading - for Web upload used * @param {CheckDuplicateAssetDto} checkDuplicateAssetDto @@ -5166,6 +5222,17 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).getUserAssetsByDeviceId(deviceId, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {RemoveAssetsDto} removeAssetsDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AssetApi + */ + public removeAssetsFromSharedLink(removeAssetsDto: RemoveAssetsDto, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).removeAssetsFromSharedLink(removeAssetsDto, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {SearchAssetDto} searchAssetDto @@ -5202,17 +5269,6 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).updateAsset(assetId, updateAssetDto, options).then((request) => request(this.axios, this.basePath)); } - /** - * - * @param {UpdateAssetsToSharedLinkDto} updateAssetsToSharedLinkDto - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof AssetApi - */ - public updateAssetsInSharedLink(updateAssetsToSharedLinkDto: UpdateAssetsToSharedLinkDto, options?: AxiosRequestConfig) { - return AssetApiFp(this.configuration).updateAssetsInSharedLink(updateAssetsToSharedLinkDto, options).then((request) => request(this.axios, this.basePath)); - } - /** * * @param {AssetTypeEnum} assetType diff --git a/web/src/api/open-api/base.ts b/web/src/api/open-api/base.ts index 1ffb5e4ffc..aa00dd944e 100644 --- a/web/src/api/open-api/base.ts +++ b/web/src/api/open-api/base.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/common.ts b/web/src/api/open-api/common.ts index 4d7d11c836..8f295ff064 100644 --- a/web/src/api/open-api/common.ts +++ b/web/src/api/open-api/common.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/configuration.ts b/web/src/api/open-api/configuration.ts index e0596e4b17..af2967072f 100644 --- a/web/src/api/open-api/configuration.ts +++ b/web/src/api/open-api/configuration.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/api/open-api/index.ts b/web/src/api/open-api/index.ts index 49f0b7a38f..b7490d5298 100644 --- a/web/src/api/open-api/index.ts +++ b/web/src/api/open-api/index.ts @@ -4,7 +4,7 @@ * Immich * Immich API * - * The version of the OpenAPI document: 1.46.1 + * The version of the OpenAPI document: 1.47.2 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/lib/components/album-page/asset-selection.svelte b/web/src/lib/components/album-page/asset-selection.svelte index 401d581c2a..9682a8ec92 100644 --- a/web/src/lib/components/album-page/asset-selection.svelte +++ b/web/src/lib/components/album-page/asset-selection.svelte @@ -16,6 +16,7 @@ export let albumId: string; export let assetsInAlbum: AssetResponseDto[]; + const locale = navigator.language; onMount(() => { $assetsInAlbumStoreState = assetsInAlbum; @@ -28,8 +29,11 @@ assetInteractionStore.clearMultiselect(); }; - - const locale = navigator.language; + const handleSelectFromComputerClicked = async () => { + await openFileUploadDialog(albumId, ''); + assetInteractionStore.clearMultiselect(); + dispatch('go-back'); + };