diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index d68e7e9b31..62b938b3a9 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -31,6 +31,7 @@ doc/CheckExistingAssetsDto.md doc/CheckExistingAssetsResponseDto.md doc/CreateAlbumDto.md doc/CreateAlbumShareLinkDto.md +doc/CreateAssetsShareLinkDto.md doc/CreateProfileImageResponseDto.md doc/CreateTagDto.md doc/CreateUserDto.md @@ -86,6 +87,7 @@ doc/ThumbnailFormat.md doc/TimeGroupEnum.md doc/UpdateAlbumDto.md doc/UpdateAssetDto.md +doc/UpdateAssetsToSharedLinkDto.md doc/UpdateTagDto.md doc/UpdateUserDto.md doc/UpsertDeviceInfoDto.md @@ -140,6 +142,7 @@ lib/model/check_existing_assets_dto.dart lib/model/check_existing_assets_response_dto.dart lib/model/create_album_dto.dart lib/model/create_album_share_link_dto.dart +lib/model/create_assets_share_link_dto.dart lib/model/create_profile_image_response_dto.dart lib/model/create_tag_dto.dart lib/model/create_user_dto.dart @@ -188,6 +191,7 @@ 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 @@ -224,6 +228,7 @@ test/check_existing_assets_dto_test.dart test/check_existing_assets_response_dto_test.dart test/create_album_dto_test.dart test/create_album_share_link_dto_test.dart +test/create_assets_share_link_dto_test.dart test/create_profile_image_response_dto_test.dart test/create_tag_dto_test.dart test/create_user_dto_test.dart @@ -279,6 +284,7 @@ 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 5ff0099b03..46a36d839b 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.40.0 +- API version: 1.41.1 - Build package: org.openapitools.codegen.languages.DartClientCodegen ## Requirements @@ -77,6 +77,7 @@ Class | Method | HTTP request | Description *AlbumApi* | [**updateAlbumInfo**](doc//AlbumApi.md#updatealbuminfo) | **PATCH** /album/{albumId} | *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 | *AssetApi* | [**deleteAsset**](doc//AssetApi.md#deleteasset) | **DELETE** /asset | *AssetApi* | [**downloadFile**](doc//AssetApi.md#downloadfile) | **GET** /asset/download/{assetId} | *AssetApi* | [**downloadFiles**](doc//AssetApi.md#downloadfiles) | **POST** /asset/download-files | @@ -94,6 +95,7 @@ Class | Method | HTTP request | Description *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 | @@ -167,6 +169,7 @@ Class | Method | HTTP request | Description - [CheckExistingAssetsResponseDto](doc//CheckExistingAssetsResponseDto.md) - [CreateAlbumDto](doc//CreateAlbumDto.md) - [CreateAlbumShareLinkDto](doc//CreateAlbumShareLinkDto.md) + - [CreateAssetsShareLinkDto](doc//CreateAssetsShareLinkDto.md) - [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md) - [CreateTagDto](doc//CreateTagDto.md) - [CreateUserDto](doc//CreateUserDto.md) @@ -215,6 +218,7 @@ 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/APIKeyApi.md b/mobile/openapi/doc/APIKeyApi.md index c715cedd8f..4918e61616 100644 --- a/mobile/openapi/doc/APIKeyApi.md +++ b/mobile/openapi/doc/APIKeyApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -62,6 +64,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -102,6 +106,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -143,6 +149,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -180,6 +188,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/AlbumApi.md b/mobile/openapi/doc/AlbumApi.md index 7f57c201a9..02405ec988 100644 --- a/mobile/openapi/doc/AlbumApi.md +++ b/mobile/openapi/doc/AlbumApi.md @@ -28,6 +28,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -77,6 +79,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -126,6 +130,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -173,6 +179,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -220,6 +228,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -266,6 +276,8 @@ void (empty response body) + + ### Example ```dart import 'package:openapi/api.dart'; @@ -315,6 +327,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -358,6 +372,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -405,6 +421,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -454,6 +472,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -503,6 +523,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -551,6 +573,8 @@ void (empty response body) + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/AssetApi.md b/mobile/openapi/doc/AssetApi.md index f8fafd51d2..5470053533 100644 --- a/mobile/openapi/doc/AssetApi.md +++ b/mobile/openapi/doc/AssetApi.md @@ -11,6 +11,7 @@ Method | HTTP request | Description ------------- | ------------- | ------------- [**checkDuplicateAsset**](AssetApi.md#checkduplicateasset) | **POST** /asset/check | [**checkExistingAssets**](AssetApi.md#checkexistingassets) | **POST** /asset/exist | +[**createAssetsSharedLink**](AssetApi.md#createassetssharedlink) | **POST** /asset/shared-link | [**deleteAsset**](AssetApi.md#deleteasset) | **DELETE** /asset | [**downloadFile**](AssetApi.md#downloadfile) | **GET** /asset/download/{assetId} | [**downloadFiles**](AssetApi.md#downloadfiles) | **POST** /asset/download-files | @@ -28,6 +29,7 @@ Method | HTTP request | Description [**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 | @@ -129,11 +131,62 @@ 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) +# **createAssetsSharedLink** +> SharedLinkResponseDto createAssetsSharedLink(createAssetsShareLinkDto) + + + + + +### 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 createAssetsShareLinkDto = CreateAssetsShareLinkDto(); // CreateAssetsShareLinkDto | + +try { + final result = api_instance.createAssetsSharedLink(createAssetsShareLinkDto); + print(result); +} catch (e) { + print('Exception when calling AssetApi->createAssetsSharedLink: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **createAssetsShareLinkDto** | [**CreateAssetsShareLinkDto**](CreateAssetsShareLinkDto.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) + # **deleteAsset** > List deleteAsset(deleteAssetDto) + + ### Example ```dart import 'package:openapi/api.dart'; @@ -181,6 +234,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -232,6 +287,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -279,6 +336,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -424,6 +483,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -471,6 +532,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -518,6 +581,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -561,6 +626,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -604,6 +671,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -653,6 +722,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -696,6 +767,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -788,6 +861,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -835,6 +910,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -932,11 +1009,62 @@ 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(assetData) + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/AuthenticationApi.md b/mobile/openapi/doc/AuthenticationApi.md index ffcece086b..8c9b0e2d48 100644 --- a/mobile/openapi/doc/AuthenticationApi.md +++ b/mobile/openapi/doc/AuthenticationApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -62,6 +64,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -109,6 +113,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -150,6 +156,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -187,6 +195,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/CreateAssetsShareLinkDto.md b/mobile/openapi/doc/CreateAssetsShareLinkDto.md new file mode 100644 index 0000000000..2ceffddee2 --- /dev/null +++ b/mobile/openapi/doc/CreateAssetsShareLinkDto.md @@ -0,0 +1,18 @@ +# openapi.model.CreateAssetsShareLinkDto + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**assetIds** | **List** | | [default to const []] +**expiredAt** | **String** | | [optional] +**allowUpload** | **bool** | | [optional] +**description** | **String** | | [optional] + +[[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/doc/DeviceInfoApi.md b/mobile/openapi/doc/DeviceInfoApi.md index b4dcdb255b..1ee91414a3 100644 --- a/mobile/openapi/doc/DeviceInfoApi.md +++ b/mobile/openapi/doc/DeviceInfoApi.md @@ -117,6 +117,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/JobApi.md b/mobile/openapi/doc/JobApi.md index 124e3d2149..b2f2b4f7ae 100644 --- a/mobile/openapi/doc/JobApi.md +++ b/mobile/openapi/doc/JobApi.md @@ -19,6 +19,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -62,6 +64,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -109,6 +113,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/OAuthApi.md b/mobile/openapi/doc/OAuthApi.md index 836cd84556..d1bcec6685 100644 --- a/mobile/openapi/doc/OAuthApi.md +++ b/mobile/openapi/doc/OAuthApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -62,6 +64,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -103,6 +107,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -144,6 +150,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -180,6 +188,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/ServerInfoApi.md b/mobile/openapi/doc/ServerInfoApi.md index 0e1ff66492..4089a3bafa 100644 --- a/mobile/openapi/doc/ServerInfoApi.md +++ b/mobile/openapi/doc/ServerInfoApi.md @@ -20,6 +20,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -57,6 +59,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -94,6 +98,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -131,6 +137,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/ShareApi.md b/mobile/openapi/doc/ShareApi.md index 419f115fb2..045793b75b 100644 --- a/mobile/openapi/doc/ShareApi.md +++ b/mobile/openapi/doc/ShareApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -64,6 +66,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -101,6 +105,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -138,6 +144,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -179,6 +187,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/SystemConfigApi.md b/mobile/openapi/doc/SystemConfigApi.md index ae8d234ccf..74cf32606c 100644 --- a/mobile/openapi/doc/SystemConfigApi.md +++ b/mobile/openapi/doc/SystemConfigApi.md @@ -20,6 +20,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -63,6 +65,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -106,6 +110,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -149,6 +155,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/TagApi.md b/mobile/openapi/doc/TagApi.md index 2603525e16..7e3996c10a 100644 --- a/mobile/openapi/doc/TagApi.md +++ b/mobile/openapi/doc/TagApi.md @@ -21,6 +21,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -62,6 +64,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -102,6 +106,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -139,6 +145,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -180,6 +188,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md b/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md new file mode 100644 index 0000000000..3f7d70c7e7 --- /dev/null +++ b/mobile/openapi/doc/UpdateAssetsToSharedLinkDto.md @@ -0,0 +1,15 @@ +# 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/doc/UserApi.md b/mobile/openapi/doc/UserApi.md index 752fb7945e..01b6bd1ad3 100644 --- a/mobile/openapi/doc/UserApi.md +++ b/mobile/openapi/doc/UserApi.md @@ -26,6 +26,8 @@ Method | HTTP request | Description + + ### Example ```dart import 'package:openapi/api.dart'; @@ -73,6 +75,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -120,6 +124,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -167,6 +173,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -214,6 +222,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; @@ -257,6 +267,8 @@ This endpoint does not need any parameter. + + ### Example ```dart import 'package:openapi/api.dart'; @@ -298,6 +310,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -339,6 +353,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -380,6 +396,8 @@ No authorization required + + ### Example ```dart import 'package:openapi/api.dart'; @@ -427,6 +445,8 @@ Name | Type | Description | Notes + + ### Example ```dart import 'package:openapi/api.dart'; diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 595ca69b51..70ff81ddf7 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -64,6 +64,7 @@ part 'model/check_existing_assets_dto.dart'; part 'model/check_existing_assets_response_dto.dart'; part 'model/create_album_dto.dart'; part 'model/create_album_share_link_dto.dart'; +part 'model/create_assets_share_link_dto.dart'; part 'model/create_profile_image_response_dto.dart'; part 'model/create_tag_dto.dart'; part 'model/create_user_dto.dart'; @@ -112,6 +113,7 @@ 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/album_api.dart b/mobile/openapi/lib/api/album_api.dart index 614aad807a..f3e2b96d94 100644 --- a/mobile/openapi/lib/api/album_api.dart +++ b/mobile/openapi/lib/api/album_api.dart @@ -16,7 +16,10 @@ class AlbumApi { final ApiClient apiClient; - /// Performs an HTTP 'PUT /album/{albumId}/assets' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -48,6 +51,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -68,7 +73,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'PUT /album/{albumId}/users' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -100,6 +108,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -120,7 +130,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'POST /album' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [CreateAlbumDto] createAlbumDto (required): @@ -149,6 +162,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [CreateAlbumDto] createAlbumDto (required): @@ -167,7 +182,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'POST /album/create-shared-link' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [CreateAlbumShareLinkDto] createAlbumShareLinkDto (required): @@ -196,6 +214,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [CreateAlbumShareLinkDto] createAlbumShareLinkDto (required): @@ -214,7 +234,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'DELETE /album/{albumId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -244,6 +267,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -254,7 +279,10 @@ class AlbumApi { } } - /// Performs an HTTP 'GET /album/{albumId}/download' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -290,6 +318,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -310,7 +340,9 @@ class AlbumApi { return null; } - /// Performs an HTTP 'GET /album/count-by-user-id' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getAlbumCountByUserIdWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/album/count-by-user-id'; @@ -336,6 +368,7 @@ class AlbumApi { ); } + /// Future getAlbumCountByUserId() async { final response = await getAlbumCountByUserIdWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -351,7 +384,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'GET /album/{albumId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -381,6 +417,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -399,7 +437,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'GET /album' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [bool] shared: @@ -438,6 +479,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [bool] shared: @@ -462,7 +505,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'DELETE /album/{albumId}/assets' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -494,6 +540,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -514,7 +562,10 @@ class AlbumApi { return null; } - /// Performs an HTTP 'DELETE /album/{albumId}/user/{userId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -547,6 +598,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): @@ -559,7 +612,10 @@ class AlbumApi { } } - /// Performs an HTTP 'PATCH /album/{albumId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] albumId (required): @@ -591,6 +647,8 @@ class AlbumApi { ); } + /// + /// /// Parameters: /// /// * [String] albumId (required): diff --git a/mobile/openapi/lib/api/api_key_api.dart b/mobile/openapi/lib/api/api_key_api.dart index 26223bf891..7cc9a3589c 100644 --- a/mobile/openapi/lib/api/api_key_api.dart +++ b/mobile/openapi/lib/api/api_key_api.dart @@ -16,7 +16,10 @@ class APIKeyApi { final ApiClient apiClient; - /// Performs an HTTP 'POST /api-key' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [APIKeyCreateDto] aPIKeyCreateDto (required): @@ -45,6 +48,8 @@ class APIKeyApi { ); } + /// + /// /// Parameters: /// /// * [APIKeyCreateDto] aPIKeyCreateDto (required): @@ -63,7 +68,10 @@ class APIKeyApi { return null; } - /// Performs an HTTP 'DELETE /api-key/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [num] id (required): @@ -93,6 +101,8 @@ class APIKeyApi { ); } + /// + /// /// Parameters: /// /// * [num] id (required): @@ -103,7 +113,10 @@ class APIKeyApi { } } - /// Performs an HTTP 'GET /api-key/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [num] id (required): @@ -133,6 +146,8 @@ class APIKeyApi { ); } + /// + /// /// Parameters: /// /// * [num] id (required): @@ -151,7 +166,9 @@ class APIKeyApi { return null; } - /// Performs an HTTP 'GET /api-key' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getKeysWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/api-key'; @@ -177,6 +194,7 @@ class APIKeyApi { ); } + /// Future?> getKeys() async { final response = await getKeysWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -195,7 +213,10 @@ class APIKeyApi { return null; } - /// Performs an HTTP 'PUT /api-key/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [num] id (required): @@ -227,6 +248,8 @@ class APIKeyApi { ); } + /// + /// /// Parameters: /// /// * [num] id (required): diff --git a/mobile/openapi/lib/api/asset_api.dart b/mobile/openapi/lib/api/asset_api.dart index fb0e2b7190..5f4f278d2b 100644 --- a/mobile/openapi/lib/api/asset_api.dart +++ b/mobile/openapi/lib/api/asset_api.dart @@ -120,7 +120,62 @@ class AssetApi { return null; } - /// Performs an HTTP 'DELETE /asset' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// + /// Parameters: + /// + /// * [CreateAssetsShareLinkDto] createAssetsShareLinkDto (required): + Future createAssetsSharedLinkWithHttpInfo(CreateAssetsShareLinkDto createAssetsShareLinkDto,) async { + // ignore: prefer_const_declarations + final path = r'/asset/shared-link'; + + // ignore: prefer_final_locals + Object? postBody = createAssetsShareLinkDto; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = ['application/json']; + + + return apiClient.invokeAPI( + path, + 'POST', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// + /// + /// Parameters: + /// + /// * [CreateAssetsShareLinkDto] createAssetsShareLinkDto (required): + Future createAssetsSharedLink(CreateAssetsShareLinkDto createAssetsShareLinkDto,) async { + final response = await createAssetsSharedLinkWithHttpInfo(createAssetsShareLinkDto,); + 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]. + /// /// Parameters: /// /// * [DeleteAssetDto] deleteAssetDto (required): @@ -149,6 +204,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [DeleteAssetDto] deleteAssetDto (required): @@ -170,7 +227,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/download/{assetId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] assetId (required): @@ -211,6 +271,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [String] assetId (required): @@ -233,7 +295,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'POST /asset/download-files' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [DownloadFilesDto] downloadFilesDto (required): @@ -262,6 +327,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [DownloadFilesDto] downloadFilesDto (required): @@ -280,7 +347,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/download-library' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [num] skip: @@ -313,6 +383,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [num] skip: @@ -445,7 +517,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'POST /asset/time-bucket' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [GetAssetByTimeBucketDto] getAssetByTimeBucketDto (required): @@ -474,6 +549,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [GetAssetByTimeBucketDto] getAssetByTimeBucketDto (required): @@ -495,7 +572,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'POST /asset/count-by-time-bucket' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [GetAssetCountByTimeBucketDto] getAssetCountByTimeBucketDto (required): @@ -524,6 +604,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [GetAssetCountByTimeBucketDto] getAssetCountByTimeBucketDto (required): @@ -542,7 +624,9 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/count-by-user-id' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getAssetCountByUserIdWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/asset/count-by-user-id'; @@ -568,6 +652,7 @@ class AssetApi { ); } + /// Future getAssetCountByUserId() async { final response = await getAssetCountByUserIdWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -583,7 +668,9 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/search-terms' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getAssetSearchTermsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/asset/search-terms'; @@ -609,6 +696,7 @@ class AssetApi { ); } + /// Future?> getAssetSearchTerms() async { final response = await getAssetSearchTermsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -627,7 +715,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/thumbnail/{assetId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] assetId (required): @@ -663,6 +754,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [String] assetId (required): @@ -683,7 +776,9 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/curated-locations' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getCuratedLocationsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/asset/curated-locations'; @@ -709,6 +804,7 @@ class AssetApi { ); } + /// Future?> getCuratedLocations() async { final response = await getCuratedLocationsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -727,7 +823,9 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/curated-objects' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getCuratedObjectsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/asset/curated-objects'; @@ -753,6 +851,7 @@ class AssetApi { ); } + /// Future?> getCuratedObjects() async { final response = await getCuratedObjectsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -827,7 +926,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'POST /asset/search' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [SearchAssetDto] searchAssetDto (required): @@ -856,6 +958,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [SearchAssetDto] searchAssetDto (required): @@ -877,7 +981,10 @@ class AssetApi { return null; } - /// Performs an HTTP 'GET /asset/file/{assetId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] assetId (required): @@ -918,6 +1025,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [String] assetId (required): @@ -997,7 +1106,62 @@ class AssetApi { return null; } - /// Performs an HTTP 'POST /asset/upload' operation and returns the [Response]. + /// + /// + /// 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]. + /// /// Parameters: /// /// * [MultipartFile] assetData (required): @@ -1036,6 +1200,8 @@ class AssetApi { ); } + /// + /// /// Parameters: /// /// * [MultipartFile] assetData (required): diff --git a/mobile/openapi/lib/api/authentication_api.dart b/mobile/openapi/lib/api/authentication_api.dart index 39888550dc..628ee2f1f5 100644 --- a/mobile/openapi/lib/api/authentication_api.dart +++ b/mobile/openapi/lib/api/authentication_api.dart @@ -16,7 +16,10 @@ class AuthenticationApi { final ApiClient apiClient; - /// Performs an HTTP 'POST /auth/admin-sign-up' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [SignUpDto] signUpDto (required): @@ -45,6 +48,8 @@ class AuthenticationApi { ); } + /// + /// /// Parameters: /// /// * [SignUpDto] signUpDto (required): @@ -63,7 +68,10 @@ class AuthenticationApi { return null; } - /// Performs an HTTP 'POST /auth/change-password' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [ChangePasswordDto] changePasswordDto (required): @@ -92,6 +100,8 @@ class AuthenticationApi { ); } + /// + /// /// Parameters: /// /// * [ChangePasswordDto] changePasswordDto (required): @@ -110,7 +120,10 @@ class AuthenticationApi { return null; } - /// Performs an HTTP 'POST /auth/login' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [LoginCredentialDto] loginCredentialDto (required): @@ -139,6 +152,8 @@ class AuthenticationApi { ); } + /// + /// /// Parameters: /// /// * [LoginCredentialDto] loginCredentialDto (required): @@ -157,7 +172,9 @@ class AuthenticationApi { return null; } - /// Performs an HTTP 'POST /auth/logout' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future logoutWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/auth/logout'; @@ -183,6 +200,7 @@ class AuthenticationApi { ); } + /// Future logout() async { final response = await logoutWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -198,7 +216,9 @@ class AuthenticationApi { return null; } - /// Performs an HTTP 'POST /auth/validateToken' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future validateAccessTokenWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/auth/validateToken'; @@ -224,6 +244,7 @@ class AuthenticationApi { ); } + /// Future validateAccessToken() async { final response = await validateAccessTokenWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { diff --git a/mobile/openapi/lib/api/device_info_api.dart b/mobile/openapi/lib/api/device_info_api.dart index 2aa2ff7c5e..4cde7c5e4a 100644 --- a/mobile/openapi/lib/api/device_info_api.dart +++ b/mobile/openapi/lib/api/device_info_api.dart @@ -120,7 +120,10 @@ class DeviceInfoApi { return null; } - /// Performs an HTTP 'PUT /device-info' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required): @@ -149,6 +152,8 @@ class DeviceInfoApi { ); } + /// + /// /// Parameters: /// /// * [UpsertDeviceInfoDto] upsertDeviceInfoDto (required): diff --git a/mobile/openapi/lib/api/job_api.dart b/mobile/openapi/lib/api/job_api.dart index b64a67c35a..2fafd44d31 100644 --- a/mobile/openapi/lib/api/job_api.dart +++ b/mobile/openapi/lib/api/job_api.dart @@ -16,7 +16,9 @@ class JobApi { final ApiClient apiClient; - /// Performs an HTTP 'GET /jobs' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getAllJobsStatusWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/jobs'; @@ -42,6 +44,7 @@ class JobApi { ); } + /// Future getAllJobsStatus() async { final response = await getAllJobsStatusWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -57,7 +60,10 @@ class JobApi { return null; } - /// Performs an HTTP 'GET /jobs/{jobId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [JobId] jobId (required): @@ -87,6 +93,8 @@ class JobApi { ); } + /// + /// /// Parameters: /// /// * [JobId] jobId (required): @@ -105,7 +113,10 @@ class JobApi { return null; } - /// Performs an HTTP 'PUT /jobs/{jobId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [JobId] jobId (required): @@ -137,6 +148,8 @@ class JobApi { ); } + /// + /// /// Parameters: /// /// * [JobId] jobId (required): diff --git a/mobile/openapi/lib/api/o_auth_api.dart b/mobile/openapi/lib/api/o_auth_api.dart index b8778596a7..61165c9a2d 100644 --- a/mobile/openapi/lib/api/o_auth_api.dart +++ b/mobile/openapi/lib/api/o_auth_api.dart @@ -16,7 +16,10 @@ class OAuthApi { final ApiClient apiClient; - /// Performs an HTTP 'POST /oauth/callback' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [OAuthCallbackDto] oAuthCallbackDto (required): @@ -45,6 +48,8 @@ class OAuthApi { ); } + /// + /// /// Parameters: /// /// * [OAuthCallbackDto] oAuthCallbackDto (required): @@ -63,7 +68,10 @@ class OAuthApi { return null; } - /// Performs an HTTP 'POST /oauth/config' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [OAuthConfigDto] oAuthConfigDto (required): @@ -92,6 +100,8 @@ class OAuthApi { ); } + /// + /// /// Parameters: /// /// * [OAuthConfigDto] oAuthConfigDto (required): @@ -110,7 +120,10 @@ class OAuthApi { return null; } - /// Performs an HTTP 'POST /oauth/link' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [OAuthCallbackDto] oAuthCallbackDto (required): @@ -139,6 +152,8 @@ class OAuthApi { ); } + /// + /// /// Parameters: /// /// * [OAuthCallbackDto] oAuthCallbackDto (required): @@ -157,7 +172,9 @@ class OAuthApi { return null; } - /// Performs an HTTP 'GET /oauth/mobile-redirect' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future mobileRedirectWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/oauth/mobile-redirect'; @@ -183,6 +200,7 @@ class OAuthApi { ); } + /// Future mobileRedirect() async { final response = await mobileRedirectWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -190,7 +208,9 @@ class OAuthApi { } } - /// Performs an HTTP 'POST /oauth/unlink' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future unlinkWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/oauth/unlink'; @@ -216,6 +236,7 @@ class OAuthApi { ); } + /// Future unlink() async { final response = await unlinkWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { diff --git a/mobile/openapi/lib/api/server_info_api.dart b/mobile/openapi/lib/api/server_info_api.dart index 8cc3460c9b..a939f885ea 100644 --- a/mobile/openapi/lib/api/server_info_api.dart +++ b/mobile/openapi/lib/api/server_info_api.dart @@ -16,7 +16,9 @@ class ServerInfoApi { final ApiClient apiClient; - /// Performs an HTTP 'GET /server-info' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getServerInfoWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/server-info'; @@ -42,6 +44,7 @@ class ServerInfoApi { ); } + /// Future getServerInfo() async { final response = await getServerInfoWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -57,7 +60,9 @@ class ServerInfoApi { return null; } - /// Performs an HTTP 'GET /server-info/version' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getServerVersionWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/server-info/version'; @@ -83,6 +88,7 @@ class ServerInfoApi { ); } + /// Future getServerVersion() async { final response = await getServerVersionWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -98,7 +104,9 @@ class ServerInfoApi { return null; } - /// Performs an HTTP 'GET /server-info/stats' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getStatsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/server-info/stats'; @@ -124,6 +132,7 @@ class ServerInfoApi { ); } + /// Future getStats() async { final response = await getStatsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -139,7 +148,9 @@ class ServerInfoApi { return null; } - /// Performs an HTTP 'GET /server-info/ping' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future pingServerWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/server-info/ping'; @@ -165,6 +176,7 @@ class ServerInfoApi { ); } + /// Future pingServer() async { final response = await pingServerWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { diff --git a/mobile/openapi/lib/api/share_api.dart b/mobile/openapi/lib/api/share_api.dart index 6695e6aa0a..d574023ffb 100644 --- a/mobile/openapi/lib/api/share_api.dart +++ b/mobile/openapi/lib/api/share_api.dart @@ -16,7 +16,10 @@ class ShareApi { final ApiClient apiClient; - /// Performs an HTTP 'PATCH /share/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -48,6 +51,8 @@ class ShareApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): @@ -68,7 +73,9 @@ class ShareApi { return null; } - /// Performs an HTTP 'GET /share' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getAllSharedLinksWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/share'; @@ -94,6 +101,7 @@ class ShareApi { ); } + /// Future?> getAllSharedLinks() async { final response = await getAllSharedLinksWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -112,7 +120,9 @@ class ShareApi { return null; } - /// Performs an HTTP 'GET /share/me' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getMySharedLinkWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/share/me'; @@ -138,6 +148,7 @@ class ShareApi { ); } + /// Future getMySharedLink() async { final response = await getMySharedLinkWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -153,7 +164,10 @@ class ShareApi { return null; } - /// Performs an HTTP 'GET /share/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -183,6 +197,8 @@ class ShareApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): @@ -201,7 +217,10 @@ class ShareApi { return null; } - /// Performs an HTTP 'DELETE /share/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -231,6 +250,8 @@ class ShareApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): diff --git a/mobile/openapi/lib/api/system_config_api.dart b/mobile/openapi/lib/api/system_config_api.dart index d2d0ac5ba5..328a1fc3b7 100644 --- a/mobile/openapi/lib/api/system_config_api.dart +++ b/mobile/openapi/lib/api/system_config_api.dart @@ -16,7 +16,9 @@ class SystemConfigApi { final ApiClient apiClient; - /// Performs an HTTP 'GET /system-config' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getConfigWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/system-config'; @@ -42,6 +44,7 @@ class SystemConfigApi { ); } + /// Future getConfig() async { final response = await getConfigWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -57,7 +60,9 @@ class SystemConfigApi { return null; } - /// Performs an HTTP 'GET /system-config/defaults' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getDefaultsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/system-config/defaults'; @@ -83,6 +88,7 @@ class SystemConfigApi { ); } + /// Future getDefaults() async { final response = await getDefaultsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -98,7 +104,9 @@ class SystemConfigApi { return null; } - /// Performs an HTTP 'GET /system-config/storage-template-options' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getStorageTemplateOptionsWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/system-config/storage-template-options'; @@ -124,6 +132,7 @@ class SystemConfigApi { ); } + /// Future getStorageTemplateOptions() async { final response = await getStorageTemplateOptionsWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -139,7 +148,10 @@ class SystemConfigApi { return null; } - /// Performs an HTTP 'PUT /system-config' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [SystemConfigDto] systemConfigDto (required): @@ -168,6 +180,8 @@ class SystemConfigApi { ); } + /// + /// /// Parameters: /// /// * [SystemConfigDto] systemConfigDto (required): diff --git a/mobile/openapi/lib/api/tag_api.dart b/mobile/openapi/lib/api/tag_api.dart index 3591cf11cb..1869e0adec 100644 --- a/mobile/openapi/lib/api/tag_api.dart +++ b/mobile/openapi/lib/api/tag_api.dart @@ -16,7 +16,10 @@ class TagApi { final ApiClient apiClient; - /// Performs an HTTP 'POST /tag' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [CreateTagDto] createTagDto (required): @@ -45,6 +48,8 @@ class TagApi { ); } + /// + /// /// Parameters: /// /// * [CreateTagDto] createTagDto (required): @@ -63,7 +68,10 @@ class TagApi { return null; } - /// Performs an HTTP 'DELETE /tag/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -93,6 +101,8 @@ class TagApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): @@ -103,7 +113,9 @@ class TagApi { } } - /// Performs an HTTP 'GET /tag' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future findAllWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/tag'; @@ -129,6 +141,7 @@ class TagApi { ); } + /// Future?> findAll() async { final response = await findAllWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -147,7 +160,10 @@ class TagApi { return null; } - /// Performs an HTTP 'GET /tag/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -177,6 +193,8 @@ class TagApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): @@ -195,7 +213,10 @@ class TagApi { return null; } - /// Performs an HTTP 'PATCH /tag/{id}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] id (required): @@ -227,6 +248,8 @@ class TagApi { ); } + /// + /// /// Parameters: /// /// * [String] id (required): diff --git a/mobile/openapi/lib/api/user_api.dart b/mobile/openapi/lib/api/user_api.dart index f187652ac2..51bd6180fb 100644 --- a/mobile/openapi/lib/api/user_api.dart +++ b/mobile/openapi/lib/api/user_api.dart @@ -16,7 +16,10 @@ class UserApi { final ApiClient apiClient; - /// Performs an HTTP 'POST /user/profile-image' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [MultipartFile] file (required): @@ -55,6 +58,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [MultipartFile] file (required): @@ -73,7 +78,10 @@ class UserApi { return null; } - /// Performs an HTTP 'POST /user' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [CreateUserDto] createUserDto (required): @@ -102,6 +110,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [CreateUserDto] createUserDto (required): @@ -120,7 +130,10 @@ class UserApi { return null; } - /// Performs an HTTP 'DELETE /user/{userId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] userId (required): @@ -150,6 +163,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [String] userId (required): @@ -168,7 +183,10 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /user' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [bool] isAll (required): @@ -199,6 +217,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [bool] isAll (required): @@ -220,7 +240,9 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /user/me' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. Future getMyUserInfoWithHttpInfo() async { // ignore: prefer_const_declarations final path = r'/user/me'; @@ -246,6 +268,7 @@ class UserApi { ); } + /// Future getMyUserInfo() async { final response = await getMyUserInfoWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { @@ -261,7 +284,10 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /user/profile-image/{userId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] userId (required): @@ -291,6 +317,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [String] userId (required): @@ -309,7 +337,10 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /user/info/{userId}' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] userId (required): @@ -339,6 +370,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [String] userId (required): @@ -357,7 +390,10 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /user/count' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [bool] admin: @@ -390,6 +426,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [bool] admin: @@ -408,7 +446,10 @@ class UserApi { return null; } - /// Performs an HTTP 'POST /user/{userId}/restore' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [String] userId (required): @@ -438,6 +479,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [String] userId (required): @@ -456,7 +499,10 @@ class UserApi { return null; } - /// Performs an HTTP 'PUT /user' operation and returns the [Response]. + /// + /// + /// Note: This method returns the HTTP [Response]. + /// /// Parameters: /// /// * [UpdateUserDto] updateUserDto (required): @@ -485,6 +531,8 @@ class UserApi { ); } + /// + /// /// Parameters: /// /// * [UpdateUserDto] updateUserDto (required): diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 3a916af671..38bf12fb8f 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -240,6 +240,8 @@ class ApiClient { return CreateAlbumDto.fromJson(value); case 'CreateAlbumShareLinkDto': return CreateAlbumShareLinkDto.fromJson(value); + case 'CreateAssetsShareLinkDto': + return CreateAssetsShareLinkDto.fromJson(value); case 'CreateProfileImageResponseDto': return CreateProfileImageResponseDto.fromJson(value); case 'CreateTagDto': @@ -336,6 +338,8 @@ 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/create_assets_share_link_dto.dart b/mobile/openapi/lib/model/create_assets_share_link_dto.dart new file mode 100644 index 0000000000..12fc7fb645 --- /dev/null +++ b/mobile/openapi/lib/model/create_assets_share_link_dto.dart @@ -0,0 +1,164 @@ +// +// 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 CreateAssetsShareLinkDto { + /// Returns a new [CreateAssetsShareLinkDto] instance. + CreateAssetsShareLinkDto({ + this.assetIds = const [], + this.expiredAt, + this.allowUpload, + this.description, + }); + + List assetIds; + + /// + /// 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? expiredAt; + + /// + /// 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? allowUpload; + + /// + /// 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? description; + + @override + bool operator ==(Object other) => identical(this, other) || other is CreateAssetsShareLinkDto && + other.assetIds == assetIds && + other.expiredAt == expiredAt && + other.allowUpload == allowUpload && + other.description == description; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (assetIds.hashCode) + + (expiredAt == null ? 0 : expiredAt!.hashCode) + + (allowUpload == null ? 0 : allowUpload!.hashCode) + + (description == null ? 0 : description!.hashCode); + + @override + String toString() => 'CreateAssetsShareLinkDto[assetIds=$assetIds, expiredAt=$expiredAt, allowUpload=$allowUpload, description=$description]'; + + Map toJson() { + final json = {}; + json[r'assetIds'] = this.assetIds; + if (this.expiredAt != null) { + json[r'expiredAt'] = this.expiredAt; + } else { + // json[r'expiredAt'] = null; + } + if (this.allowUpload != null) { + json[r'allowUpload'] = this.allowUpload; + } else { + // json[r'allowUpload'] = null; + } + if (this.description != null) { + json[r'description'] = this.description; + } else { + // json[r'description'] = null; + } + return json; + } + + /// Returns a new [CreateAssetsShareLinkDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static CreateAssetsShareLinkDto? 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 "CreateAssetsShareLinkDto[$key]" is missing from JSON.'); + assert(json[key] != null, 'Required key "CreateAssetsShareLinkDto[$key]" has a null value in JSON.'); + }); + return true; + }()); + + return CreateAssetsShareLinkDto( + assetIds: json[r'assetIds'] is List + ? (json[r'assetIds'] as List).cast() + : const [], + expiredAt: mapValueOfType(json, r'expiredAt'), + allowUpload: mapValueOfType(json, r'allowUpload'), + description: mapValueOfType(json, r'description'), + ); + } + 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 = CreateAssetsShareLinkDto.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 = CreateAssetsShareLinkDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of CreateAssetsShareLinkDto-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 = CreateAssetsShareLinkDto.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/lib/model/update_assets_to_shared_link_dto.dart b/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart new file mode 100644 index 0000000000..fb8a4c780d --- /dev/null +++ b/mobile/openapi/lib/model/update_assets_to_shared_link_dto.dart @@ -0,0 +1,113 @@ +// +// 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/album_api_test.dart b/mobile/openapi/test/album_api_test.dart index f120d01bdf..8d22634b42 100644 --- a/mobile/openapi/test/album_api_test.dart +++ b/mobile/openapi/test/album_api_test.dart @@ -17,61 +17,85 @@ void main() { // final instance = AlbumApi(); group('tests for AlbumApi', () { + // + // //Future addAssetsToAlbum(String albumId, AddAssetsDto addAssetsDto) async test('test addAssetsToAlbum', () async { // TODO }); + // + // //Future addUsersToAlbum(String albumId, AddUsersDto addUsersDto) async test('test addUsersToAlbum', () async { // TODO }); + // + // //Future createAlbum(CreateAlbumDto createAlbumDto) async test('test createAlbum', () async { // TODO }); + // + // //Future createAlbumSharedLink(CreateAlbumShareLinkDto createAlbumShareLinkDto) async test('test createAlbumSharedLink', () async { // TODO }); + // + // //Future deleteAlbum(String albumId) async test('test deleteAlbum', () async { // TODO }); + // + // //Future downloadArchive(String albumId, { num skip }) async test('test downloadArchive', () async { // TODO }); + // + // //Future getAlbumCountByUserId() async test('test getAlbumCountByUserId', () async { // TODO }); + // + // //Future getAlbumInfo(String albumId) async test('test getAlbumInfo', () async { // TODO }); + // + // //Future> getAllAlbums({ bool shared, String assetId }) async test('test getAllAlbums', () async { // TODO }); + // + // //Future removeAssetFromAlbum(String albumId, RemoveAssetsDto removeAssetsDto) async test('test removeAssetFromAlbum', () async { // TODO }); + // + // //Future removeUserFromAlbum(String albumId, String userId) async test('test removeUserFromAlbum', () async { // TODO }); + // + // //Future updateAlbumInfo(String albumId, UpdateAlbumDto updateAlbumDto) async test('test updateAlbumInfo', () async { // TODO diff --git a/mobile/openapi/test/api_key_api_test.dart b/mobile/openapi/test/api_key_api_test.dart index 588a6f4c20..df8272065c 100644 --- a/mobile/openapi/test/api_key_api_test.dart +++ b/mobile/openapi/test/api_key_api_test.dart @@ -17,26 +17,36 @@ void main() { // final instance = APIKeyApi(); group('tests for APIKeyApi', () { + // + // //Future createKey(APIKeyCreateDto aPIKeyCreateDto) async test('test createKey', () async { // TODO }); + // + // //Future deleteKey(num id) async test('test deleteKey', () async { // TODO }); + // + // //Future getKey(num id) async test('test getKey', () async { // TODO }); + // + // //Future> getKeys() async test('test getKeys', () async { // TODO }); + // + // //Future updateKey(num id, APIKeyUpdateDto aPIKeyUpdateDto) async test('test updateKey', () async { // TODO diff --git a/mobile/openapi/test/asset_api_test.dart b/mobile/openapi/test/asset_api_test.dart index c7f356dac3..930893b394 100644 --- a/mobile/openapi/test/asset_api_test.dart +++ b/mobile/openapi/test/asset_api_test.dart @@ -31,21 +31,36 @@ void main() { // TODO }); + // + // + //Future createAssetsSharedLink(CreateAssetsShareLinkDto createAssetsShareLinkDto) async + test('test createAssetsSharedLink', () async { + // TODO + }); + + // + // //Future> deleteAsset(DeleteAssetDto deleteAssetDto) async test('test deleteAsset', () async { // TODO }); + // + // //Future downloadFile(String assetId, { bool isThumb, bool isWeb }) async test('test downloadFile', () async { // TODO }); + // + // //Future downloadFiles(DownloadFilesDto downloadFilesDto) async test('test downloadFiles', () async { // TODO }); + // + // //Future downloadLibrary({ num skip }) async test('test downloadLibrary', () async { // TODO @@ -65,36 +80,50 @@ void main() { // TODO }); + // + // //Future> getAssetByTimeBucket(GetAssetByTimeBucketDto getAssetByTimeBucketDto) async test('test getAssetByTimeBucket', () async { // TODO }); + // + // //Future getAssetCountByTimeBucket(GetAssetCountByTimeBucketDto getAssetCountByTimeBucketDto) async test('test getAssetCountByTimeBucket', () async { // TODO }); + // + // //Future getAssetCountByUserId() async test('test getAssetCountByUserId', () async { // TODO }); + // + // //Future> getAssetSearchTerms() async test('test getAssetSearchTerms', () async { // TODO }); + // + // //Future getAssetThumbnail(String assetId, { ThumbnailFormat format }) async test('test getAssetThumbnail', () async { // TODO }); + // + // //Future> getCuratedLocations() async test('test getCuratedLocations', () async { // TODO }); + // + // //Future> getCuratedObjects() async test('test getCuratedObjects', () async { // TODO @@ -107,11 +136,15 @@ void main() { // TODO }); + // + // //Future> searchAsset(SearchAssetDto searchAssetDto) async test('test searchAsset', () async { // TODO }); + // + // //Future serveFile(String assetId, { bool isThumb, bool isWeb }) async test('test serveFile', () async { // TODO @@ -124,6 +157,15 @@ void main() { // TODO }); + // + // + //Future updateAssetsInSharedLink(UpdateAssetsToSharedLinkDto updateAssetsToSharedLinkDto) async + test('test updateAssetsInSharedLink', () async { + // TODO + }); + + // + // //Future uploadFile(MultipartFile assetData) async test('test uploadFile', () async { // TODO diff --git a/mobile/openapi/test/authentication_api_test.dart b/mobile/openapi/test/authentication_api_test.dart index f855d32390..45f283f8a9 100644 --- a/mobile/openapi/test/authentication_api_test.dart +++ b/mobile/openapi/test/authentication_api_test.dart @@ -17,26 +17,36 @@ void main() { // final instance = AuthenticationApi(); group('tests for AuthenticationApi', () { + // + // //Future adminSignUp(SignUpDto signUpDto) async test('test adminSignUp', () async { // TODO }); + // + // //Future changePassword(ChangePasswordDto changePasswordDto) async test('test changePassword', () async { // TODO }); + // + // //Future login(LoginCredentialDto loginCredentialDto) async test('test login', () async { // TODO }); + // + // //Future logout() async test('test logout', () async { // TODO }); + // + // //Future validateAccessToken() async test('test validateAccessToken', () async { // TODO diff --git a/mobile/openapi/test/create_assets_share_link_dto_test.dart b/mobile/openapi/test/create_assets_share_link_dto_test.dart new file mode 100644 index 0000000000..813e6bced8 --- /dev/null +++ b/mobile/openapi/test/create_assets_share_link_dto_test.dart @@ -0,0 +1,42 @@ +// +// 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 CreateAssetsShareLinkDto +void main() { + // final instance = CreateAssetsShareLinkDto(); + + group('test CreateAssetsShareLinkDto', () { + // List assetIds (default value: const []) + test('to test the property `assetIds`', () async { + // TODO + }); + + // String expiredAt + test('to test the property `expiredAt`', () async { + // TODO + }); + + // bool allowUpload + test('to test the property `allowUpload`', () async { + // TODO + }); + + // String description + test('to test the property `description`', () async { + // TODO + }); + + + }); + +} diff --git a/mobile/openapi/test/device_info_api_test.dart b/mobile/openapi/test/device_info_api_test.dart index f7271b8dca..5bfbb4c328 100644 --- a/mobile/openapi/test/device_info_api_test.dart +++ b/mobile/openapi/test/device_info_api_test.dart @@ -31,6 +31,8 @@ void main() { // TODO }); + // + // //Future upsertDeviceInfo(UpsertDeviceInfoDto upsertDeviceInfoDto) async test('test upsertDeviceInfo', () async { // TODO diff --git a/mobile/openapi/test/job_api_test.dart b/mobile/openapi/test/job_api_test.dart index ece5252120..5ff6fd7745 100644 --- a/mobile/openapi/test/job_api_test.dart +++ b/mobile/openapi/test/job_api_test.dart @@ -17,16 +17,22 @@ void main() { // final instance = JobApi(); group('tests for JobApi', () { + // + // //Future getAllJobsStatus() async test('test getAllJobsStatus', () async { // TODO }); + // + // //Future getJobStatus(JobId jobId) async test('test getJobStatus', () async { // TODO }); + // + // //Future sendJobCommand(JobId jobId, JobCommandDto jobCommandDto) async test('test sendJobCommand', () async { // TODO diff --git a/mobile/openapi/test/o_auth_api_test.dart b/mobile/openapi/test/o_auth_api_test.dart index bc8b5f3810..db5e6c0a21 100644 --- a/mobile/openapi/test/o_auth_api_test.dart +++ b/mobile/openapi/test/o_auth_api_test.dart @@ -17,26 +17,36 @@ void main() { // final instance = OAuthApi(); group('tests for OAuthApi', () { + // + // //Future callback(OAuthCallbackDto oAuthCallbackDto) async test('test callback', () async { // TODO }); + // + // //Future generateConfig(OAuthConfigDto oAuthConfigDto) async test('test generateConfig', () async { // TODO }); + // + // //Future link(OAuthCallbackDto oAuthCallbackDto) async test('test link', () async { // TODO }); + // + // //Future mobileRedirect() async test('test mobileRedirect', () async { // TODO }); + // + // //Future unlink() async test('test unlink', () async { // TODO diff --git a/mobile/openapi/test/server_info_api_test.dart b/mobile/openapi/test/server_info_api_test.dart index b662587eef..e2222244eb 100644 --- a/mobile/openapi/test/server_info_api_test.dart +++ b/mobile/openapi/test/server_info_api_test.dart @@ -17,21 +17,29 @@ void main() { // final instance = ServerInfoApi(); group('tests for ServerInfoApi', () { + // + // //Future getServerInfo() async test('test getServerInfo', () async { // TODO }); + // + // //Future getServerVersion() async test('test getServerVersion', () async { // TODO }); + // + // //Future getStats() async test('test getStats', () async { // TODO }); + // + // //Future pingServer() async test('test pingServer', () async { // TODO diff --git a/mobile/openapi/test/share_api_test.dart b/mobile/openapi/test/share_api_test.dart index fcc988cdff..3fb8f8955d 100644 --- a/mobile/openapi/test/share_api_test.dart +++ b/mobile/openapi/test/share_api_test.dart @@ -17,26 +17,36 @@ void main() { // final instance = ShareApi(); group('tests for ShareApi', () { + // + // //Future editSharedLink(String id, EditSharedLinkDto editSharedLinkDto) async test('test editSharedLink', () async { // TODO }); + // + // //Future> getAllSharedLinks() async test('test getAllSharedLinks', () async { // TODO }); + // + // //Future getMySharedLink() async test('test getMySharedLink', () async { // TODO }); + // + // //Future getSharedLinkById(String id) async test('test getSharedLinkById', () async { // TODO }); + // + // //Future removeSharedLink(String id) async test('test removeSharedLink', () async { // TODO diff --git a/mobile/openapi/test/system_config_api_test.dart b/mobile/openapi/test/system_config_api_test.dart index 6cb7aa79d1..28a3b0ed26 100644 --- a/mobile/openapi/test/system_config_api_test.dart +++ b/mobile/openapi/test/system_config_api_test.dart @@ -17,21 +17,29 @@ void main() { // final instance = SystemConfigApi(); group('tests for SystemConfigApi', () { + // + // //Future getConfig() async test('test getConfig', () async { // TODO }); + // + // //Future getDefaults() async test('test getDefaults', () async { // TODO }); + // + // //Future getStorageTemplateOptions() async test('test getStorageTemplateOptions', () async { // TODO }); + // + // //Future updateConfig(SystemConfigDto systemConfigDto) async test('test updateConfig', () async { // TODO diff --git a/mobile/openapi/test/tag_api_test.dart b/mobile/openapi/test/tag_api_test.dart index a504aedfae..ffb6c70a49 100644 --- a/mobile/openapi/test/tag_api_test.dart +++ b/mobile/openapi/test/tag_api_test.dart @@ -17,26 +17,36 @@ void main() { // final instance = TagApi(); group('tests for TagApi', () { + // + // //Future create(CreateTagDto createTagDto) async test('test create', () async { // TODO }); + // + // //Future delete(String id) async test('test delete', () async { // TODO }); + // + // //Future> findAll() async test('test findAll', () async { // TODO }); + // + // //Future findOne(String id) async test('test findOne', () async { // TODO }); + // + // //Future update(String id, UpdateTagDto updateTagDto) async test('test update', () async { // TODO 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 new file mode 100644 index 0000000000..9b0fb4d1da --- /dev/null +++ b/mobile/openapi/test/update_assets_to_shared_link_dto_test.dart @@ -0,0 +1,27 @@ +// +// 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/mobile/openapi/test/user_api_test.dart b/mobile/openapi/test/user_api_test.dart index 5163a15004..d24f365906 100644 --- a/mobile/openapi/test/user_api_test.dart +++ b/mobile/openapi/test/user_api_test.dart @@ -17,51 +17,71 @@ void main() { // final instance = UserApi(); group('tests for UserApi', () { + // + // //Future createProfileImage(MultipartFile file) async test('test createProfileImage', () async { // TODO }); + // + // //Future createUser(CreateUserDto createUserDto) async test('test createUser', () async { // TODO }); + // + // //Future deleteUser(String userId) async test('test deleteUser', () async { // TODO }); + // + // //Future> getAllUsers(bool isAll) async test('test getAllUsers', () async { // TODO }); + // + // //Future getMyUserInfo() async test('test getMyUserInfo', () async { // TODO }); + // + // //Future getProfileImage(String userId) async test('test getProfileImage', () async { // TODO }); + // + // //Future getUserById(String userId) async test('test getUserById', () async { // TODO }); + // + // //Future getUserCount({ bool admin }) async test('test getUserCount', () async { // TODO }); + // + // //Future restoreUser(String userId) async test('test restoreUser', () async { // TODO }); + // + // //Future updateUser(UpdateUserDto updateUserDto) async test('test updateUser', () 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 a2f9a7f7f1..4f2d24a7c8 100644 --- a/server/apps/immich/src/api-v1/asset/asset.controller.ts +++ b/server/apps/immich/src/api-v1/asset/asset.controller.ts @@ -14,6 +14,7 @@ import { Header, Put, UploadedFiles, + Patch, } from '@nestjs/common'; import { Authenticated } from '../../decorators/authenticated.decorator'; import { AssetService } from './asset.service'; @@ -50,6 +51,9 @@ import { IMMICH_CONTENT_LENGTH_HINT, } from '../../constants/download.constant'; import { DownloadFilesDto } from './dto/download-files.dto'; +import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; +import { SharedLinkResponseDto } from '../share/response-dto/shared-link-response.dto'; +import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; @ApiBearerAuth() @ApiTags('Asset') @@ -321,4 +325,22 @@ export class AssetController { ): Promise { return await this.assetService.checkExistingAssets(authUser, checkExistingAssetsDto); } + + @Authenticated() + @Post('/shared-link') + async createAssetsSharedLink( + @GetAuthUser() authUser: AuthUserDto, + @Body(ValidationPipe) dto: CreateAssetsShareLinkDto, + ): Promise { + return await this.assetService.createAssetsSharedLink(authUser, dto); + } + + @Authenticated({ isShared: true }) + @Patch('/shared-link') + async updateAssetsInSharedLink( + @GetAuthUser() authUser: AuthUserDto, + @Body(ValidationPipe) dto: UpdateAssetsToSharedLinkDto, + ): Promise { + return await this.assetService.updateAssetsInSharedLink(authUser, dto); + } } 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 aeae60da9d..6f2138ea59 100644 --- a/server/apps/immich/src/api-v1/asset/asset.service.ts +++ b/server/apps/immich/src/api-v1/asset/asset.service.ts @@ -13,7 +13,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { createHash, randomUUID } from 'node:crypto'; import { QueryFailedError, Repository } from 'typeorm'; import { AuthUserDto } from '../../decorators/auth-user.decorator'; -import { AssetEntity, AssetType } from '@app/infra'; +import { AssetEntity, AssetType, SharedLinkType } from '@app/infra'; import { constants, createReadStream, ReadStream, stat } from 'fs'; import { ServeFileDto } from './dto/serve-file.dto'; import { Response as Res } from 'express'; @@ -59,6 +59,9 @@ import { StorageService } from '@app/storage'; import { ShareCore } from '../share/share.core'; import { ISharedLinkRepository } from '../share/shared-link.repository'; import { DownloadFilesDto } from './dto/download-files.dto'; +import { CreateAssetsShareLinkDto } from './dto/create-asset-shared-link.dto'; +import { mapSharedLinkToResponseDto, SharedLinkResponseDto } from '../share/response-dto/shared-link-response.dto'; +import { UpdateAssetsToSharedLinkDto } from './dto/add-assets-to-shared-link.dto'; const fileInfo = promisify(stat); @@ -699,6 +702,42 @@ export class AssetService { throw new ForbiddenException(); } } + + async createAssetsSharedLink(authUser: AuthUserDto, dto: CreateAssetsShareLinkDto): Promise { + 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 sharedLink = await this.shareCore.createSharedLink(authUser.id, { + sharedType: SharedLinkType.INDIVIDUAL, + expiredAt: dto.expiredAt, + allowUpload: dto.allowUpload, + assets: assets, + description: dto.description, + }); + + return mapSharedLinkToResponseDto(sharedLink); + } + + async updateAssetsInSharedLink( + authUser: AuthUserDto, + dto: UpdateAssetsToSharedLinkDto, + ): 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.updateAssetsInSharedLink(authUser.sharedLinkId, assets); + return mapSharedLinkToResponseDto(updatedLink); + } } async function processETag(path: string, res: Res, headers: Record): Promise { 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 new file mode 100644 index 0000000000..2eb451d3d3 --- /dev/null +++ b/server/apps/immich/src/api-v1/asset/dto/add-assets-to-shared-link.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty } from 'class-validator'; + +export class UpdateAssetsToSharedLinkDto { + @IsNotEmpty() + assetIds!: string[]; +} diff --git a/server/apps/immich/src/api-v1/asset/dto/create-asset-shared-link.dto.ts b/server/apps/immich/src/api-v1/asset/dto/create-asset-shared-link.dto.ts new file mode 100644 index 0000000000..7a2f72be97 --- /dev/null +++ b/server/apps/immich/src/api-v1/asset/dto/create-asset-shared-link.dto.ts @@ -0,0 +1,31 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsArray, IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator'; + +export class CreateAssetsShareLinkDto { + @IsArray() + @IsString({ each: true }) + @IsNotEmpty({ each: true }) + @ApiProperty({ + isArray: true, + type: String, + title: 'Array asset IDs to be shared', + example: [ + 'bf973405-3f2a-48d2-a687-2ed4167164be', + 'dd41870b-5d00-46d2-924e-1d8489a0aa0f', + 'fad77c3f-deef-4e7e-9608-14c1aa4e559a', + ], + }) + assetIds!: string[]; + + @IsString() + @IsOptional() + expiredAt?: string; + + @IsBoolean() + @IsOptional() + allowUpload?: boolean; + + @IsString() + @IsOptional() + description?: string; +} diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index cf77df1ca4..82f2a501df 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1258,6 +1258,78 @@ ] } }, + "/asset/shared-link": { + "post": { + "operationId": "createAssetsSharedLink", + "description": "", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAssetsShareLinkDto" + } + } + } + }, + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SharedLinkResponseDto" + } + } + } + } + }, + "tags": [ + "Asset" + ], + "security": [ + { + "bearer": [] + } + ] + }, + "patch": { + "operationId": "updateAssetsInSharedLink", + "description": "", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateAssetsToSharedLinkDto" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SharedLinkResponseDto" + } + } + } + } + }, + "tags": [ + "Asset" + ], + "security": [ + { + "bearer": [] + } + ] + } + }, "/share": { "get": { "operationId": "getAllSharedLinks", @@ -3548,6 +3620,35 @@ "existingIds" ] }, + "CreateAssetsShareLinkDto": { + "type": "object", + "properties": { + "assetIds": { + "title": "Array asset IDs to be shared", + "example": [ + "bf973405-3f2a-48d2-a687-2ed4167164be", + "dd41870b-5d00-46d2-924e-1d8489a0aa0f", + "fad77c3f-deef-4e7e-9608-14c1aa4e559a" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "expiredAt": { + "type": "string" + }, + "allowUpload": { + "type": "boolean" + }, + "description": { + "type": "string" + } + }, + "required": [ + "assetIds" + ] + }, "SharedLinkType": { "type": "string", "enum": [ @@ -3654,6 +3755,20 @@ "allowUpload" ] }, + "UpdateAssetsToSharedLinkDto": { + "type": "object", + "properties": { + "assetIds": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "assetIds" + ] + }, "EditSharedLinkDto": { "type": "object", "properties": { diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 4627973a43..5af6cb396f 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.40.0 + * The version of the OpenAPI document: 1.41.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -702,6 +702,37 @@ export interface CreateAlbumShareLinkDto { */ 'description'?: string; } +/** + * + * @export + * @interface CreateAssetsShareLinkDto + */ +export interface CreateAssetsShareLinkDto { + /** + * + * @type {Array} + * @memberof CreateAssetsShareLinkDto + */ + 'assetIds': Array; + /** + * + * @type {string} + * @memberof CreateAssetsShareLinkDto + */ + 'expiredAt'?: string; + /** + * + * @type {boolean} + * @memberof CreateAssetsShareLinkDto + */ + 'allowUpload'?: boolean; + /** + * + * @type {string} + * @memberof CreateAssetsShareLinkDto + */ + 'description'?: string; +} /** * * @export @@ -2029,6 +2060,19 @@ export interface UpdateAssetDto { */ 'isFavorite'?: boolean; } +/** + * + * @export + * @interface UpdateAssetsToSharedLinkDto + */ +export interface UpdateAssetsToSharedLinkDto { + /** + * + * @type {Array} + * @memberof UpdateAssetsToSharedLinkDto + */ + 'assetIds': Array; +} /** * * @export @@ -3599,6 +3643,45 @@ export const AssetApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * + * @param {CreateAssetsShareLinkDto} createAssetsShareLinkDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createAssetsSharedLink: async (createAssetsShareLinkDto: CreateAssetsShareLinkDto, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'createAssetsShareLinkDto' is not null or undefined + assertParamExists('createAssetsSharedLink', 'createAssetsShareLinkDto', createAssetsShareLinkDto) + 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: 'POST', ...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(createAssetsShareLinkDto, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {DeleteAssetDto} deleteAssetDto @@ -4255,6 +4338,45 @@ 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 {any} assetData @@ -4329,6 +4451,16 @@ export const AssetApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.checkExistingAssets(checkExistingAssetsDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {CreateAssetsShareLinkDto} createAssetsShareLinkDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createAssetsSharedLink(createAssetsShareLinkDto: CreateAssetsShareLinkDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createAssetsSharedLink(createAssetsShareLinkDto, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {DeleteAssetDto} deleteAssetDto @@ -4501,6 +4633,16 @@ 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 {any} assetData @@ -4539,6 +4681,15 @@ export const AssetApiFactory = function (configuration?: Configuration, basePath checkExistingAssets(checkExistingAssetsDto: CheckExistingAssetsDto, options?: any): AxiosPromise { return localVarFp.checkExistingAssets(checkExistingAssetsDto, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {CreateAssetsShareLinkDto} createAssetsShareLinkDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createAssetsSharedLink(createAssetsShareLinkDto: CreateAssetsShareLinkDto, options?: any): AxiosPromise { + return localVarFp.createAssetsSharedLink(createAssetsShareLinkDto, options).then((request) => request(axios, basePath)); + }, /** * * @param {DeleteAssetDto} deleteAssetDto @@ -4694,6 +4845,15 @@ 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 {any} assetData @@ -4735,6 +4895,17 @@ export class AssetApi extends BaseAPI { return AssetApiFp(this.configuration).checkExistingAssets(checkExistingAssetsDto, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {CreateAssetsShareLinkDto} createAssetsShareLinkDto + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AssetApi + */ + public createAssetsSharedLink(createAssetsShareLinkDto: CreateAssetsShareLinkDto, options?: AxiosRequestConfig) { + return AssetApiFp(this.configuration).createAssetsSharedLink(createAssetsShareLinkDto, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {DeleteAssetDto} deleteAssetDto @@ -4924,6 +5095,17 @@ 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 {any} assetData @@ -5300,6 +5482,7 @@ export const DeviceInfoApiAxiosParamCreator = function (configuration?: Configur * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ createDeviceInfo: async (upsertDeviceInfoDto: UpsertDeviceInfoDto, options: AxiosRequestConfig = {}): Promise => { @@ -5339,6 +5522,7 @@ export const DeviceInfoApiAxiosParamCreator = function (configuration?: Configur * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateDeviceInfo: async (upsertDeviceInfoDto: UpsertDeviceInfoDto, options: AxiosRequestConfig = {}): Promise => { @@ -5427,6 +5611,7 @@ export const DeviceInfoApiFp = function(configuration?: Configuration) { * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async createDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { @@ -5437,6 +5622,7 @@ export const DeviceInfoApiFp = function(configuration?: Configuration) { * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ async updateDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { @@ -5467,6 +5653,7 @@ export const DeviceInfoApiFactory = function (configuration?: Configuration, bas * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ createDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: any): AxiosPromise { @@ -5476,6 +5663,7 @@ export const DeviceInfoApiFactory = function (configuration?: Configuration, bas * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} */ updateDeviceInfo(upsertDeviceInfoDto: UpsertDeviceInfoDto, options?: any): AxiosPromise { @@ -5504,6 +5692,7 @@ export class DeviceInfoApi extends BaseAPI { * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} * @memberof DeviceInfoApi */ @@ -5515,6 +5704,7 @@ export class DeviceInfoApi extends BaseAPI { * @deprecated * @param {UpsertDeviceInfoDto} upsertDeviceInfoDto * @param {*} [options] Override http request option. + * @deprecated * @throws {RequiredError} * @memberof DeviceInfoApi */ diff --git a/web/src/api/open-api/base.ts b/web/src/api/open-api/base.ts index 4d4ced1519..2d8f7a0a43 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.40.0 + * The version of the OpenAPI document: 1.41.1 * * * 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 d51fd5cd23..acd18acb28 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.40.0 + * The version of the OpenAPI document: 1.41.1 * * * 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 14b5a1c7a9..65556da1f2 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.40.0 + * The version of the OpenAPI document: 1.41.1 * * * 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 0ce2e4a1fd..ea27b5ef1e 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.40.0 + * The version of the OpenAPI document: 1.41.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/web/src/lib/components/album-page/album-viewer.svelte b/web/src/lib/components/album-page/album-viewer.svelte index 2b78aa6f13..501d68d5a7 100644 --- a/web/src/lib/components/album-page/album-viewer.svelte +++ b/web/src/lib/components/album-page/album-viewer.svelte @@ -1,13 +1,11 @@ + +
+ {#if isMultiSelectionMode} + + +

+ Selected {selectedAssets.size} +

+
+ + downloadAssets(false)} + logo={CloudDownloadOutline} + /> + {#if isOwned} + + {/if} + +
+ {:else} + goto('/photos')} + backIcon={ArrowLeft} + showBackButton={false} + > + + + immich logo +

+ IMMICH +

+
+
+ + + {#if sharedLink?.allowUpload} + + {/if} + + downloadAssets(true)} + logo={FolderDownloadOutline} + /> + +
+ {/if} +
+ +
+
diff --git a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte index c98d652447..5b3eabb6dc 100644 --- a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte +++ b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte @@ -2,7 +2,13 @@ import { createEventDispatcher, onMount } from 'svelte'; import BaseModal from '../base-modal.svelte'; import Link from 'svelte-material-icons/Link.svelte'; - import { AlbumResponseDto, api, SharedLinkResponseDto, SharedLinkType } from '@api'; + import { + AlbumResponseDto, + api, + AssetResponseDto, + SharedLinkResponseDto, + SharedLinkType + } from '@api'; import { notificationController, NotificationType } from '../notification/notification'; import { ImmichDropDownOption } from '../dropdown-button.svelte'; import SettingSwitch from '$lib/components/admin-page/settings/setting-switch.svelte'; @@ -10,9 +16,11 @@ import SettingInputField, { SettingInputFieldType } from '$lib/components/admin-page/settings/setting-input-field.svelte'; + import { handleError } from '$lib/utils/handle-error'; export let shareType: SharedLinkType; - export let album: AlbumResponseDto | undefined; + export let sharedAssets: AssetResponseDto[] = []; + export let album: AlbumResponseDto | undefined = undefined; export let editingLink: SharedLinkResponseDto | undefined = undefined; let isShowSharedLink = false; @@ -37,32 +45,36 @@ } }); - const createAlbumSharedLink = async () => { - if (album) { - try { - const expirationTime = getExpirationTimeInMillisecond(); - const currentTime = new Date().getTime(); - const expirationDate = expirationTime - ? new Date(currentTime + expirationTime).toISOString() - : undefined; + const handleCreateSharedLink = async () => { + const expirationTime = getExpirationTimeInMillisecond(); + const currentTime = new Date().getTime(); + const expirationDate = expirationTime + ? new Date(currentTime + expirationTime).toISOString() + : undefined; + try { + if (shareType === SharedLinkType.Album && album) { const { data } = await api.albumApi.createAlbumSharedLink({ albumId: album.id, expiredAt: expirationDate, allowUpload: isAllowUpload, description: description }); - buildSharedLink(data); - isShowSharedLink = true; - } catch (e) { - console.error('[createAlbumSharedLink] Error: ', e); - notificationController.show({ - type: NotificationType.Error, - message: 'Failed to create shared link' + } else { + const { data } = await api.assetApi.createAssetsSharedLink({ + assetIds: sharedAssets.map((a) => a.id), + expiredAt: expirationDate, + allowUpload: isAllowUpload, + description: description }); + buildSharedLink(data); } + } catch (e) { + handleError(e, 'Failed to create shared link'); } + + isShowSharedLink = true; }; const buildSharedLink = (createdLink: SharedLinkResponseDto) => { @@ -76,8 +88,11 @@ message: 'Copied to clipboard!', type: NotificationType.Info }); - } catch (error) { - console.error('Error', error); + } catch (e) { + handleError( + e, + 'Cannot copy to clipboard, make sure you are accessing the page through https' + ); } }; @@ -127,11 +142,7 @@ dispatch('close'); } catch (e) { - console.error('[handleEditLink]', e); - notificationController.show({ - type: NotificationType.Error, - message: 'Failed to edit shared link' - }); + handleError(e, 'Failed to edit shared link'); } } }; @@ -162,6 +173,18 @@ {/if} {/if} + {#if shareType == SharedLinkType.Individual} + {#if !editingLink} +
Let anyone with the link see the selected photo(s)
+ {:else} +
+ Individual shared | {editingLink.description} +
+ {/if} + {/if} +

LINK OPTIONS

@@ -215,7 +238,7 @@ {:else}
-

+

{@html notificationInfo.message}

diff --git a/web/src/lib/utils/file-uploader.ts b/web/src/lib/utils/file-uploader.ts index 671534f257..5c6949c224 100644 --- a/web/src/lib/utils/file-uploader.ts +++ b/web/src/lib/utils/file-uploader.ts @@ -12,7 +12,7 @@ import { addAssetsToAlbum } from '$lib/utils/asset-utils'; export const openFileUploadDialog = ( albumId: string | undefined = undefined, sharedKey: string | undefined = undefined, - callback?: () => void + onDone?: (id: string) => void ) => { try { const fileSelector = document.createElement('input'); @@ -28,8 +28,7 @@ export const openFileUploadDialog = ( } const files = Array.from(target.files); - await fileUploadHandler(files, albumId, sharedKey); - callback && callback(); + await fileUploadHandler(files, albumId, sharedKey, onDone); }; fileSelector.click(); @@ -41,7 +40,8 @@ export const openFileUploadDialog = ( export const fileUploadHandler = async ( files: File[], albumId: string | undefined = undefined, - sharedKey: string | undefined = undefined + sharedKey: string | undefined = undefined, + onDone?: (id: string) => void ) => { if (files.length > 50) { notificationController.show({ @@ -54,13 +54,13 @@ export const fileUploadHandler = async ( return; } - console.log('fileUploadHandler'); + const acceptedFile = files.filter( (e) => e.type.split('/')[0] === 'video' || e.type.split('/')[0] === 'image' ); for (const asset of acceptedFile) { - await fileUploader(asset, albumId, sharedKey); + await fileUploader(asset, albumId, sharedKey, onDone); } }; @@ -68,7 +68,8 @@ export const fileUploadHandler = async ( async function fileUploader( asset: File, albumId: string | undefined = undefined, - sharedKey: string | undefined = undefined + sharedKey: string | undefined = undefined, + onDone?: (id: string) => void ) { const assetType = asset.type.split('/')[0].toUpperCase(); const temp = asset.name.split('.'); @@ -135,6 +136,7 @@ async function fileUploader( if (albumId && dataId) { addAssetsToAlbum(albumId, [dataId]); } + onDone && dataId && onDone(dataId); return; } } @@ -154,10 +156,9 @@ async function fileUploader( request.upload.onload = () => { setTimeout(() => { uploadAssetsStore.removeUploadAsset(deviceAssetId); - + const res: AssetFileUploadResponseDto = JSON.parse(request.response || '{}'); if (albumId) { try { - const res: AssetFileUploadResponseDto = JSON.parse(request.response || '{}'); if (res.id) { addAssetsToAlbum(albumId, [res.id], sharedKey); } @@ -165,6 +166,7 @@ async function fileUploader( console.error('ERROR parsing data JSON in upload onload'); } } + onDone && onDone(res.id); }, 1000); }; diff --git a/web/src/routes/photos/+page.svelte b/web/src/routes/photos/+page.svelte index dccba87cf1..43208f38ea 100644 --- a/web/src/routes/photos/+page.svelte +++ b/web/src/routes/photos/+page.svelte @@ -6,9 +6,8 @@ import MenuOption from '$lib/components/shared-components/context-menu/menu-option.svelte'; import AlbumSelectionModal from '$lib/components/shared-components/album-selection-modal.svelte'; import { goto } from '$app/navigation'; - import type { PageData } from './$types'; - + import ShareVariantOutline from 'svelte-material-icons/ShareVariantOutline.svelte'; import { openFileUploadDialog } from '$lib/utils/file-uploader'; import { assetInteractionStore, @@ -21,16 +20,17 @@ import CircleIconButton from '$lib/components/shared-components/circle-icon-button.svelte'; import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte'; import Plus from 'svelte-material-icons/Plus.svelte'; - import { AlbumResponseDto, api } from '@api'; + import { AlbumResponseDto, api, SharedLinkType } from '@api'; import { notificationController, NotificationType } from '$lib/components/shared-components/notification/notification'; import { assetStore } from '$lib/stores/assets.store'; import { addAssetsToAlbum, bulkDownload } from '$lib/utils/asset-utils'; + import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; export let data: PageData; - + let isShowCreateSharedLinkModal = false; const deleteSelectedAssetHandler = async () => { try { if ( @@ -114,6 +114,15 @@ assetInteractionStore.clearMultiselect(); }); }; + + const handleCreateSharedLink = async () => { + isShowCreateSharedLinkModal = true; + }; + + const handleCloseSharedLinkModal = () => { + assetInteractionStore.clearMultiselect(); + isShowCreateSharedLinkModal = false; + };
@@ -129,6 +138,11 @@

+ (isShowAlbumPicker = false)} /> {/if} + + {#if isShowCreateSharedLinkModal} + + {/if}
{ +export const load: PageServerLoad = async ({ params, parent }) => { + const { user } = await parent(); + const { key } = params; try { @@ -22,7 +24,8 @@ export const load: PageServerLoad = async ({ params }) => { imageUrl: assetId ? getThumbnailUrl(assetId, ThumbnailFormat.Webp, sharedLink.key) : 'feature-panel.png' - } + }, + user }; } catch (e) { throw error(404, { diff --git a/web/src/routes/share/[key]/+page.svelte b/web/src/routes/share/[key]/+page.svelte index d436e61b90..554216efff 100644 --- a/web/src/routes/share/[key]/+page.svelte +++ b/web/src/routes/share/[key]/+page.svelte @@ -1,6 +1,7 @@ -{#if album} +{#if sharedLink.type == SharedLinkType.Album && album}
{/if} + +{#if sharedLink.type == SharedLinkType.Individual} +
+ +
+{/if}