feat(server) Tagging system (#1046)
This commit is contained in:
parent
6e2763b72c
commit
5de8ea162d
74 changed files with 8768 additions and 167 deletions
13
.gitattributes
vendored
Normal file
13
.gitattributes
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
mobile/openapi/**/*.md -diff -merge
|
||||||
|
mobile/openapi/**/*.md linguist-generated=true
|
||||||
|
mobile/openapi/**/*.dart -diff -merge
|
||||||
|
mobile/openapi/**/*.dart linguist-generated=true
|
||||||
|
|
||||||
|
web/src/api/open-api/**/*.md -diff -merge
|
||||||
|
web/src/api/open-api/**/*.md linguist-generated=true
|
||||||
|
|
||||||
|
web/src/api/open-api/**/*.ts -diff -merge
|
||||||
|
web/src/api/open-api/**/*.ts linguist-generated=true
|
||||||
|
|
||||||
|
mobile/openapi/.openapi-generator/FILES -diff -merge
|
||||||
|
mobile/openapi/.openapi-generator/FILES linguist-generated=true
|
3
Makefile
3
Makefile
|
@ -27,3 +27,6 @@ prod-scale:
|
||||||
|
|
||||||
api:
|
api:
|
||||||
cd ./server && npm run api:generate
|
cd ./server && npm run api:generate
|
||||||
|
|
||||||
|
attach-server:
|
||||||
|
docker exec -it docker_immich-server_1 sh
|
9
NOTES.md
9
NOTES.md
|
@ -1,9 +0,0 @@
|
||||||
# TODO
|
|
||||||
|
|
||||||
Server scenario with web
|
|
||||||
|
|
||||||
[ ] 1 user exist without admin right -> make admin on first check
|
|
||||||
|
|
||||||
[ ] 2 users exist without admin right -> ask user to choose which account will be the admin
|
|
||||||
|
|
||||||
[ X ] No users exist -> prompt signup form for Admin
|
|
20
mobile/openapi/.openapi-generator/FILES
generated
20
mobile/openapi/.openapi-generator/FILES
generated
|
@ -14,6 +14,7 @@ doc/AssetApi.md
|
||||||
doc/AssetCountByTimeBucket.md
|
doc/AssetCountByTimeBucket.md
|
||||||
doc/AssetCountByTimeBucketResponseDto.md
|
doc/AssetCountByTimeBucketResponseDto.md
|
||||||
doc/AssetCountByUserIdResponseDto.md
|
doc/AssetCountByUserIdResponseDto.md
|
||||||
|
doc/AssetEntity.md
|
||||||
doc/AssetFileUploadResponseDto.md
|
doc/AssetFileUploadResponseDto.md
|
||||||
doc/AssetResponseDto.md
|
doc/AssetResponseDto.md
|
||||||
doc/AssetTypeEnum.md
|
doc/AssetTypeEnum.md
|
||||||
|
@ -25,6 +26,7 @@ doc/CheckExistingAssetsResponseDto.md
|
||||||
doc/CreateAlbumDto.md
|
doc/CreateAlbumDto.md
|
||||||
doc/CreateDeviceInfoDto.md
|
doc/CreateDeviceInfoDto.md
|
||||||
doc/CreateProfileImageResponseDto.md
|
doc/CreateProfileImageResponseDto.md
|
||||||
|
doc/CreateTagDto.md
|
||||||
doc/CreateUserDto.md
|
doc/CreateUserDto.md
|
||||||
doc/CuratedLocationsResponseDto.md
|
doc/CuratedLocationsResponseDto.md
|
||||||
doc/CuratedObjectsResponseDto.md
|
doc/CuratedObjectsResponseDto.md
|
||||||
|
@ -34,6 +36,7 @@ doc/DeleteAssetStatus.md
|
||||||
doc/DeviceInfoApi.md
|
doc/DeviceInfoApi.md
|
||||||
doc/DeviceInfoResponseDto.md
|
doc/DeviceInfoResponseDto.md
|
||||||
doc/DeviceTypeEnum.md
|
doc/DeviceTypeEnum.md
|
||||||
|
doc/ExifEntity.md
|
||||||
doc/ExifResponseDto.md
|
doc/ExifResponseDto.md
|
||||||
doc/GetAssetByTimeBucketDto.md
|
doc/GetAssetByTimeBucketDto.md
|
||||||
doc/GetAssetCountByTimeBucketDto.md
|
doc/GetAssetCountByTimeBucketDto.md
|
||||||
|
@ -58,20 +61,27 @@ doc/ServerPingResponse.md
|
||||||
doc/ServerStatsResponseDto.md
|
doc/ServerStatsResponseDto.md
|
||||||
doc/ServerVersionReponseDto.md
|
doc/ServerVersionReponseDto.md
|
||||||
doc/SignUpDto.md
|
doc/SignUpDto.md
|
||||||
|
doc/SmartInfoEntity.md
|
||||||
doc/SmartInfoResponseDto.md
|
doc/SmartInfoResponseDto.md
|
||||||
doc/SystemConfigApi.md
|
doc/SystemConfigApi.md
|
||||||
doc/SystemConfigKey.md
|
doc/SystemConfigKey.md
|
||||||
doc/SystemConfigResponseDto.md
|
doc/SystemConfigResponseDto.md
|
||||||
doc/SystemConfigResponseItem.md
|
doc/SystemConfigResponseItem.md
|
||||||
|
doc/TagApi.md
|
||||||
|
doc/TagEntity.md
|
||||||
|
doc/TagResponseDto.md
|
||||||
|
doc/TagTypeEnum.md
|
||||||
doc/ThumbnailFormat.md
|
doc/ThumbnailFormat.md
|
||||||
doc/TimeGroupEnum.md
|
doc/TimeGroupEnum.md
|
||||||
doc/UpdateAlbumDto.md
|
doc/UpdateAlbumDto.md
|
||||||
doc/UpdateAssetDto.md
|
doc/UpdateAssetDto.md
|
||||||
doc/UpdateDeviceInfoDto.md
|
doc/UpdateDeviceInfoDto.md
|
||||||
|
doc/UpdateTagDto.md
|
||||||
doc/UpdateUserDto.md
|
doc/UpdateUserDto.md
|
||||||
doc/UsageByUserDto.md
|
doc/UsageByUserDto.md
|
||||||
doc/UserApi.md
|
doc/UserApi.md
|
||||||
doc/UserCountResponseDto.md
|
doc/UserCountResponseDto.md
|
||||||
|
doc/UserEntity.md
|
||||||
doc/UserResponseDto.md
|
doc/UserResponseDto.md
|
||||||
doc/ValidateAccessTokenResponseDto.md
|
doc/ValidateAccessTokenResponseDto.md
|
||||||
git_push.sh
|
git_push.sh
|
||||||
|
@ -84,6 +94,7 @@ lib/api/job_api.dart
|
||||||
lib/api/o_auth_api.dart
|
lib/api/o_auth_api.dart
|
||||||
lib/api/server_info_api.dart
|
lib/api/server_info_api.dart
|
||||||
lib/api/system_config_api.dart
|
lib/api/system_config_api.dart
|
||||||
|
lib/api/tag_api.dart
|
||||||
lib/api/user_api.dart
|
lib/api/user_api.dart
|
||||||
lib/api_client.dart
|
lib/api_client.dart
|
||||||
lib/api_exception.dart
|
lib/api_exception.dart
|
||||||
|
@ -103,6 +114,7 @@ lib/model/all_job_status_response_dto.dart
|
||||||
lib/model/asset_count_by_time_bucket.dart
|
lib/model/asset_count_by_time_bucket.dart
|
||||||
lib/model/asset_count_by_time_bucket_response_dto.dart
|
lib/model/asset_count_by_time_bucket_response_dto.dart
|
||||||
lib/model/asset_count_by_user_id_response_dto.dart
|
lib/model/asset_count_by_user_id_response_dto.dart
|
||||||
|
lib/model/asset_entity.dart
|
||||||
lib/model/asset_file_upload_response_dto.dart
|
lib/model/asset_file_upload_response_dto.dart
|
||||||
lib/model/asset_response_dto.dart
|
lib/model/asset_response_dto.dart
|
||||||
lib/model/asset_type_enum.dart
|
lib/model/asset_type_enum.dart
|
||||||
|
@ -113,6 +125,7 @@ lib/model/check_existing_assets_response_dto.dart
|
||||||
lib/model/create_album_dto.dart
|
lib/model/create_album_dto.dart
|
||||||
lib/model/create_device_info_dto.dart
|
lib/model/create_device_info_dto.dart
|
||||||
lib/model/create_profile_image_response_dto.dart
|
lib/model/create_profile_image_response_dto.dart
|
||||||
|
lib/model/create_tag_dto.dart
|
||||||
lib/model/create_user_dto.dart
|
lib/model/create_user_dto.dart
|
||||||
lib/model/curated_locations_response_dto.dart
|
lib/model/curated_locations_response_dto.dart
|
||||||
lib/model/curated_objects_response_dto.dart
|
lib/model/curated_objects_response_dto.dart
|
||||||
|
@ -121,6 +134,7 @@ lib/model/delete_asset_response_dto.dart
|
||||||
lib/model/delete_asset_status.dart
|
lib/model/delete_asset_status.dart
|
||||||
lib/model/device_info_response_dto.dart
|
lib/model/device_info_response_dto.dart
|
||||||
lib/model/device_type_enum.dart
|
lib/model/device_type_enum.dart
|
||||||
|
lib/model/exif_entity.dart
|
||||||
lib/model/exif_response_dto.dart
|
lib/model/exif_response_dto.dart
|
||||||
lib/model/get_asset_by_time_bucket_dto.dart
|
lib/model/get_asset_by_time_bucket_dto.dart
|
||||||
lib/model/get_asset_count_by_time_bucket_dto.dart
|
lib/model/get_asset_count_by_time_bucket_dto.dart
|
||||||
|
@ -142,18 +156,24 @@ lib/model/server_ping_response.dart
|
||||||
lib/model/server_stats_response_dto.dart
|
lib/model/server_stats_response_dto.dart
|
||||||
lib/model/server_version_reponse_dto.dart
|
lib/model/server_version_reponse_dto.dart
|
||||||
lib/model/sign_up_dto.dart
|
lib/model/sign_up_dto.dart
|
||||||
|
lib/model/smart_info_entity.dart
|
||||||
lib/model/smart_info_response_dto.dart
|
lib/model/smart_info_response_dto.dart
|
||||||
lib/model/system_config_key.dart
|
lib/model/system_config_key.dart
|
||||||
lib/model/system_config_response_dto.dart
|
lib/model/system_config_response_dto.dart
|
||||||
lib/model/system_config_response_item.dart
|
lib/model/system_config_response_item.dart
|
||||||
|
lib/model/tag_entity.dart
|
||||||
|
lib/model/tag_response_dto.dart
|
||||||
|
lib/model/tag_type_enum.dart
|
||||||
lib/model/thumbnail_format.dart
|
lib/model/thumbnail_format.dart
|
||||||
lib/model/time_group_enum.dart
|
lib/model/time_group_enum.dart
|
||||||
lib/model/update_album_dto.dart
|
lib/model/update_album_dto.dart
|
||||||
lib/model/update_asset_dto.dart
|
lib/model/update_asset_dto.dart
|
||||||
lib/model/update_device_info_dto.dart
|
lib/model/update_device_info_dto.dart
|
||||||
|
lib/model/update_tag_dto.dart
|
||||||
lib/model/update_user_dto.dart
|
lib/model/update_user_dto.dart
|
||||||
lib/model/usage_by_user_dto.dart
|
lib/model/usage_by_user_dto.dart
|
||||||
lib/model/user_count_response_dto.dart
|
lib/model/user_count_response_dto.dart
|
||||||
|
lib/model/user_entity.dart
|
||||||
lib/model/user_response_dto.dart
|
lib/model/user_response_dto.dart
|
||||||
lib/model/validate_access_token_response_dto.dart
|
lib/model/validate_access_token_response_dto.dart
|
||||||
pubspec.yaml
|
pubspec.yaml
|
||||||
|
|
16
mobile/openapi/README.md
generated
16
mobile/openapi/README.md
generated
|
@ -93,7 +93,7 @@ Class | Method | HTTP request | Description
|
||||||
*AssetApi* | [**getUserAssetsByDeviceId**](doc//AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} |
|
*AssetApi* | [**getUserAssetsByDeviceId**](doc//AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} |
|
||||||
*AssetApi* | [**searchAsset**](doc//AssetApi.md#searchasset) | **POST** /asset/search |
|
*AssetApi* | [**searchAsset**](doc//AssetApi.md#searchasset) | **POST** /asset/search |
|
||||||
*AssetApi* | [**serveFile**](doc//AssetApi.md#servefile) | **GET** /asset/file/{assetId} |
|
*AssetApi* | [**serveFile**](doc//AssetApi.md#servefile) | **GET** /asset/file/{assetId} |
|
||||||
*AssetApi* | [**updateAssetById**](doc//AssetApi.md#updateassetbyid) | **PUT** /asset/assetById/{assetId} |
|
*AssetApi* | [**updateAsset**](doc//AssetApi.md#updateasset) | **PUT** /asset/{assetId} |
|
||||||
*AssetApi* | [**uploadFile**](doc//AssetApi.md#uploadfile) | **POST** /asset/upload |
|
*AssetApi* | [**uploadFile**](doc//AssetApi.md#uploadfile) | **POST** /asset/upload |
|
||||||
*AuthenticationApi* | [**adminSignUp**](doc//AuthenticationApi.md#adminsignup) | **POST** /auth/admin-sign-up |
|
*AuthenticationApi* | [**adminSignUp**](doc//AuthenticationApi.md#adminsignup) | **POST** /auth/admin-sign-up |
|
||||||
*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login |
|
*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login |
|
||||||
|
@ -112,6 +112,11 @@ Class | Method | HTTP request | Description
|
||||||
*ServerInfoApi* | [**pingServer**](doc//ServerInfoApi.md#pingserver) | **GET** /server-info/ping |
|
*ServerInfoApi* | [**pingServer**](doc//ServerInfoApi.md#pingserver) | **GET** /server-info/ping |
|
||||||
*SystemConfigApi* | [**getConfig**](doc//SystemConfigApi.md#getconfig) | **GET** /system-config |
|
*SystemConfigApi* | [**getConfig**](doc//SystemConfigApi.md#getconfig) | **GET** /system-config |
|
||||||
*SystemConfigApi* | [**updateConfig**](doc//SystemConfigApi.md#updateconfig) | **PUT** /system-config |
|
*SystemConfigApi* | [**updateConfig**](doc//SystemConfigApi.md#updateconfig) | **PUT** /system-config |
|
||||||
|
*TagApi* | [**create**](doc//TagApi.md#create) | **POST** /tag |
|
||||||
|
*TagApi* | [**delete**](doc//TagApi.md#delete) | **DELETE** /tag/{id} |
|
||||||
|
*TagApi* | [**findAll**](doc//TagApi.md#findall) | **GET** /tag |
|
||||||
|
*TagApi* | [**findOne**](doc//TagApi.md#findone) | **GET** /tag/{id} |
|
||||||
|
*TagApi* | [**update**](doc//TagApi.md#update) | **PATCH** /tag/{id} |
|
||||||
*UserApi* | [**createProfileImage**](doc//UserApi.md#createprofileimage) | **POST** /user/profile-image |
|
*UserApi* | [**createProfileImage**](doc//UserApi.md#createprofileimage) | **POST** /user/profile-image |
|
||||||
*UserApi* | [**createUser**](doc//UserApi.md#createuser) | **POST** /user |
|
*UserApi* | [**createUser**](doc//UserApi.md#createuser) | **POST** /user |
|
||||||
*UserApi* | [**deleteUser**](doc//UserApi.md#deleteuser) | **DELETE** /user/{userId} |
|
*UserApi* | [**deleteUser**](doc//UserApi.md#deleteuser) | **DELETE** /user/{userId} |
|
||||||
|
@ -136,6 +141,7 @@ Class | Method | HTTP request | Description
|
||||||
- [AssetCountByTimeBucket](doc//AssetCountByTimeBucket.md)
|
- [AssetCountByTimeBucket](doc//AssetCountByTimeBucket.md)
|
||||||
- [AssetCountByTimeBucketResponseDto](doc//AssetCountByTimeBucketResponseDto.md)
|
- [AssetCountByTimeBucketResponseDto](doc//AssetCountByTimeBucketResponseDto.md)
|
||||||
- [AssetCountByUserIdResponseDto](doc//AssetCountByUserIdResponseDto.md)
|
- [AssetCountByUserIdResponseDto](doc//AssetCountByUserIdResponseDto.md)
|
||||||
|
- [AssetEntity](doc//AssetEntity.md)
|
||||||
- [AssetFileUploadResponseDto](doc//AssetFileUploadResponseDto.md)
|
- [AssetFileUploadResponseDto](doc//AssetFileUploadResponseDto.md)
|
||||||
- [AssetResponseDto](doc//AssetResponseDto.md)
|
- [AssetResponseDto](doc//AssetResponseDto.md)
|
||||||
- [AssetTypeEnum](doc//AssetTypeEnum.md)
|
- [AssetTypeEnum](doc//AssetTypeEnum.md)
|
||||||
|
@ -146,6 +152,7 @@ Class | Method | HTTP request | Description
|
||||||
- [CreateAlbumDto](doc//CreateAlbumDto.md)
|
- [CreateAlbumDto](doc//CreateAlbumDto.md)
|
||||||
- [CreateDeviceInfoDto](doc//CreateDeviceInfoDto.md)
|
- [CreateDeviceInfoDto](doc//CreateDeviceInfoDto.md)
|
||||||
- [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md)
|
- [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md)
|
||||||
|
- [CreateTagDto](doc//CreateTagDto.md)
|
||||||
- [CreateUserDto](doc//CreateUserDto.md)
|
- [CreateUserDto](doc//CreateUserDto.md)
|
||||||
- [CuratedLocationsResponseDto](doc//CuratedLocationsResponseDto.md)
|
- [CuratedLocationsResponseDto](doc//CuratedLocationsResponseDto.md)
|
||||||
- [CuratedObjectsResponseDto](doc//CuratedObjectsResponseDto.md)
|
- [CuratedObjectsResponseDto](doc//CuratedObjectsResponseDto.md)
|
||||||
|
@ -154,6 +161,7 @@ Class | Method | HTTP request | Description
|
||||||
- [DeleteAssetStatus](doc//DeleteAssetStatus.md)
|
- [DeleteAssetStatus](doc//DeleteAssetStatus.md)
|
||||||
- [DeviceInfoResponseDto](doc//DeviceInfoResponseDto.md)
|
- [DeviceInfoResponseDto](doc//DeviceInfoResponseDto.md)
|
||||||
- [DeviceTypeEnum](doc//DeviceTypeEnum.md)
|
- [DeviceTypeEnum](doc//DeviceTypeEnum.md)
|
||||||
|
- [ExifEntity](doc//ExifEntity.md)
|
||||||
- [ExifResponseDto](doc//ExifResponseDto.md)
|
- [ExifResponseDto](doc//ExifResponseDto.md)
|
||||||
- [GetAssetByTimeBucketDto](doc//GetAssetByTimeBucketDto.md)
|
- [GetAssetByTimeBucketDto](doc//GetAssetByTimeBucketDto.md)
|
||||||
- [GetAssetCountByTimeBucketDto](doc//GetAssetCountByTimeBucketDto.md)
|
- [GetAssetCountByTimeBucketDto](doc//GetAssetCountByTimeBucketDto.md)
|
||||||
|
@ -175,18 +183,24 @@ Class | Method | HTTP request | Description
|
||||||
- [ServerStatsResponseDto](doc//ServerStatsResponseDto.md)
|
- [ServerStatsResponseDto](doc//ServerStatsResponseDto.md)
|
||||||
- [ServerVersionReponseDto](doc//ServerVersionReponseDto.md)
|
- [ServerVersionReponseDto](doc//ServerVersionReponseDto.md)
|
||||||
- [SignUpDto](doc//SignUpDto.md)
|
- [SignUpDto](doc//SignUpDto.md)
|
||||||
|
- [SmartInfoEntity](doc//SmartInfoEntity.md)
|
||||||
- [SmartInfoResponseDto](doc//SmartInfoResponseDto.md)
|
- [SmartInfoResponseDto](doc//SmartInfoResponseDto.md)
|
||||||
- [SystemConfigKey](doc//SystemConfigKey.md)
|
- [SystemConfigKey](doc//SystemConfigKey.md)
|
||||||
- [SystemConfigResponseDto](doc//SystemConfigResponseDto.md)
|
- [SystemConfigResponseDto](doc//SystemConfigResponseDto.md)
|
||||||
- [SystemConfigResponseItem](doc//SystemConfigResponseItem.md)
|
- [SystemConfigResponseItem](doc//SystemConfigResponseItem.md)
|
||||||
|
- [TagEntity](doc//TagEntity.md)
|
||||||
|
- [TagResponseDto](doc//TagResponseDto.md)
|
||||||
|
- [TagTypeEnum](doc//TagTypeEnum.md)
|
||||||
- [ThumbnailFormat](doc//ThumbnailFormat.md)
|
- [ThumbnailFormat](doc//ThumbnailFormat.md)
|
||||||
- [TimeGroupEnum](doc//TimeGroupEnum.md)
|
- [TimeGroupEnum](doc//TimeGroupEnum.md)
|
||||||
- [UpdateAlbumDto](doc//UpdateAlbumDto.md)
|
- [UpdateAlbumDto](doc//UpdateAlbumDto.md)
|
||||||
- [UpdateAssetDto](doc//UpdateAssetDto.md)
|
- [UpdateAssetDto](doc//UpdateAssetDto.md)
|
||||||
- [UpdateDeviceInfoDto](doc//UpdateDeviceInfoDto.md)
|
- [UpdateDeviceInfoDto](doc//UpdateDeviceInfoDto.md)
|
||||||
|
- [UpdateTagDto](doc//UpdateTagDto.md)
|
||||||
- [UpdateUserDto](doc//UpdateUserDto.md)
|
- [UpdateUserDto](doc//UpdateUserDto.md)
|
||||||
- [UsageByUserDto](doc//UsageByUserDto.md)
|
- [UsageByUserDto](doc//UsageByUserDto.md)
|
||||||
- [UserCountResponseDto](doc//UserCountResponseDto.md)
|
- [UserCountResponseDto](doc//UserCountResponseDto.md)
|
||||||
|
- [UserEntity](doc//UserEntity.md)
|
||||||
- [UserResponseDto](doc//UserResponseDto.md)
|
- [UserResponseDto](doc//UserResponseDto.md)
|
||||||
- [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md)
|
- [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md)
|
||||||
|
|
||||||
|
|
10
mobile/openapi/doc/AssetApi.md
generated
10
mobile/openapi/doc/AssetApi.md
generated
|
@ -26,7 +26,7 @@ Method | HTTP request | Description
|
||||||
[**getUserAssetsByDeviceId**](AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} |
|
[**getUserAssetsByDeviceId**](AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} |
|
||||||
[**searchAsset**](AssetApi.md#searchasset) | **POST** /asset/search |
|
[**searchAsset**](AssetApi.md#searchasset) | **POST** /asset/search |
|
||||||
[**serveFile**](AssetApi.md#servefile) | **GET** /asset/file/{assetId} |
|
[**serveFile**](AssetApi.md#servefile) | **GET** /asset/file/{assetId} |
|
||||||
[**updateAssetById**](AssetApi.md#updateassetbyid) | **PUT** /asset/assetById/{assetId} |
|
[**updateAsset**](AssetApi.md#updateasset) | **PUT** /asset/{assetId} |
|
||||||
[**uploadFile**](AssetApi.md#uploadfile) | **POST** /asset/upload |
|
[**uploadFile**](AssetApi.md#uploadfile) | **POST** /asset/upload |
|
||||||
|
|
||||||
|
|
||||||
|
@ -833,8 +833,8 @@ 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)
|
[[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)
|
||||||
|
|
||||||
# **updateAssetById**
|
# **updateAsset**
|
||||||
> AssetResponseDto updateAssetById(assetId, updateAssetDto)
|
> AssetResponseDto updateAsset(assetId, updateAssetDto)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -855,10 +855,10 @@ final assetId = assetId_example; // String |
|
||||||
final updateAssetDto = UpdateAssetDto(); // UpdateAssetDto |
|
final updateAssetDto = UpdateAssetDto(); // UpdateAssetDto |
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final result = api_instance.updateAssetById(assetId, updateAssetDto);
|
final result = api_instance.updateAsset(assetId, updateAssetDto);
|
||||||
print(result);
|
print(result);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Exception when calling AssetApi->updateAssetById: $e\n');
|
print('Exception when calling AssetApi->updateAsset: $e\n');
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
34
mobile/openapi/doc/AssetEntity.md
generated
Normal file
34
mobile/openapi/doc/AssetEntity.md
generated
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
# openapi.model.AssetEntity
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**deviceAssetId** | **String** | |
|
||||||
|
**userId** | **String** | |
|
||||||
|
**deviceId** | **String** | |
|
||||||
|
**type** | **String** | |
|
||||||
|
**originalPath** | **String** | |
|
||||||
|
**resizePath** | **String** | |
|
||||||
|
**webpPath** | **String** | |
|
||||||
|
**encodedVideoPath** | **String** | |
|
||||||
|
**createdAt** | **String** | |
|
||||||
|
**modifiedAt** | **String** | |
|
||||||
|
**isFavorite** | **bool** | |
|
||||||
|
**mimeType** | **String** | |
|
||||||
|
**checksum** | [**Object**](.md) | | [optional]
|
||||||
|
**duration** | **String** | |
|
||||||
|
**isVisible** | **bool** | |
|
||||||
|
**livePhotoVideoId** | **String** | |
|
||||||
|
**exifInfo** | [**ExifEntity**](ExifEntity.md) | | [optional]
|
||||||
|
**smartInfo** | [**SmartInfoEntity**](SmartInfoEntity.md) | | [optional]
|
||||||
|
**tags** | [**List<TagEntity>**](TagEntity.md) | | [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)
|
||||||
|
|
||||||
|
|
1
mobile/openapi/doc/AssetResponseDto.md
generated
1
mobile/openapi/doc/AssetResponseDto.md
generated
|
@ -25,6 +25,7 @@ Name | Type | Description | Notes
|
||||||
**exifInfo** | [**ExifResponseDto**](ExifResponseDto.md) | | [optional]
|
**exifInfo** | [**ExifResponseDto**](ExifResponseDto.md) | | [optional]
|
||||||
**smartInfo** | [**SmartInfoResponseDto**](SmartInfoResponseDto.md) | | [optional]
|
**smartInfo** | [**SmartInfoResponseDto**](SmartInfoResponseDto.md) | | [optional]
|
||||||
**livePhotoVideoId** | **String** | | [optional]
|
**livePhotoVideoId** | **String** | | [optional]
|
||||||
|
**tags** | [**List<TagResponseDto>**](TagResponseDto.md) | | [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)
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
16
mobile/openapi/doc/CreateTagDto.md
generated
Normal file
16
mobile/openapi/doc/CreateTagDto.md
generated
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# openapi.model.CreateTagDto
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**type** | [**TagTypeEnum**](TagTypeEnum.md) | |
|
||||||
|
**name** | **String** | |
|
||||||
|
|
||||||
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
39
mobile/openapi/doc/ExifEntity.md
generated
Normal file
39
mobile/openapi/doc/ExifEntity.md
generated
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# openapi.model.ExifEntity
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**assetId** | **String** | |
|
||||||
|
**description** | **String** | General info |
|
||||||
|
**exifImageWidth** | **num** | |
|
||||||
|
**exifImageHeight** | **num** | |
|
||||||
|
**fileSizeInByte** | **num** | |
|
||||||
|
**orientation** | **String** | |
|
||||||
|
**dateTimeOriginal** | [**DateTime**](DateTime.md) | |
|
||||||
|
**modifyDate** | [**DateTime**](DateTime.md) | |
|
||||||
|
**latitude** | **num** | |
|
||||||
|
**longitude** | **num** | |
|
||||||
|
**city** | **String** | |
|
||||||
|
**state** | **String** | |
|
||||||
|
**country** | **String** | |
|
||||||
|
**make** | **String** | Image info |
|
||||||
|
**model** | **String** | |
|
||||||
|
**imageName** | **String** | |
|
||||||
|
**lensModel** | **String** | |
|
||||||
|
**fNumber** | **num** | |
|
||||||
|
**focalLength** | **num** | |
|
||||||
|
**iso** | **num** | |
|
||||||
|
**exposureTime** | **num** | |
|
||||||
|
**fps** | **num** | Video info | [optional]
|
||||||
|
**asset** | [**AssetEntity**](AssetEntity.md) | | [optional]
|
||||||
|
**exifTextSearchableColumn** | **String** | |
|
||||||
|
|
||||||
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
19
mobile/openapi/doc/SmartInfoEntity.md
generated
Normal file
19
mobile/openapi/doc/SmartInfoEntity.md
generated
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# openapi.model.SmartInfoEntity
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**assetId** | **String** | |
|
||||||
|
**tags** | **List<String>** | | [default to const []]
|
||||||
|
**objects** | **List<String>** | | [default to const []]
|
||||||
|
**asset** | [**AssetEntity**](AssetEntity.md) | | [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)
|
||||||
|
|
||||||
|
|
221
mobile/openapi/doc/TagApi.md
generated
Normal file
221
mobile/openapi/doc/TagApi.md
generated
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
# openapi.api.TagApi
|
||||||
|
|
||||||
|
## Load the API package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
All URIs are relative to */api*
|
||||||
|
|
||||||
|
Method | HTTP request | Description
|
||||||
|
------------- | ------------- | -------------
|
||||||
|
[**create**](TagApi.md#create) | **POST** /tag |
|
||||||
|
[**delete**](TagApi.md#delete) | **DELETE** /tag/{id} |
|
||||||
|
[**findAll**](TagApi.md#findall) | **GET** /tag |
|
||||||
|
[**findOne**](TagApi.md#findone) | **GET** /tag/{id} |
|
||||||
|
[**update**](TagApi.md#update) | **PATCH** /tag/{id} |
|
||||||
|
|
||||||
|
|
||||||
|
# **create**
|
||||||
|
> TagEntity create(createTagDto)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final api_instance = TagApi();
|
||||||
|
final createTagDto = CreateTagDto(); // CreateTagDto |
|
||||||
|
|
||||||
|
try {
|
||||||
|
final result = api_instance.create(createTagDto);
|
||||||
|
print(result);
|
||||||
|
} catch (e) {
|
||||||
|
print('Exception when calling TagApi->create: $e\n');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------- | ------------- | ------------- | -------------
|
||||||
|
**createTagDto** | [**CreateTagDto**](CreateTagDto.md)| |
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
[**TagEntity**](TagEntity.md)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### 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)
|
||||||
|
|
||||||
|
# **delete**
|
||||||
|
> TagEntity delete(id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final api_instance = TagApi();
|
||||||
|
final id = id_example; // String |
|
||||||
|
|
||||||
|
try {
|
||||||
|
final result = api_instance.delete(id);
|
||||||
|
print(result);
|
||||||
|
} catch (e) {
|
||||||
|
print('Exception when calling TagApi->delete: $e\n');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------- | ------------- | ------------- | -------------
|
||||||
|
**id** | **String**| |
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
[**TagEntity**](TagEntity.md)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### HTTP request headers
|
||||||
|
|
||||||
|
- **Content-Type**: Not defined
|
||||||
|
- **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)
|
||||||
|
|
||||||
|
# **findAll**
|
||||||
|
> List<TagEntity> findAll()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final api_instance = TagApi();
|
||||||
|
|
||||||
|
try {
|
||||||
|
final result = api_instance.findAll();
|
||||||
|
print(result);
|
||||||
|
} catch (e) {
|
||||||
|
print('Exception when calling TagApi->findAll: $e\n');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
This endpoint does not need any parameter.
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
[**List<TagEntity>**](TagEntity.md)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### HTTP request headers
|
||||||
|
|
||||||
|
- **Content-Type**: Not defined
|
||||||
|
- **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)
|
||||||
|
|
||||||
|
# **findOne**
|
||||||
|
> TagEntity findOne(id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final api_instance = TagApi();
|
||||||
|
final id = id_example; // String |
|
||||||
|
|
||||||
|
try {
|
||||||
|
final result = api_instance.findOne(id);
|
||||||
|
print(result);
|
||||||
|
} catch (e) {
|
||||||
|
print('Exception when calling TagApi->findOne: $e\n');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------- | ------------- | ------------- | -------------
|
||||||
|
**id** | **String**| |
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
[**TagEntity**](TagEntity.md)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### HTTP request headers
|
||||||
|
|
||||||
|
- **Content-Type**: Not defined
|
||||||
|
- **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)
|
||||||
|
|
||||||
|
# **update**
|
||||||
|
> Object update(id, updateTagDto)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final api_instance = TagApi();
|
||||||
|
final id = id_example; // String |
|
||||||
|
final updateTagDto = UpdateTagDto(); // UpdateTagDto |
|
||||||
|
|
||||||
|
try {
|
||||||
|
final result = api_instance.update(id, updateTagDto);
|
||||||
|
print(result);
|
||||||
|
} catch (e) {
|
||||||
|
print('Exception when calling TagApi->update: $e\n');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------- | ------------- | ------------- | -------------
|
||||||
|
**id** | **String**| |
|
||||||
|
**updateTagDto** | [**UpdateTagDto**](UpdateTagDto.md)| |
|
||||||
|
|
||||||
|
### Return type
|
||||||
|
|
||||||
|
[**Object**](Object.md)
|
||||||
|
|
||||||
|
### Authorization
|
||||||
|
|
||||||
|
No authorization required
|
||||||
|
|
||||||
|
### 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)
|
||||||
|
|
21
mobile/openapi/doc/TagEntity.md
generated
Normal file
21
mobile/openapi/doc/TagEntity.md
generated
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# openapi.model.TagEntity
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**type** | **String** | |
|
||||||
|
**name** | **String** | |
|
||||||
|
**userId** | **String** | |
|
||||||
|
**renameTagId** | **String** | |
|
||||||
|
**assets** | [**List<AssetEntity>**](AssetEntity.md) | | [default to const []]
|
||||||
|
**user** | [**UserEntity**](UserEntity.md) | |
|
||||||
|
|
||||||
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
17
mobile/openapi/doc/TagResponseDto.md
generated
Normal file
17
mobile/openapi/doc/TagResponseDto.md
generated
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# openapi.model.TagResponseDto
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**type** | [**TagTypeEnum**](TagTypeEnum.md) | |
|
||||||
|
**name** | **String** | |
|
||||||
|
|
||||||
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
14
mobile/openapi/doc/TagTypeEnum.md
generated
Normal file
14
mobile/openapi/doc/TagTypeEnum.md
generated
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# openapi.model.TagTypeEnum
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
|
||||||
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
3
mobile/openapi/doc/UpdateAssetDto.md
generated
3
mobile/openapi/doc/UpdateAssetDto.md
generated
|
@ -8,7 +8,8 @@ import 'package:openapi/api.dart';
|
||||||
## Properties
|
## Properties
|
||||||
Name | Type | Description | Notes
|
Name | Type | Description | Notes
|
||||||
------------ | ------------- | ------------- | -------------
|
------------ | ------------- | ------------- | -------------
|
||||||
**isFavorite** | **bool** | |
|
**tagIds** | **List<String>** | | [optional] [default to const []]
|
||||||
|
**isFavorite** | **bool** | | [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)
|
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
|
||||||
|
|
||||||
|
|
16
mobile/openapi/doc/UpdateTagDto.md
generated
Normal file
16
mobile/openapi/doc/UpdateTagDto.md
generated
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# openapi.model.UpdateTagDto
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**name** | **String** | | [optional]
|
||||||
|
**renameTagId** | **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)
|
||||||
|
|
||||||
|
|
27
mobile/openapi/doc/UserEntity.md
generated
Normal file
27
mobile/openapi/doc/UserEntity.md
generated
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# openapi.model.UserEntity
|
||||||
|
|
||||||
|
## Load the model package
|
||||||
|
```dart
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
Name | Type | Description | Notes
|
||||||
|
------------ | ------------- | ------------- | -------------
|
||||||
|
**id** | **String** | |
|
||||||
|
**firstName** | **String** | |
|
||||||
|
**lastName** | **String** | |
|
||||||
|
**isAdmin** | **bool** | |
|
||||||
|
**email** | **String** | |
|
||||||
|
**password** | **String** | | [optional]
|
||||||
|
**salt** | **String** | | [optional]
|
||||||
|
**oauthId** | **String** | |
|
||||||
|
**profileImagePath** | **String** | |
|
||||||
|
**shouldChangePassword** | **bool** | |
|
||||||
|
**createdAt** | **String** | |
|
||||||
|
**deletedAt** | [**DateTime**](DateTime.md) | | [optional]
|
||||||
|
**tags** | [**List<TagEntity>**](TagEntity.md) | | [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)
|
||||||
|
|
||||||
|
|
10
mobile/openapi/lib/api.dart
generated
10
mobile/openapi/lib/api.dart
generated
|
@ -35,6 +35,7 @@ part 'api/job_api.dart';
|
||||||
part 'api/o_auth_api.dart';
|
part 'api/o_auth_api.dart';
|
||||||
part 'api/server_info_api.dart';
|
part 'api/server_info_api.dart';
|
||||||
part 'api/system_config_api.dart';
|
part 'api/system_config_api.dart';
|
||||||
|
part 'api/tag_api.dart';
|
||||||
part 'api/user_api.dart';
|
part 'api/user_api.dart';
|
||||||
|
|
||||||
part 'model/add_assets_dto.dart';
|
part 'model/add_assets_dto.dart';
|
||||||
|
@ -47,6 +48,7 @@ part 'model/all_job_status_response_dto.dart';
|
||||||
part 'model/asset_count_by_time_bucket.dart';
|
part 'model/asset_count_by_time_bucket.dart';
|
||||||
part 'model/asset_count_by_time_bucket_response_dto.dart';
|
part 'model/asset_count_by_time_bucket_response_dto.dart';
|
||||||
part 'model/asset_count_by_user_id_response_dto.dart';
|
part 'model/asset_count_by_user_id_response_dto.dart';
|
||||||
|
part 'model/asset_entity.dart';
|
||||||
part 'model/asset_file_upload_response_dto.dart';
|
part 'model/asset_file_upload_response_dto.dart';
|
||||||
part 'model/asset_response_dto.dart';
|
part 'model/asset_response_dto.dart';
|
||||||
part 'model/asset_type_enum.dart';
|
part 'model/asset_type_enum.dart';
|
||||||
|
@ -57,6 +59,7 @@ part 'model/check_existing_assets_response_dto.dart';
|
||||||
part 'model/create_album_dto.dart';
|
part 'model/create_album_dto.dart';
|
||||||
part 'model/create_device_info_dto.dart';
|
part 'model/create_device_info_dto.dart';
|
||||||
part 'model/create_profile_image_response_dto.dart';
|
part 'model/create_profile_image_response_dto.dart';
|
||||||
|
part 'model/create_tag_dto.dart';
|
||||||
part 'model/create_user_dto.dart';
|
part 'model/create_user_dto.dart';
|
||||||
part 'model/curated_locations_response_dto.dart';
|
part 'model/curated_locations_response_dto.dart';
|
||||||
part 'model/curated_objects_response_dto.dart';
|
part 'model/curated_objects_response_dto.dart';
|
||||||
|
@ -65,6 +68,7 @@ part 'model/delete_asset_response_dto.dart';
|
||||||
part 'model/delete_asset_status.dart';
|
part 'model/delete_asset_status.dart';
|
||||||
part 'model/device_info_response_dto.dart';
|
part 'model/device_info_response_dto.dart';
|
||||||
part 'model/device_type_enum.dart';
|
part 'model/device_type_enum.dart';
|
||||||
|
part 'model/exif_entity.dart';
|
||||||
part 'model/exif_response_dto.dart';
|
part 'model/exif_response_dto.dart';
|
||||||
part 'model/get_asset_by_time_bucket_dto.dart';
|
part 'model/get_asset_by_time_bucket_dto.dart';
|
||||||
part 'model/get_asset_count_by_time_bucket_dto.dart';
|
part 'model/get_asset_count_by_time_bucket_dto.dart';
|
||||||
|
@ -86,18 +90,24 @@ part 'model/server_ping_response.dart';
|
||||||
part 'model/server_stats_response_dto.dart';
|
part 'model/server_stats_response_dto.dart';
|
||||||
part 'model/server_version_reponse_dto.dart';
|
part 'model/server_version_reponse_dto.dart';
|
||||||
part 'model/sign_up_dto.dart';
|
part 'model/sign_up_dto.dart';
|
||||||
|
part 'model/smart_info_entity.dart';
|
||||||
part 'model/smart_info_response_dto.dart';
|
part 'model/smart_info_response_dto.dart';
|
||||||
part 'model/system_config_key.dart';
|
part 'model/system_config_key.dart';
|
||||||
part 'model/system_config_response_dto.dart';
|
part 'model/system_config_response_dto.dart';
|
||||||
part 'model/system_config_response_item.dart';
|
part 'model/system_config_response_item.dart';
|
||||||
|
part 'model/tag_entity.dart';
|
||||||
|
part 'model/tag_response_dto.dart';
|
||||||
|
part 'model/tag_type_enum.dart';
|
||||||
part 'model/thumbnail_format.dart';
|
part 'model/thumbnail_format.dart';
|
||||||
part 'model/time_group_enum.dart';
|
part 'model/time_group_enum.dart';
|
||||||
part 'model/update_album_dto.dart';
|
part 'model/update_album_dto.dart';
|
||||||
part 'model/update_asset_dto.dart';
|
part 'model/update_asset_dto.dart';
|
||||||
part 'model/update_device_info_dto.dart';
|
part 'model/update_device_info_dto.dart';
|
||||||
|
part 'model/update_tag_dto.dart';
|
||||||
part 'model/update_user_dto.dart';
|
part 'model/update_user_dto.dart';
|
||||||
part 'model/usage_by_user_dto.dart';
|
part 'model/usage_by_user_dto.dart';
|
||||||
part 'model/user_count_response_dto.dart';
|
part 'model/user_count_response_dto.dart';
|
||||||
|
part 'model/user_entity.dart';
|
||||||
part 'model/user_response_dto.dart';
|
part 'model/user_response_dto.dart';
|
||||||
part 'model/validate_access_token_response_dto.dart';
|
part 'model/validate_access_token_response_dto.dart';
|
||||||
|
|
||||||
|
|
8
mobile/openapi/lib/api/asset_api.dart
generated
8
mobile/openapi/lib/api/asset_api.dart
generated
|
@ -924,9 +924,9 @@ class AssetApi {
|
||||||
/// * [String] assetId (required):
|
/// * [String] assetId (required):
|
||||||
///
|
///
|
||||||
/// * [UpdateAssetDto] updateAssetDto (required):
|
/// * [UpdateAssetDto] updateAssetDto (required):
|
||||||
Future<Response> updateAssetByIdWithHttpInfo(String assetId, UpdateAssetDto updateAssetDto,) async {
|
Future<Response> updateAssetWithHttpInfo(String assetId, UpdateAssetDto updateAssetDto,) async {
|
||||||
// ignore: prefer_const_declarations
|
// ignore: prefer_const_declarations
|
||||||
final path = r'/asset/assetById/{assetId}'
|
final path = r'/asset/{assetId}'
|
||||||
.replaceAll('{assetId}', assetId);
|
.replaceAll('{assetId}', assetId);
|
||||||
|
|
||||||
// ignore: prefer_final_locals
|
// ignore: prefer_final_locals
|
||||||
|
@ -959,8 +959,8 @@ class AssetApi {
|
||||||
/// * [String] assetId (required):
|
/// * [String] assetId (required):
|
||||||
///
|
///
|
||||||
/// * [UpdateAssetDto] updateAssetDto (required):
|
/// * [UpdateAssetDto] updateAssetDto (required):
|
||||||
Future<AssetResponseDto?> updateAssetById(String assetId, UpdateAssetDto updateAssetDto,) async {
|
Future<AssetResponseDto?> updateAsset(String assetId, UpdateAssetDto updateAssetDto,) async {
|
||||||
final response = await updateAssetByIdWithHttpInfo(assetId, updateAssetDto,);
|
final response = await updateAssetWithHttpInfo(assetId, updateAssetDto,);
|
||||||
if (response.statusCode >= HttpStatus.badRequest) {
|
if (response.statusCode >= HttpStatus.badRequest) {
|
||||||
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
|
||||||
}
|
}
|
||||||
|
|
257
mobile/openapi/lib/api/tag_api.dart
generated
Normal file
257
mobile/openapi/lib/api/tag_api.dart
generated
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
//
|
||||||
|
// 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 TagApi {
|
||||||
|
TagApi([ApiClient? apiClient]) : apiClient = apiClient ?? defaultApiClient;
|
||||||
|
|
||||||
|
final ApiClient apiClient;
|
||||||
|
|
||||||
|
/// Performs an HTTP 'POST /tag' operation and returns the [Response].
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [CreateTagDto] createTagDto (required):
|
||||||
|
Future<Response> createWithHttpInfo(CreateTagDto createTagDto,) async {
|
||||||
|
// ignore: prefer_const_declarations
|
||||||
|
final path = r'/tag';
|
||||||
|
|
||||||
|
// ignore: prefer_final_locals
|
||||||
|
Object? postBody = createTagDto;
|
||||||
|
|
||||||
|
final queryParams = <QueryParam>[];
|
||||||
|
final headerParams = <String, String>{};
|
||||||
|
final formParams = <String, String>{};
|
||||||
|
|
||||||
|
const contentTypes = <String>['application/json'];
|
||||||
|
|
||||||
|
|
||||||
|
return apiClient.invokeAPI(
|
||||||
|
path,
|
||||||
|
'POST',
|
||||||
|
queryParams,
|
||||||
|
postBody,
|
||||||
|
headerParams,
|
||||||
|
formParams,
|
||||||
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [CreateTagDto] createTagDto (required):
|
||||||
|
Future<TagEntity?> create(CreateTagDto createTagDto,) async {
|
||||||
|
final response = await createWithHttpInfo(createTagDto,);
|
||||||
|
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), 'TagEntity',) as TagEntity;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Performs an HTTP 'DELETE /tag/{id}' operation and returns the [Response].
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
Future<Response> deleteWithHttpInfo(String id,) async {
|
||||||
|
// ignore: prefer_const_declarations
|
||||||
|
final path = r'/tag/{id}'
|
||||||
|
.replaceAll('{id}', id);
|
||||||
|
|
||||||
|
// ignore: prefer_final_locals
|
||||||
|
Object? postBody;
|
||||||
|
|
||||||
|
final queryParams = <QueryParam>[];
|
||||||
|
final headerParams = <String, String>{};
|
||||||
|
final formParams = <String, String>{};
|
||||||
|
|
||||||
|
const contentTypes = <String>[];
|
||||||
|
|
||||||
|
|
||||||
|
return apiClient.invokeAPI(
|
||||||
|
path,
|
||||||
|
'DELETE',
|
||||||
|
queryParams,
|
||||||
|
postBody,
|
||||||
|
headerParams,
|
||||||
|
formParams,
|
||||||
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
Future<TagEntity?> delete(String id,) async {
|
||||||
|
final response = await deleteWithHttpInfo(id,);
|
||||||
|
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), 'TagEntity',) as TagEntity;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Performs an HTTP 'GET /tag' operation and returns the [Response].
|
||||||
|
Future<Response> findAllWithHttpInfo() async {
|
||||||
|
// ignore: prefer_const_declarations
|
||||||
|
final path = r'/tag';
|
||||||
|
|
||||||
|
// ignore: prefer_final_locals
|
||||||
|
Object? postBody;
|
||||||
|
|
||||||
|
final queryParams = <QueryParam>[];
|
||||||
|
final headerParams = <String, String>{};
|
||||||
|
final formParams = <String, String>{};
|
||||||
|
|
||||||
|
const contentTypes = <String>[];
|
||||||
|
|
||||||
|
|
||||||
|
return apiClient.invokeAPI(
|
||||||
|
path,
|
||||||
|
'GET',
|
||||||
|
queryParams,
|
||||||
|
postBody,
|
||||||
|
headerParams,
|
||||||
|
formParams,
|
||||||
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<TagEntity>?> findAll() async {
|
||||||
|
final response = await findAllWithHttpInfo();
|
||||||
|
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) {
|
||||||
|
final responseBody = await _decodeBodyBytes(response);
|
||||||
|
return (await apiClient.deserializeAsync(responseBody, 'List<TagEntity>') as List)
|
||||||
|
.cast<TagEntity>()
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Performs an HTTP 'GET /tag/{id}' operation and returns the [Response].
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
Future<Response> findOneWithHttpInfo(String id,) async {
|
||||||
|
// ignore: prefer_const_declarations
|
||||||
|
final path = r'/tag/{id}'
|
||||||
|
.replaceAll('{id}', id);
|
||||||
|
|
||||||
|
// ignore: prefer_final_locals
|
||||||
|
Object? postBody;
|
||||||
|
|
||||||
|
final queryParams = <QueryParam>[];
|
||||||
|
final headerParams = <String, String>{};
|
||||||
|
final formParams = <String, String>{};
|
||||||
|
|
||||||
|
const contentTypes = <String>[];
|
||||||
|
|
||||||
|
|
||||||
|
return apiClient.invokeAPI(
|
||||||
|
path,
|
||||||
|
'GET',
|
||||||
|
queryParams,
|
||||||
|
postBody,
|
||||||
|
headerParams,
|
||||||
|
formParams,
|
||||||
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
Future<TagEntity?> findOne(String id,) async {
|
||||||
|
final response = await findOneWithHttpInfo(id,);
|
||||||
|
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), 'TagEntity',) as TagEntity;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Performs an HTTP 'PATCH /tag/{id}' operation and returns the [Response].
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
///
|
||||||
|
/// * [UpdateTagDto] updateTagDto (required):
|
||||||
|
Future<Response> updateWithHttpInfo(String id, UpdateTagDto updateTagDto,) async {
|
||||||
|
// ignore: prefer_const_declarations
|
||||||
|
final path = r'/tag/{id}'
|
||||||
|
.replaceAll('{id}', id);
|
||||||
|
|
||||||
|
// ignore: prefer_final_locals
|
||||||
|
Object? postBody = updateTagDto;
|
||||||
|
|
||||||
|
final queryParams = <QueryParam>[];
|
||||||
|
final headerParams = <String, String>{};
|
||||||
|
final formParams = <String, String>{};
|
||||||
|
|
||||||
|
const contentTypes = <String>['application/json'];
|
||||||
|
|
||||||
|
|
||||||
|
return apiClient.invokeAPI(
|
||||||
|
path,
|
||||||
|
'PATCH',
|
||||||
|
queryParams,
|
||||||
|
postBody,
|
||||||
|
headerParams,
|
||||||
|
formParams,
|
||||||
|
contentTypes.isEmpty ? null : contentTypes.first,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parameters:
|
||||||
|
///
|
||||||
|
/// * [String] id (required):
|
||||||
|
///
|
||||||
|
/// * [UpdateTagDto] updateTagDto (required):
|
||||||
|
Future<Object?> update(String id, UpdateTagDto updateTagDto,) async {
|
||||||
|
final response = await updateWithHttpInfo(id, updateTagDto,);
|
||||||
|
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), 'Object',) as Object;
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
18
mobile/openapi/lib/api_client.dart
generated
18
mobile/openapi/lib/api_client.dart
generated
|
@ -212,6 +212,8 @@ class ApiClient {
|
||||||
return AssetCountByTimeBucketResponseDto.fromJson(value);
|
return AssetCountByTimeBucketResponseDto.fromJson(value);
|
||||||
case 'AssetCountByUserIdResponseDto':
|
case 'AssetCountByUserIdResponseDto':
|
||||||
return AssetCountByUserIdResponseDto.fromJson(value);
|
return AssetCountByUserIdResponseDto.fromJson(value);
|
||||||
|
case 'AssetEntity':
|
||||||
|
return AssetEntity.fromJson(value);
|
||||||
case 'AssetFileUploadResponseDto':
|
case 'AssetFileUploadResponseDto':
|
||||||
return AssetFileUploadResponseDto.fromJson(value);
|
return AssetFileUploadResponseDto.fromJson(value);
|
||||||
case 'AssetResponseDto':
|
case 'AssetResponseDto':
|
||||||
|
@ -232,6 +234,8 @@ class ApiClient {
|
||||||
return CreateDeviceInfoDto.fromJson(value);
|
return CreateDeviceInfoDto.fromJson(value);
|
||||||
case 'CreateProfileImageResponseDto':
|
case 'CreateProfileImageResponseDto':
|
||||||
return CreateProfileImageResponseDto.fromJson(value);
|
return CreateProfileImageResponseDto.fromJson(value);
|
||||||
|
case 'CreateTagDto':
|
||||||
|
return CreateTagDto.fromJson(value);
|
||||||
case 'CreateUserDto':
|
case 'CreateUserDto':
|
||||||
return CreateUserDto.fromJson(value);
|
return CreateUserDto.fromJson(value);
|
||||||
case 'CuratedLocationsResponseDto':
|
case 'CuratedLocationsResponseDto':
|
||||||
|
@ -248,6 +252,8 @@ class ApiClient {
|
||||||
return DeviceInfoResponseDto.fromJson(value);
|
return DeviceInfoResponseDto.fromJson(value);
|
||||||
case 'DeviceTypeEnum':
|
case 'DeviceTypeEnum':
|
||||||
return DeviceTypeEnumTypeTransformer().decode(value);
|
return DeviceTypeEnumTypeTransformer().decode(value);
|
||||||
|
case 'ExifEntity':
|
||||||
|
return ExifEntity.fromJson(value);
|
||||||
case 'ExifResponseDto':
|
case 'ExifResponseDto':
|
||||||
return ExifResponseDto.fromJson(value);
|
return ExifResponseDto.fromJson(value);
|
||||||
case 'GetAssetByTimeBucketDto':
|
case 'GetAssetByTimeBucketDto':
|
||||||
|
@ -290,6 +296,8 @@ class ApiClient {
|
||||||
return ServerVersionReponseDto.fromJson(value);
|
return ServerVersionReponseDto.fromJson(value);
|
||||||
case 'SignUpDto':
|
case 'SignUpDto':
|
||||||
return SignUpDto.fromJson(value);
|
return SignUpDto.fromJson(value);
|
||||||
|
case 'SmartInfoEntity':
|
||||||
|
return SmartInfoEntity.fromJson(value);
|
||||||
case 'SmartInfoResponseDto':
|
case 'SmartInfoResponseDto':
|
||||||
return SmartInfoResponseDto.fromJson(value);
|
return SmartInfoResponseDto.fromJson(value);
|
||||||
case 'SystemConfigKey':
|
case 'SystemConfigKey':
|
||||||
|
@ -298,6 +306,12 @@ class ApiClient {
|
||||||
return SystemConfigResponseDto.fromJson(value);
|
return SystemConfigResponseDto.fromJson(value);
|
||||||
case 'SystemConfigResponseItem':
|
case 'SystemConfigResponseItem':
|
||||||
return SystemConfigResponseItem.fromJson(value);
|
return SystemConfigResponseItem.fromJson(value);
|
||||||
|
case 'TagEntity':
|
||||||
|
return TagEntity.fromJson(value);
|
||||||
|
case 'TagResponseDto':
|
||||||
|
return TagResponseDto.fromJson(value);
|
||||||
|
case 'TagTypeEnum':
|
||||||
|
return TagTypeEnumTypeTransformer().decode(value);
|
||||||
case 'ThumbnailFormat':
|
case 'ThumbnailFormat':
|
||||||
return ThumbnailFormatTypeTransformer().decode(value);
|
return ThumbnailFormatTypeTransformer().decode(value);
|
||||||
case 'TimeGroupEnum':
|
case 'TimeGroupEnum':
|
||||||
|
@ -308,12 +322,16 @@ class ApiClient {
|
||||||
return UpdateAssetDto.fromJson(value);
|
return UpdateAssetDto.fromJson(value);
|
||||||
case 'UpdateDeviceInfoDto':
|
case 'UpdateDeviceInfoDto':
|
||||||
return UpdateDeviceInfoDto.fromJson(value);
|
return UpdateDeviceInfoDto.fromJson(value);
|
||||||
|
case 'UpdateTagDto':
|
||||||
|
return UpdateTagDto.fromJson(value);
|
||||||
case 'UpdateUserDto':
|
case 'UpdateUserDto':
|
||||||
return UpdateUserDto.fromJson(value);
|
return UpdateUserDto.fromJson(value);
|
||||||
case 'UsageByUserDto':
|
case 'UsageByUserDto':
|
||||||
return UsageByUserDto.fromJson(value);
|
return UsageByUserDto.fromJson(value);
|
||||||
case 'UserCountResponseDto':
|
case 'UserCountResponseDto':
|
||||||
return UserCountResponseDto.fromJson(value);
|
return UserCountResponseDto.fromJson(value);
|
||||||
|
case 'UserEntity':
|
||||||
|
return UserEntity.fromJson(value);
|
||||||
case 'UserResponseDto':
|
case 'UserResponseDto':
|
||||||
return UserResponseDto.fromJson(value);
|
return UserResponseDto.fromJson(value);
|
||||||
case 'ValidateAccessTokenResponseDto':
|
case 'ValidateAccessTokenResponseDto':
|
||||||
|
|
3
mobile/openapi/lib/api_helper.dart
generated
3
mobile/openapi/lib/api_helper.dart
generated
|
@ -73,6 +73,9 @@ String parameterToString(dynamic value) {
|
||||||
if (value is SystemConfigKey) {
|
if (value is SystemConfigKey) {
|
||||||
return SystemConfigKeyTypeTransformer().encode(value).toString();
|
return SystemConfigKeyTypeTransformer().encode(value).toString();
|
||||||
}
|
}
|
||||||
|
if (value is TagTypeEnum) {
|
||||||
|
return TagTypeEnumTypeTransformer().encode(value).toString();
|
||||||
|
}
|
||||||
if (value is ThumbnailFormat) {
|
if (value is ThumbnailFormat) {
|
||||||
return ThumbnailFormatTypeTransformer().encode(value).toString();
|
return ThumbnailFormatTypeTransformer().encode(value).toString();
|
||||||
}
|
}
|
||||||
|
|
40
mobile/openapi/lib/model/album_response_dto.dart
generated
40
mobile/openapi/lib/model/album_response_dto.dart
generated
|
@ -43,9 +43,7 @@ class AlbumResponseDto {
|
||||||
List<AssetResponseDto> assets;
|
List<AssetResponseDto> assets;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) => identical(this, other) || other is AlbumResponseDto &&
|
||||||
identical(this, other) ||
|
|
||||||
other is AlbumResponseDto &&
|
|
||||||
other.assetCount == assetCount &&
|
other.assetCount == assetCount &&
|
||||||
other.id == id &&
|
other.id == id &&
|
||||||
other.ownerId == ownerId &&
|
other.ownerId == ownerId &&
|
||||||
|
@ -70,8 +68,7 @@ class AlbumResponseDto {
|
||||||
(assets.hashCode);
|
(assets.hashCode);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() =>
|
String toString() => 'AlbumResponseDto[assetCount=$assetCount, id=$id, ownerId=$ownerId, albumName=$albumName, createdAt=$createdAt, albumThumbnailAssetId=$albumThumbnailAssetId, shared=$shared, sharedUsers=$sharedUsers, assets=$assets]';
|
||||||
'AlbumResponseDto[assetCount=$assetCount, id=$id, ownerId=$ownerId, albumName=$albumName, createdAt=$createdAt, albumThumbnailAssetId=$albumThumbnailAssetId, shared=$shared, sharedUsers=$sharedUsers, assets=$assets]';
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final _json = <String, dynamic>{};
|
final _json = <String, dynamic>{};
|
||||||
|
@ -101,13 +98,13 @@ class AlbumResponseDto {
|
||||||
// Ensure that the map contains the required keys.
|
// Ensure that the map contains the required keys.
|
||||||
// Note 1: the values aren't checked for validity beyond being non-null.
|
// Note 1: the values aren't checked for validity beyond being non-null.
|
||||||
// Note 2: this code is stripped in release mode!
|
// Note 2: this code is stripped in release mode!
|
||||||
// assert(() {
|
assert(() {
|
||||||
// requiredKeys.forEach((key) {
|
requiredKeys.forEach((key) {
|
||||||
// assert(json.containsKey(key), 'Required key "AlbumResponseDto[$key]" is missing from JSON.');
|
assert(json.containsKey(key), 'Required key "AlbumResponseDto[$key]" is missing from JSON.');
|
||||||
// assert(json[key] != null, 'Required key "AlbumResponseDto[$key]" has a null value in JSON.');
|
assert(json[key] != null, 'Required key "AlbumResponseDto[$key]" has a null value in JSON.');
|
||||||
// });
|
});
|
||||||
// return true;
|
return true;
|
||||||
// }());
|
}());
|
||||||
|
|
||||||
return AlbumResponseDto(
|
return AlbumResponseDto(
|
||||||
assetCount: mapValueOfType<int>(json, r'assetCount')!,
|
assetCount: mapValueOfType<int>(json, r'assetCount')!,
|
||||||
|
@ -115,8 +112,7 @@ class AlbumResponseDto {
|
||||||
ownerId: mapValueOfType<String>(json, r'ownerId')!,
|
ownerId: mapValueOfType<String>(json, r'ownerId')!,
|
||||||
albumName: mapValueOfType<String>(json, r'albumName')!,
|
albumName: mapValueOfType<String>(json, r'albumName')!,
|
||||||
createdAt: mapValueOfType<String>(json, r'createdAt')!,
|
createdAt: mapValueOfType<String>(json, r'createdAt')!,
|
||||||
albumThumbnailAssetId:
|
albumThumbnailAssetId: mapValueOfType<String>(json, r'albumThumbnailAssetId'),
|
||||||
mapValueOfType<String>(json, r'albumThumbnailAssetId'),
|
|
||||||
shared: mapValueOfType<bool>(json, r'shared')!,
|
shared: mapValueOfType<bool>(json, r'shared')!,
|
||||||
sharedUsers: UserResponseDto.listFromJson(json[r'sharedUsers'])!,
|
sharedUsers: UserResponseDto.listFromJson(json[r'sharedUsers'])!,
|
||||||
assets: AssetResponseDto.listFromJson(json[r'assets'])!,
|
assets: AssetResponseDto.listFromJson(json[r'assets'])!,
|
||||||
|
@ -125,10 +121,7 @@ class AlbumResponseDto {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static List<AlbumResponseDto>? listFromJson(
|
static List<AlbumResponseDto>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
dynamic json, {
|
|
||||||
bool growable = false,
|
|
||||||
}) {
|
|
||||||
final result = <AlbumResponseDto>[];
|
final result = <AlbumResponseDto>[];
|
||||||
if (json is List && json.isNotEmpty) {
|
if (json is List && json.isNotEmpty) {
|
||||||
for (final row in json) {
|
for (final row in json) {
|
||||||
|
@ -156,18 +149,12 @@ class AlbumResponseDto {
|
||||||
}
|
}
|
||||||
|
|
||||||
// maps a json object with a list of AlbumResponseDto-objects as value to a dart map
|
// maps a json object with a list of AlbumResponseDto-objects as value to a dart map
|
||||||
static Map<String, List<AlbumResponseDto>> mapListFromJson(
|
static Map<String, List<AlbumResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
dynamic json, {
|
|
||||||
bool growable = false,
|
|
||||||
}) {
|
|
||||||
final map = <String, List<AlbumResponseDto>>{};
|
final map = <String, List<AlbumResponseDto>>{};
|
||||||
if (json is Map && json.isNotEmpty) {
|
if (json is Map && json.isNotEmpty) {
|
||||||
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
for (final entry in json.entries) {
|
for (final entry in json.entries) {
|
||||||
final value = AlbumResponseDto.listFromJson(
|
final value = AlbumResponseDto.listFromJson(entry.value, growable: growable,);
|
||||||
entry.value,
|
|
||||||
growable: growable,
|
|
||||||
);
|
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
map[entry.key] = value;
|
map[entry.key] = value;
|
||||||
}
|
}
|
||||||
|
@ -189,3 +176,4 @@ class AlbumResponseDto {
|
||||||
'assets',
|
'assets',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
384
mobile/openapi/lib/model/asset_entity.dart
generated
Normal file
384
mobile/openapi/lib/model/asset_entity.dart
generated
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
//
|
||||||
|
// 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 AssetEntity {
|
||||||
|
/// Returns a new [AssetEntity] instance.
|
||||||
|
AssetEntity({
|
||||||
|
required this.id,
|
||||||
|
required this.deviceAssetId,
|
||||||
|
required this.userId,
|
||||||
|
required this.deviceId,
|
||||||
|
required this.type,
|
||||||
|
required this.originalPath,
|
||||||
|
required this.resizePath,
|
||||||
|
required this.webpPath,
|
||||||
|
required this.encodedVideoPath,
|
||||||
|
required this.createdAt,
|
||||||
|
required this.modifiedAt,
|
||||||
|
required this.isFavorite,
|
||||||
|
required this.mimeType,
|
||||||
|
this.checksum,
|
||||||
|
required this.duration,
|
||||||
|
required this.isVisible,
|
||||||
|
required this.livePhotoVideoId,
|
||||||
|
this.exifInfo,
|
||||||
|
this.smartInfo,
|
||||||
|
this.tags = const [],
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
String deviceAssetId;
|
||||||
|
|
||||||
|
String userId;
|
||||||
|
|
||||||
|
String deviceId;
|
||||||
|
|
||||||
|
AssetEntityTypeEnum type;
|
||||||
|
|
||||||
|
String originalPath;
|
||||||
|
|
||||||
|
String? resizePath;
|
||||||
|
|
||||||
|
String? webpPath;
|
||||||
|
|
||||||
|
String encodedVideoPath;
|
||||||
|
|
||||||
|
String createdAt;
|
||||||
|
|
||||||
|
String modifiedAt;
|
||||||
|
|
||||||
|
bool isFavorite;
|
||||||
|
|
||||||
|
String? mimeType;
|
||||||
|
|
||||||
|
Object? checksum;
|
||||||
|
|
||||||
|
String? duration;
|
||||||
|
|
||||||
|
bool isVisible;
|
||||||
|
|
||||||
|
String? livePhotoVideoId;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
ExifEntity? exifInfo;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
SmartInfoEntity? smartInfo;
|
||||||
|
|
||||||
|
List<TagEntity> tags;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is AssetEntity &&
|
||||||
|
other.id == id &&
|
||||||
|
other.deviceAssetId == deviceAssetId &&
|
||||||
|
other.userId == userId &&
|
||||||
|
other.deviceId == deviceId &&
|
||||||
|
other.type == type &&
|
||||||
|
other.originalPath == originalPath &&
|
||||||
|
other.resizePath == resizePath &&
|
||||||
|
other.webpPath == webpPath &&
|
||||||
|
other.encodedVideoPath == encodedVideoPath &&
|
||||||
|
other.createdAt == createdAt &&
|
||||||
|
other.modifiedAt == modifiedAt &&
|
||||||
|
other.isFavorite == isFavorite &&
|
||||||
|
other.mimeType == mimeType &&
|
||||||
|
other.checksum == checksum &&
|
||||||
|
other.duration == duration &&
|
||||||
|
other.isVisible == isVisible &&
|
||||||
|
other.livePhotoVideoId == livePhotoVideoId &&
|
||||||
|
other.exifInfo == exifInfo &&
|
||||||
|
other.smartInfo == smartInfo &&
|
||||||
|
other.tags == tags;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(deviceAssetId.hashCode) +
|
||||||
|
(userId.hashCode) +
|
||||||
|
(deviceId.hashCode) +
|
||||||
|
(type.hashCode) +
|
||||||
|
(originalPath.hashCode) +
|
||||||
|
(resizePath == null ? 0 : resizePath!.hashCode) +
|
||||||
|
(webpPath == null ? 0 : webpPath!.hashCode) +
|
||||||
|
(encodedVideoPath.hashCode) +
|
||||||
|
(createdAt.hashCode) +
|
||||||
|
(modifiedAt.hashCode) +
|
||||||
|
(isFavorite.hashCode) +
|
||||||
|
(mimeType == null ? 0 : mimeType!.hashCode) +
|
||||||
|
(checksum == null ? 0 : checksum!.hashCode) +
|
||||||
|
(duration == null ? 0 : duration!.hashCode) +
|
||||||
|
(isVisible.hashCode) +
|
||||||
|
(livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) +
|
||||||
|
(exifInfo == null ? 0 : exifInfo!.hashCode) +
|
||||||
|
(smartInfo == null ? 0 : smartInfo!.hashCode) +
|
||||||
|
(tags.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'AssetEntity[id=$id, deviceAssetId=$deviceAssetId, userId=$userId, deviceId=$deviceId, type=$type, originalPath=$originalPath, resizePath=$resizePath, webpPath=$webpPath, encodedVideoPath=$encodedVideoPath, createdAt=$createdAt, modifiedAt=$modifiedAt, isFavorite=$isFavorite, mimeType=$mimeType, checksum=$checksum, duration=$duration, isVisible=$isVisible, livePhotoVideoId=$livePhotoVideoId, exifInfo=$exifInfo, smartInfo=$smartInfo, tags=$tags]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'deviceAssetId'] = deviceAssetId;
|
||||||
|
_json[r'userId'] = userId;
|
||||||
|
_json[r'deviceId'] = deviceId;
|
||||||
|
_json[r'type'] = type;
|
||||||
|
_json[r'originalPath'] = originalPath;
|
||||||
|
if (resizePath != null) {
|
||||||
|
_json[r'resizePath'] = resizePath;
|
||||||
|
} else {
|
||||||
|
_json[r'resizePath'] = null;
|
||||||
|
}
|
||||||
|
if (webpPath != null) {
|
||||||
|
_json[r'webpPath'] = webpPath;
|
||||||
|
} else {
|
||||||
|
_json[r'webpPath'] = null;
|
||||||
|
}
|
||||||
|
_json[r'encodedVideoPath'] = encodedVideoPath;
|
||||||
|
_json[r'createdAt'] = createdAt;
|
||||||
|
_json[r'modifiedAt'] = modifiedAt;
|
||||||
|
_json[r'isFavorite'] = isFavorite;
|
||||||
|
if (mimeType != null) {
|
||||||
|
_json[r'mimeType'] = mimeType;
|
||||||
|
} else {
|
||||||
|
_json[r'mimeType'] = null;
|
||||||
|
}
|
||||||
|
if (checksum != null) {
|
||||||
|
_json[r'checksum'] = checksum;
|
||||||
|
} else {
|
||||||
|
_json[r'checksum'] = null;
|
||||||
|
}
|
||||||
|
if (duration != null) {
|
||||||
|
_json[r'duration'] = duration;
|
||||||
|
} else {
|
||||||
|
_json[r'duration'] = null;
|
||||||
|
}
|
||||||
|
_json[r'isVisible'] = isVisible;
|
||||||
|
if (livePhotoVideoId != null) {
|
||||||
|
_json[r'livePhotoVideoId'] = livePhotoVideoId;
|
||||||
|
} else {
|
||||||
|
_json[r'livePhotoVideoId'] = null;
|
||||||
|
}
|
||||||
|
if (exifInfo != null) {
|
||||||
|
_json[r'exifInfo'] = exifInfo;
|
||||||
|
} else {
|
||||||
|
_json[r'exifInfo'] = null;
|
||||||
|
}
|
||||||
|
if (smartInfo != null) {
|
||||||
|
_json[r'smartInfo'] = smartInfo;
|
||||||
|
} else {
|
||||||
|
_json[r'smartInfo'] = null;
|
||||||
|
}
|
||||||
|
_json[r'tags'] = tags;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [AssetEntity] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static AssetEntity? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "AssetEntity[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "AssetEntity[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return AssetEntity(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
deviceAssetId: mapValueOfType<String>(json, r'deviceAssetId')!,
|
||||||
|
userId: mapValueOfType<String>(json, r'userId')!,
|
||||||
|
deviceId: mapValueOfType<String>(json, r'deviceId')!,
|
||||||
|
type: AssetEntityTypeEnum.fromJson(json[r'type'])!,
|
||||||
|
originalPath: mapValueOfType<String>(json, r'originalPath')!,
|
||||||
|
resizePath: mapValueOfType<String>(json, r'resizePath'),
|
||||||
|
webpPath: mapValueOfType<String>(json, r'webpPath'),
|
||||||
|
encodedVideoPath: mapValueOfType<String>(json, r'encodedVideoPath')!,
|
||||||
|
createdAt: mapValueOfType<String>(json, r'createdAt')!,
|
||||||
|
modifiedAt: mapValueOfType<String>(json, r'modifiedAt')!,
|
||||||
|
isFavorite: mapValueOfType<bool>(json, r'isFavorite')!,
|
||||||
|
mimeType: mapValueOfType<String>(json, r'mimeType'),
|
||||||
|
checksum: mapValueOfType<Object>(json, r'checksum'),
|
||||||
|
duration: mapValueOfType<String>(json, r'duration'),
|
||||||
|
isVisible: mapValueOfType<bool>(json, r'isVisible')!,
|
||||||
|
livePhotoVideoId: mapValueOfType<String>(json, r'livePhotoVideoId'),
|
||||||
|
exifInfo: ExifEntity.fromJson(json[r'exifInfo']),
|
||||||
|
smartInfo: SmartInfoEntity.fromJson(json[r'smartInfo']),
|
||||||
|
tags: TagEntity.listFromJson(json[r'tags'])!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<AssetEntity>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <AssetEntity>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = AssetEntity.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, AssetEntity> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, AssetEntity>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = AssetEntity.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of AssetEntity-objects as value to a dart map
|
||||||
|
static Map<String, List<AssetEntity>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<AssetEntity>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = AssetEntity.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'deviceAssetId',
|
||||||
|
'userId',
|
||||||
|
'deviceId',
|
||||||
|
'type',
|
||||||
|
'originalPath',
|
||||||
|
'resizePath',
|
||||||
|
'webpPath',
|
||||||
|
'encodedVideoPath',
|
||||||
|
'createdAt',
|
||||||
|
'modifiedAt',
|
||||||
|
'isFavorite',
|
||||||
|
'mimeType',
|
||||||
|
'duration',
|
||||||
|
'isVisible',
|
||||||
|
'livePhotoVideoId',
|
||||||
|
'tags',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AssetEntityTypeEnum {
|
||||||
|
/// Instantiate a new enum with the provided [value].
|
||||||
|
const AssetEntityTypeEnum._(this.value);
|
||||||
|
|
||||||
|
/// The underlying value of this enum member.
|
||||||
|
final String value;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => value;
|
||||||
|
|
||||||
|
String toJson() => value;
|
||||||
|
|
||||||
|
static const IMAGE = AssetEntityTypeEnum._(r'IMAGE');
|
||||||
|
static const VIDEO = AssetEntityTypeEnum._(r'VIDEO');
|
||||||
|
static const AUDIO = AssetEntityTypeEnum._(r'AUDIO');
|
||||||
|
static const OTHER = AssetEntityTypeEnum._(r'OTHER');
|
||||||
|
|
||||||
|
/// List of all possible values in this [enum][AssetEntityTypeEnum].
|
||||||
|
static const values = <AssetEntityTypeEnum>[
|
||||||
|
IMAGE,
|
||||||
|
VIDEO,
|
||||||
|
AUDIO,
|
||||||
|
OTHER,
|
||||||
|
];
|
||||||
|
|
||||||
|
static AssetEntityTypeEnum? fromJson(dynamic value) => AssetEntityTypeEnumTypeTransformer().decode(value);
|
||||||
|
|
||||||
|
static List<AssetEntityTypeEnum>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <AssetEntityTypeEnum>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = AssetEntityTypeEnum.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transformation class that can [encode] an instance of [AssetEntityTypeEnum] to String,
|
||||||
|
/// and [decode] dynamic data back to [AssetEntityTypeEnum].
|
||||||
|
class AssetEntityTypeEnumTypeTransformer {
|
||||||
|
factory AssetEntityTypeEnumTypeTransformer() => _instance ??= const AssetEntityTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
const AssetEntityTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
String encode(AssetEntityTypeEnum data) => data.value;
|
||||||
|
|
||||||
|
/// Decodes a [dynamic value][data] to a AssetEntityTypeEnum.
|
||||||
|
///
|
||||||
|
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
|
||||||
|
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
|
||||||
|
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
|
||||||
|
///
|
||||||
|
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
||||||
|
/// and users are still using an old app with the old code.
|
||||||
|
AssetEntityTypeEnum? decode(dynamic data, {bool allowNull = true}) {
|
||||||
|
if (data != null) {
|
||||||
|
switch (data.toString()) {
|
||||||
|
case r'IMAGE': return AssetEntityTypeEnum.IMAGE;
|
||||||
|
case r'VIDEO': return AssetEntityTypeEnum.VIDEO;
|
||||||
|
case r'AUDIO': return AssetEntityTypeEnum.AUDIO;
|
||||||
|
case r'OTHER': return AssetEntityTypeEnum.OTHER;
|
||||||
|
default:
|
||||||
|
if (!allowNull) {
|
||||||
|
throw ArgumentError('Unknown enum value to decode: $data');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Singleton [AssetEntityTypeEnumTypeTransformer] instance.
|
||||||
|
static AssetEntityTypeEnumTypeTransformer? _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
14
mobile/openapi/lib/model/asset_response_dto.dart
generated
14
mobile/openapi/lib/model/asset_response_dto.dart
generated
|
@ -30,6 +30,7 @@ class AssetResponseDto {
|
||||||
this.exifInfo,
|
this.exifInfo,
|
||||||
this.smartInfo,
|
this.smartInfo,
|
||||||
this.livePhotoVideoId,
|
this.livePhotoVideoId,
|
||||||
|
this.tags = const [],
|
||||||
});
|
});
|
||||||
|
|
||||||
AssetTypeEnum type;
|
AssetTypeEnum type;
|
||||||
|
@ -78,6 +79,8 @@ class AssetResponseDto {
|
||||||
|
|
||||||
String? livePhotoVideoId;
|
String? livePhotoVideoId;
|
||||||
|
|
||||||
|
List<TagResponseDto> tags;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) => identical(this, other) || other is AssetResponseDto &&
|
bool operator ==(Object other) => identical(this, other) || other is AssetResponseDto &&
|
||||||
other.type == type &&
|
other.type == type &&
|
||||||
|
@ -96,7 +99,8 @@ class AssetResponseDto {
|
||||||
other.encodedVideoPath == encodedVideoPath &&
|
other.encodedVideoPath == encodedVideoPath &&
|
||||||
other.exifInfo == exifInfo &&
|
other.exifInfo == exifInfo &&
|
||||||
other.smartInfo == smartInfo &&
|
other.smartInfo == smartInfo &&
|
||||||
other.livePhotoVideoId == livePhotoVideoId;
|
other.livePhotoVideoId == livePhotoVideoId &&
|
||||||
|
other.tags == tags;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
|
@ -117,10 +121,11 @@ class AssetResponseDto {
|
||||||
(encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) +
|
(encodedVideoPath == null ? 0 : encodedVideoPath!.hashCode) +
|
||||||
(exifInfo == null ? 0 : exifInfo!.hashCode) +
|
(exifInfo == null ? 0 : exifInfo!.hashCode) +
|
||||||
(smartInfo == null ? 0 : smartInfo!.hashCode) +
|
(smartInfo == null ? 0 : smartInfo!.hashCode) +
|
||||||
(livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode);
|
(livePhotoVideoId == null ? 0 : livePhotoVideoId!.hashCode) +
|
||||||
|
(tags.hashCode);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => 'AssetResponseDto[type=$type, id=$id, deviceAssetId=$deviceAssetId, ownerId=$ownerId, deviceId=$deviceId, originalPath=$originalPath, resizePath=$resizePath, createdAt=$createdAt, modifiedAt=$modifiedAt, isFavorite=$isFavorite, mimeType=$mimeType, duration=$duration, webpPath=$webpPath, encodedVideoPath=$encodedVideoPath, exifInfo=$exifInfo, smartInfo=$smartInfo, livePhotoVideoId=$livePhotoVideoId]';
|
String toString() => 'AssetResponseDto[type=$type, id=$id, deviceAssetId=$deviceAssetId, ownerId=$ownerId, deviceId=$deviceId, originalPath=$originalPath, resizePath=$resizePath, createdAt=$createdAt, modifiedAt=$modifiedAt, isFavorite=$isFavorite, mimeType=$mimeType, duration=$duration, webpPath=$webpPath, encodedVideoPath=$encodedVideoPath, exifInfo=$exifInfo, smartInfo=$smartInfo, livePhotoVideoId=$livePhotoVideoId, tags=$tags]';
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final _json = <String, dynamic>{};
|
final _json = <String, dynamic>{};
|
||||||
|
@ -169,6 +174,7 @@ class AssetResponseDto {
|
||||||
} else {
|
} else {
|
||||||
_json[r'livePhotoVideoId'] = null;
|
_json[r'livePhotoVideoId'] = null;
|
||||||
}
|
}
|
||||||
|
_json[r'tags'] = tags;
|
||||||
return _json;
|
return _json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,6 +214,7 @@ class AssetResponseDto {
|
||||||
exifInfo: ExifResponseDto.fromJson(json[r'exifInfo']),
|
exifInfo: ExifResponseDto.fromJson(json[r'exifInfo']),
|
||||||
smartInfo: SmartInfoResponseDto.fromJson(json[r'smartInfo']),
|
smartInfo: SmartInfoResponseDto.fromJson(json[r'smartInfo']),
|
||||||
livePhotoVideoId: mapValueOfType<String>(json, r'livePhotoVideoId'),
|
livePhotoVideoId: mapValueOfType<String>(json, r'livePhotoVideoId'),
|
||||||
|
tags: TagResponseDto.listFromJson(json[r'tags'])!,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -270,6 +277,7 @@ class AssetResponseDto {
|
||||||
'mimeType',
|
'mimeType',
|
||||||
'duration',
|
'duration',
|
||||||
'webpPath',
|
'webpPath',
|
||||||
|
'tags',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
119
mobile/openapi/lib/model/create_tag_dto.dart
generated
Normal file
119
mobile/openapi/lib/model/create_tag_dto.dart
generated
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
//
|
||||||
|
// 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 CreateTagDto {
|
||||||
|
/// Returns a new [CreateTagDto] instance.
|
||||||
|
CreateTagDto({
|
||||||
|
required this.type,
|
||||||
|
required this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
TagTypeEnum type;
|
||||||
|
|
||||||
|
String name;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is CreateTagDto &&
|
||||||
|
other.type == type &&
|
||||||
|
other.name == name;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(type.hashCode) +
|
||||||
|
(name.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'CreateTagDto[type=$type, name=$name]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'type'] = type;
|
||||||
|
_json[r'name'] = name;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [CreateTagDto] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static CreateTagDto? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "CreateTagDto[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "CreateTagDto[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return CreateTagDto(
|
||||||
|
type: TagTypeEnum.fromJson(json[r'type'])!,
|
||||||
|
name: mapValueOfType<String>(json, r'name')!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<CreateTagDto>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <CreateTagDto>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = CreateTagDto.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, CreateTagDto> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, CreateTagDto>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = CreateTagDto.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of CreateTagDto-objects as value to a dart map
|
||||||
|
static Map<String, List<CreateTagDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<CreateTagDto>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = CreateTagDto.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 = <String>{
|
||||||
|
'type',
|
||||||
|
'name',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
414
mobile/openapi/lib/model/exif_entity.dart
generated
Normal file
414
mobile/openapi/lib/model/exif_entity.dart
generated
Normal file
|
@ -0,0 +1,414 @@
|
||||||
|
//
|
||||||
|
// 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 ExifEntity {
|
||||||
|
/// Returns a new [ExifEntity] instance.
|
||||||
|
ExifEntity({
|
||||||
|
required this.id,
|
||||||
|
required this.assetId,
|
||||||
|
required this.description,
|
||||||
|
required this.exifImageWidth,
|
||||||
|
required this.exifImageHeight,
|
||||||
|
required this.fileSizeInByte,
|
||||||
|
required this.orientation,
|
||||||
|
required this.dateTimeOriginal,
|
||||||
|
required this.modifyDate,
|
||||||
|
required this.latitude,
|
||||||
|
required this.longitude,
|
||||||
|
required this.city,
|
||||||
|
required this.state,
|
||||||
|
required this.country,
|
||||||
|
required this.make,
|
||||||
|
required this.model,
|
||||||
|
required this.imageName,
|
||||||
|
required this.lensModel,
|
||||||
|
required this.fNumber,
|
||||||
|
required this.focalLength,
|
||||||
|
required this.iso,
|
||||||
|
required this.exposureTime,
|
||||||
|
this.fps,
|
||||||
|
this.asset,
|
||||||
|
required this.exifTextSearchableColumn,
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
String assetId;
|
||||||
|
|
||||||
|
/// General info
|
||||||
|
String description;
|
||||||
|
|
||||||
|
num? exifImageWidth;
|
||||||
|
|
||||||
|
num? exifImageHeight;
|
||||||
|
|
||||||
|
num? fileSizeInByte;
|
||||||
|
|
||||||
|
String? orientation;
|
||||||
|
|
||||||
|
DateTime? dateTimeOriginal;
|
||||||
|
|
||||||
|
DateTime? modifyDate;
|
||||||
|
|
||||||
|
num? latitude;
|
||||||
|
|
||||||
|
num? longitude;
|
||||||
|
|
||||||
|
String? city;
|
||||||
|
|
||||||
|
String? state;
|
||||||
|
|
||||||
|
String? country;
|
||||||
|
|
||||||
|
/// Image info
|
||||||
|
String? make;
|
||||||
|
|
||||||
|
String? model;
|
||||||
|
|
||||||
|
String? imageName;
|
||||||
|
|
||||||
|
String? lensModel;
|
||||||
|
|
||||||
|
num? fNumber;
|
||||||
|
|
||||||
|
num? focalLength;
|
||||||
|
|
||||||
|
num? iso;
|
||||||
|
|
||||||
|
num? exposureTime;
|
||||||
|
|
||||||
|
/// Video info
|
||||||
|
num? fps;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
AssetEntity? asset;
|
||||||
|
|
||||||
|
String exifTextSearchableColumn;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is ExifEntity &&
|
||||||
|
other.id == id &&
|
||||||
|
other.assetId == assetId &&
|
||||||
|
other.description == description &&
|
||||||
|
other.exifImageWidth == exifImageWidth &&
|
||||||
|
other.exifImageHeight == exifImageHeight &&
|
||||||
|
other.fileSizeInByte == fileSizeInByte &&
|
||||||
|
other.orientation == orientation &&
|
||||||
|
other.dateTimeOriginal == dateTimeOriginal &&
|
||||||
|
other.modifyDate == modifyDate &&
|
||||||
|
other.latitude == latitude &&
|
||||||
|
other.longitude == longitude &&
|
||||||
|
other.city == city &&
|
||||||
|
other.state == state &&
|
||||||
|
other.country == country &&
|
||||||
|
other.make == make &&
|
||||||
|
other.model == model &&
|
||||||
|
other.imageName == imageName &&
|
||||||
|
other.lensModel == lensModel &&
|
||||||
|
other.fNumber == fNumber &&
|
||||||
|
other.focalLength == focalLength &&
|
||||||
|
other.iso == iso &&
|
||||||
|
other.exposureTime == exposureTime &&
|
||||||
|
other.fps == fps &&
|
||||||
|
other.asset == asset &&
|
||||||
|
other.exifTextSearchableColumn == exifTextSearchableColumn;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(assetId.hashCode) +
|
||||||
|
(description.hashCode) +
|
||||||
|
(exifImageWidth == null ? 0 : exifImageWidth!.hashCode) +
|
||||||
|
(exifImageHeight == null ? 0 : exifImageHeight!.hashCode) +
|
||||||
|
(fileSizeInByte == null ? 0 : fileSizeInByte!.hashCode) +
|
||||||
|
(orientation == null ? 0 : orientation!.hashCode) +
|
||||||
|
(dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) +
|
||||||
|
(modifyDate == null ? 0 : modifyDate!.hashCode) +
|
||||||
|
(latitude == null ? 0 : latitude!.hashCode) +
|
||||||
|
(longitude == null ? 0 : longitude!.hashCode) +
|
||||||
|
(city == null ? 0 : city!.hashCode) +
|
||||||
|
(state == null ? 0 : state!.hashCode) +
|
||||||
|
(country == null ? 0 : country!.hashCode) +
|
||||||
|
(make == null ? 0 : make!.hashCode) +
|
||||||
|
(model == null ? 0 : model!.hashCode) +
|
||||||
|
(imageName == null ? 0 : imageName!.hashCode) +
|
||||||
|
(lensModel == null ? 0 : lensModel!.hashCode) +
|
||||||
|
(fNumber == null ? 0 : fNumber!.hashCode) +
|
||||||
|
(focalLength == null ? 0 : focalLength!.hashCode) +
|
||||||
|
(iso == null ? 0 : iso!.hashCode) +
|
||||||
|
(exposureTime == null ? 0 : exposureTime!.hashCode) +
|
||||||
|
(fps == null ? 0 : fps!.hashCode) +
|
||||||
|
(asset == null ? 0 : asset!.hashCode) +
|
||||||
|
(exifTextSearchableColumn.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'ExifEntity[id=$id, assetId=$assetId, description=$description, exifImageWidth=$exifImageWidth, exifImageHeight=$exifImageHeight, fileSizeInByte=$fileSizeInByte, orientation=$orientation, dateTimeOriginal=$dateTimeOriginal, modifyDate=$modifyDate, latitude=$latitude, longitude=$longitude, city=$city, state=$state, country=$country, make=$make, model=$model, imageName=$imageName, lensModel=$lensModel, fNumber=$fNumber, focalLength=$focalLength, iso=$iso, exposureTime=$exposureTime, fps=$fps, asset=$asset, exifTextSearchableColumn=$exifTextSearchableColumn]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'assetId'] = assetId;
|
||||||
|
_json[r'description'] = description;
|
||||||
|
if (exifImageWidth != null) {
|
||||||
|
_json[r'exifImageWidth'] = exifImageWidth;
|
||||||
|
} else {
|
||||||
|
_json[r'exifImageWidth'] = null;
|
||||||
|
}
|
||||||
|
if (exifImageHeight != null) {
|
||||||
|
_json[r'exifImageHeight'] = exifImageHeight;
|
||||||
|
} else {
|
||||||
|
_json[r'exifImageHeight'] = null;
|
||||||
|
}
|
||||||
|
if (fileSizeInByte != null) {
|
||||||
|
_json[r'fileSizeInByte'] = fileSizeInByte;
|
||||||
|
} else {
|
||||||
|
_json[r'fileSizeInByte'] = null;
|
||||||
|
}
|
||||||
|
if (orientation != null) {
|
||||||
|
_json[r'orientation'] = orientation;
|
||||||
|
} else {
|
||||||
|
_json[r'orientation'] = null;
|
||||||
|
}
|
||||||
|
if (dateTimeOriginal != null) {
|
||||||
|
_json[r'dateTimeOriginal'] = dateTimeOriginal!.toUtc().toIso8601String();
|
||||||
|
} else {
|
||||||
|
_json[r'dateTimeOriginal'] = null;
|
||||||
|
}
|
||||||
|
if (modifyDate != null) {
|
||||||
|
_json[r'modifyDate'] = modifyDate!.toUtc().toIso8601String();
|
||||||
|
} else {
|
||||||
|
_json[r'modifyDate'] = null;
|
||||||
|
}
|
||||||
|
if (latitude != null) {
|
||||||
|
_json[r'latitude'] = latitude;
|
||||||
|
} else {
|
||||||
|
_json[r'latitude'] = null;
|
||||||
|
}
|
||||||
|
if (longitude != null) {
|
||||||
|
_json[r'longitude'] = longitude;
|
||||||
|
} else {
|
||||||
|
_json[r'longitude'] = null;
|
||||||
|
}
|
||||||
|
if (city != null) {
|
||||||
|
_json[r'city'] = city;
|
||||||
|
} else {
|
||||||
|
_json[r'city'] = null;
|
||||||
|
}
|
||||||
|
if (state != null) {
|
||||||
|
_json[r'state'] = state;
|
||||||
|
} else {
|
||||||
|
_json[r'state'] = null;
|
||||||
|
}
|
||||||
|
if (country != null) {
|
||||||
|
_json[r'country'] = country;
|
||||||
|
} else {
|
||||||
|
_json[r'country'] = null;
|
||||||
|
}
|
||||||
|
if (make != null) {
|
||||||
|
_json[r'make'] = make;
|
||||||
|
} else {
|
||||||
|
_json[r'make'] = null;
|
||||||
|
}
|
||||||
|
if (model != null) {
|
||||||
|
_json[r'model'] = model;
|
||||||
|
} else {
|
||||||
|
_json[r'model'] = null;
|
||||||
|
}
|
||||||
|
if (imageName != null) {
|
||||||
|
_json[r'imageName'] = imageName;
|
||||||
|
} else {
|
||||||
|
_json[r'imageName'] = null;
|
||||||
|
}
|
||||||
|
if (lensModel != null) {
|
||||||
|
_json[r'lensModel'] = lensModel;
|
||||||
|
} else {
|
||||||
|
_json[r'lensModel'] = null;
|
||||||
|
}
|
||||||
|
if (fNumber != null) {
|
||||||
|
_json[r'fNumber'] = fNumber;
|
||||||
|
} else {
|
||||||
|
_json[r'fNumber'] = null;
|
||||||
|
}
|
||||||
|
if (focalLength != null) {
|
||||||
|
_json[r'focalLength'] = focalLength;
|
||||||
|
} else {
|
||||||
|
_json[r'focalLength'] = null;
|
||||||
|
}
|
||||||
|
if (iso != null) {
|
||||||
|
_json[r'iso'] = iso;
|
||||||
|
} else {
|
||||||
|
_json[r'iso'] = null;
|
||||||
|
}
|
||||||
|
if (exposureTime != null) {
|
||||||
|
_json[r'exposureTime'] = exposureTime;
|
||||||
|
} else {
|
||||||
|
_json[r'exposureTime'] = null;
|
||||||
|
}
|
||||||
|
if (fps != null) {
|
||||||
|
_json[r'fps'] = fps;
|
||||||
|
} else {
|
||||||
|
_json[r'fps'] = null;
|
||||||
|
}
|
||||||
|
if (asset != null) {
|
||||||
|
_json[r'asset'] = asset;
|
||||||
|
} else {
|
||||||
|
_json[r'asset'] = null;
|
||||||
|
}
|
||||||
|
_json[r'exifTextSearchableColumn'] = exifTextSearchableColumn;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [ExifEntity] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static ExifEntity? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "ExifEntity[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "ExifEntity[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return ExifEntity(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
assetId: mapValueOfType<String>(json, r'assetId')!,
|
||||||
|
description: mapValueOfType<String>(json, r'description')!,
|
||||||
|
exifImageWidth: json[r'exifImageWidth'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'exifImageWidth'].toString()),
|
||||||
|
exifImageHeight: json[r'exifImageHeight'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'exifImageHeight'].toString()),
|
||||||
|
fileSizeInByte: json[r'fileSizeInByte'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'fileSizeInByte'].toString()),
|
||||||
|
orientation: mapValueOfType<String>(json, r'orientation'),
|
||||||
|
dateTimeOriginal: mapDateTime(json, r'dateTimeOriginal', ''),
|
||||||
|
modifyDate: mapDateTime(json, r'modifyDate', ''),
|
||||||
|
latitude: json[r'latitude'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'latitude'].toString()),
|
||||||
|
longitude: json[r'longitude'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'longitude'].toString()),
|
||||||
|
city: mapValueOfType<String>(json, r'city'),
|
||||||
|
state: mapValueOfType<String>(json, r'state'),
|
||||||
|
country: mapValueOfType<String>(json, r'country'),
|
||||||
|
make: mapValueOfType<String>(json, r'make'),
|
||||||
|
model: mapValueOfType<String>(json, r'model'),
|
||||||
|
imageName: mapValueOfType<String>(json, r'imageName'),
|
||||||
|
lensModel: mapValueOfType<String>(json, r'lensModel'),
|
||||||
|
fNumber: json[r'fNumber'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'fNumber'].toString()),
|
||||||
|
focalLength: json[r'focalLength'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'focalLength'].toString()),
|
||||||
|
iso: json[r'iso'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'iso'].toString()),
|
||||||
|
exposureTime: json[r'exposureTime'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'exposureTime'].toString()),
|
||||||
|
fps: json[r'fps'] == null
|
||||||
|
? null
|
||||||
|
: num.parse(json[r'fps'].toString()),
|
||||||
|
asset: AssetEntity.fromJson(json[r'asset']),
|
||||||
|
exifTextSearchableColumn: mapValueOfType<String>(json, r'exifTextSearchableColumn')!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<ExifEntity>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <ExifEntity>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = ExifEntity.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, ExifEntity> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, ExifEntity>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = ExifEntity.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of ExifEntity-objects as value to a dart map
|
||||||
|
static Map<String, List<ExifEntity>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<ExifEntity>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = ExifEntity.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'assetId',
|
||||||
|
'description',
|
||||||
|
'exifImageWidth',
|
||||||
|
'exifImageHeight',
|
||||||
|
'fileSizeInByte',
|
||||||
|
'orientation',
|
||||||
|
'dateTimeOriginal',
|
||||||
|
'modifyDate',
|
||||||
|
'latitude',
|
||||||
|
'longitude',
|
||||||
|
'city',
|
||||||
|
'state',
|
||||||
|
'country',
|
||||||
|
'make',
|
||||||
|
'model',
|
||||||
|
'imageName',
|
||||||
|
'lensModel',
|
||||||
|
'fNumber',
|
||||||
|
'focalLength',
|
||||||
|
'iso',
|
||||||
|
'exposureTime',
|
||||||
|
'exifTextSearchableColumn',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
164
mobile/openapi/lib/model/smart_info_entity.dart
generated
Normal file
164
mobile/openapi/lib/model/smart_info_entity.dart
generated
Normal file
|
@ -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 SmartInfoEntity {
|
||||||
|
/// Returns a new [SmartInfoEntity] instance.
|
||||||
|
SmartInfoEntity({
|
||||||
|
required this.id,
|
||||||
|
required this.assetId,
|
||||||
|
this.tags = const [],
|
||||||
|
this.objects = const [],
|
||||||
|
this.asset,
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
String assetId;
|
||||||
|
|
||||||
|
List<String>? tags;
|
||||||
|
|
||||||
|
List<String>? objects;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
AssetEntity? asset;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is SmartInfoEntity &&
|
||||||
|
other.id == id &&
|
||||||
|
other.assetId == assetId &&
|
||||||
|
other.tags == tags &&
|
||||||
|
other.objects == objects &&
|
||||||
|
other.asset == asset;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(assetId.hashCode) +
|
||||||
|
(tags == null ? 0 : tags!.hashCode) +
|
||||||
|
(objects == null ? 0 : objects!.hashCode) +
|
||||||
|
(asset == null ? 0 : asset!.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'SmartInfoEntity[id=$id, assetId=$assetId, tags=$tags, objects=$objects, asset=$asset]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'assetId'] = assetId;
|
||||||
|
if (tags != null) {
|
||||||
|
_json[r'tags'] = tags;
|
||||||
|
} else {
|
||||||
|
_json[r'tags'] = null;
|
||||||
|
}
|
||||||
|
if (objects != null) {
|
||||||
|
_json[r'objects'] = objects;
|
||||||
|
} else {
|
||||||
|
_json[r'objects'] = null;
|
||||||
|
}
|
||||||
|
if (asset != null) {
|
||||||
|
_json[r'asset'] = asset;
|
||||||
|
} else {
|
||||||
|
_json[r'asset'] = null;
|
||||||
|
}
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [SmartInfoEntity] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static SmartInfoEntity? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "SmartInfoEntity[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "SmartInfoEntity[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return SmartInfoEntity(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
assetId: mapValueOfType<String>(json, r'assetId')!,
|
||||||
|
tags: json[r'tags'] is List
|
||||||
|
? (json[r'tags'] as List).cast<String>()
|
||||||
|
: const [],
|
||||||
|
objects: json[r'objects'] is List
|
||||||
|
? (json[r'objects'] as List).cast<String>()
|
||||||
|
: const [],
|
||||||
|
asset: AssetEntity.fromJson(json[r'asset']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<SmartInfoEntity>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <SmartInfoEntity>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = SmartInfoEntity.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, SmartInfoEntity> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, SmartInfoEntity>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = SmartInfoEntity.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of SmartInfoEntity-objects as value to a dart map
|
||||||
|
static Map<String, List<SmartInfoEntity>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<SmartInfoEntity>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = SmartInfoEntity.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'assetId',
|
||||||
|
'tags',
|
||||||
|
'objects',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
236
mobile/openapi/lib/model/tag_entity.dart
generated
Normal file
236
mobile/openapi/lib/model/tag_entity.dart
generated
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
//
|
||||||
|
// 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 TagEntity {
|
||||||
|
/// Returns a new [TagEntity] instance.
|
||||||
|
TagEntity({
|
||||||
|
required this.id,
|
||||||
|
required this.type,
|
||||||
|
required this.name,
|
||||||
|
required this.userId,
|
||||||
|
required this.renameTagId,
|
||||||
|
this.assets = const [],
|
||||||
|
required this.user,
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
TagEntityTypeEnum type;
|
||||||
|
|
||||||
|
String name;
|
||||||
|
|
||||||
|
String userId;
|
||||||
|
|
||||||
|
String renameTagId;
|
||||||
|
|
||||||
|
List<AssetEntity> assets;
|
||||||
|
|
||||||
|
UserEntity user;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is TagEntity &&
|
||||||
|
other.id == id &&
|
||||||
|
other.type == type &&
|
||||||
|
other.name == name &&
|
||||||
|
other.userId == userId &&
|
||||||
|
other.renameTagId == renameTagId &&
|
||||||
|
other.assets == assets &&
|
||||||
|
other.user == user;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(type.hashCode) +
|
||||||
|
(name.hashCode) +
|
||||||
|
(userId.hashCode) +
|
||||||
|
(renameTagId.hashCode) +
|
||||||
|
(assets.hashCode) +
|
||||||
|
(user.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'TagEntity[id=$id, type=$type, name=$name, userId=$userId, renameTagId=$renameTagId, assets=$assets, user=$user]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'type'] = type;
|
||||||
|
_json[r'name'] = name;
|
||||||
|
_json[r'userId'] = userId;
|
||||||
|
_json[r'renameTagId'] = renameTagId;
|
||||||
|
_json[r'assets'] = assets;
|
||||||
|
_json[r'user'] = user;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [TagEntity] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static TagEntity? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "TagEntity[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "TagEntity[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return TagEntity(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
type: TagEntityTypeEnum.fromJson(json[r'type'])!,
|
||||||
|
name: mapValueOfType<String>(json, r'name')!,
|
||||||
|
userId: mapValueOfType<String>(json, r'userId')!,
|
||||||
|
renameTagId: mapValueOfType<String>(json, r'renameTagId')!,
|
||||||
|
assets: AssetEntity.listFromJson(json[r'assets'])!,
|
||||||
|
user: UserEntity.fromJson(json[r'user'])!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<TagEntity>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <TagEntity>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = TagEntity.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, TagEntity> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, TagEntity>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = TagEntity.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of TagEntity-objects as value to a dart map
|
||||||
|
static Map<String, List<TagEntity>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<TagEntity>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = TagEntity.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'type',
|
||||||
|
'name',
|
||||||
|
'userId',
|
||||||
|
'renameTagId',
|
||||||
|
'assets',
|
||||||
|
'user',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class TagEntityTypeEnum {
|
||||||
|
/// Instantiate a new enum with the provided [value].
|
||||||
|
const TagEntityTypeEnum._(this.value);
|
||||||
|
|
||||||
|
/// The underlying value of this enum member.
|
||||||
|
final String value;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => value;
|
||||||
|
|
||||||
|
String toJson() => value;
|
||||||
|
|
||||||
|
static const OBJECT = TagEntityTypeEnum._(r'OBJECT');
|
||||||
|
static const FACE = TagEntityTypeEnum._(r'FACE');
|
||||||
|
static const CUSTOM = TagEntityTypeEnum._(r'CUSTOM');
|
||||||
|
|
||||||
|
/// List of all possible values in this [enum][TagEntityTypeEnum].
|
||||||
|
static const values = <TagEntityTypeEnum>[
|
||||||
|
OBJECT,
|
||||||
|
FACE,
|
||||||
|
CUSTOM,
|
||||||
|
];
|
||||||
|
|
||||||
|
static TagEntityTypeEnum? fromJson(dynamic value) => TagEntityTypeEnumTypeTransformer().decode(value);
|
||||||
|
|
||||||
|
static List<TagEntityTypeEnum>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <TagEntityTypeEnum>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = TagEntityTypeEnum.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transformation class that can [encode] an instance of [TagEntityTypeEnum] to String,
|
||||||
|
/// and [decode] dynamic data back to [TagEntityTypeEnum].
|
||||||
|
class TagEntityTypeEnumTypeTransformer {
|
||||||
|
factory TagEntityTypeEnumTypeTransformer() => _instance ??= const TagEntityTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
const TagEntityTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
String encode(TagEntityTypeEnum data) => data.value;
|
||||||
|
|
||||||
|
/// Decodes a [dynamic value][data] to a TagEntityTypeEnum.
|
||||||
|
///
|
||||||
|
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
|
||||||
|
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
|
||||||
|
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
|
||||||
|
///
|
||||||
|
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
||||||
|
/// and users are still using an old app with the old code.
|
||||||
|
TagEntityTypeEnum? decode(dynamic data, {bool allowNull = true}) {
|
||||||
|
if (data != null) {
|
||||||
|
switch (data.toString()) {
|
||||||
|
case r'OBJECT': return TagEntityTypeEnum.OBJECT;
|
||||||
|
case r'FACE': return TagEntityTypeEnum.FACE;
|
||||||
|
case r'CUSTOM': return TagEntityTypeEnum.CUSTOM;
|
||||||
|
default:
|
||||||
|
if (!allowNull) {
|
||||||
|
throw ArgumentError('Unknown enum value to decode: $data');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Singleton [TagEntityTypeEnumTypeTransformer] instance.
|
||||||
|
static TagEntityTypeEnumTypeTransformer? _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
127
mobile/openapi/lib/model/tag_response_dto.dart
generated
Normal file
127
mobile/openapi/lib/model/tag_response_dto.dart
generated
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
//
|
||||||
|
// 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 TagResponseDto {
|
||||||
|
/// Returns a new [TagResponseDto] instance.
|
||||||
|
TagResponseDto({
|
||||||
|
required this.id,
|
||||||
|
required this.type,
|
||||||
|
required this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
TagTypeEnum type;
|
||||||
|
|
||||||
|
String name;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is TagResponseDto &&
|
||||||
|
other.id == id &&
|
||||||
|
other.type == type &&
|
||||||
|
other.name == name;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(type.hashCode) +
|
||||||
|
(name.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'TagResponseDto[id=$id, type=$type, name=$name]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'type'] = type;
|
||||||
|
_json[r'name'] = name;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [TagResponseDto] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static TagResponseDto? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "TagResponseDto[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "TagResponseDto[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return TagResponseDto(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
type: TagTypeEnum.fromJson(json[r'type'])!,
|
||||||
|
name: mapValueOfType<String>(json, r'name')!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<TagResponseDto>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <TagResponseDto>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = TagResponseDto.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, TagResponseDto> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, TagResponseDto>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = TagResponseDto.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of TagResponseDto-objects as value to a dart map
|
||||||
|
static Map<String, List<TagResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<TagResponseDto>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = TagResponseDto.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'type',
|
||||||
|
'name',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
88
mobile/openapi/lib/model/tag_type_enum.dart
generated
Normal file
88
mobile/openapi/lib/model/tag_type_enum.dart
generated
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
//
|
||||||
|
// 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 TagTypeEnum {
|
||||||
|
/// Instantiate a new enum with the provided [value].
|
||||||
|
const TagTypeEnum._(this.value);
|
||||||
|
|
||||||
|
/// The underlying value of this enum member.
|
||||||
|
final String value;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => value;
|
||||||
|
|
||||||
|
String toJson() => value;
|
||||||
|
|
||||||
|
static const OBJECT = TagTypeEnum._(r'OBJECT');
|
||||||
|
static const FACE = TagTypeEnum._(r'FACE');
|
||||||
|
static const CUSTOM = TagTypeEnum._(r'CUSTOM');
|
||||||
|
|
||||||
|
/// List of all possible values in this [enum][TagTypeEnum].
|
||||||
|
static const values = <TagTypeEnum>[
|
||||||
|
OBJECT,
|
||||||
|
FACE,
|
||||||
|
CUSTOM,
|
||||||
|
];
|
||||||
|
|
||||||
|
static TagTypeEnum? fromJson(dynamic value) => TagTypeEnumTypeTransformer().decode(value);
|
||||||
|
|
||||||
|
static List<TagTypeEnum>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <TagTypeEnum>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = TagTypeEnum.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transformation class that can [encode] an instance of [TagTypeEnum] to String,
|
||||||
|
/// and [decode] dynamic data back to [TagTypeEnum].
|
||||||
|
class TagTypeEnumTypeTransformer {
|
||||||
|
factory TagTypeEnumTypeTransformer() => _instance ??= const TagTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
const TagTypeEnumTypeTransformer._();
|
||||||
|
|
||||||
|
String encode(TagTypeEnum data) => data.value;
|
||||||
|
|
||||||
|
/// Decodes a [dynamic value][data] to a TagTypeEnum.
|
||||||
|
///
|
||||||
|
/// If [allowNull] is true and the [dynamic value][data] cannot be decoded successfully,
|
||||||
|
/// then null is returned. However, if [allowNull] is false and the [dynamic value][data]
|
||||||
|
/// cannot be decoded successfully, then an [UnimplementedError] is thrown.
|
||||||
|
///
|
||||||
|
/// The [allowNull] is very handy when an API changes and a new enum value is added or removed,
|
||||||
|
/// and users are still using an old app with the old code.
|
||||||
|
TagTypeEnum? decode(dynamic data, {bool allowNull = true}) {
|
||||||
|
if (data != null) {
|
||||||
|
switch (data.toString()) {
|
||||||
|
case r'OBJECT': return TagTypeEnum.OBJECT;
|
||||||
|
case r'FACE': return TagTypeEnum.FACE;
|
||||||
|
case r'CUSTOM': return TagTypeEnum.CUSTOM;
|
||||||
|
default:
|
||||||
|
if (!allowNull) {
|
||||||
|
throw ArgumentError('Unknown enum value to decode: $data');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Singleton [TagTypeEnumTypeTransformer] instance.
|
||||||
|
static TagTypeEnumTypeTransformer? _instance;
|
||||||
|
}
|
||||||
|
|
30
mobile/openapi/lib/model/update_asset_dto.dart
generated
30
mobile/openapi/lib/model/update_asset_dto.dart
generated
|
@ -13,26 +13,42 @@ part of openapi.api;
|
||||||
class UpdateAssetDto {
|
class UpdateAssetDto {
|
||||||
/// Returns a new [UpdateAssetDto] instance.
|
/// Returns a new [UpdateAssetDto] instance.
|
||||||
UpdateAssetDto({
|
UpdateAssetDto({
|
||||||
required this.isFavorite,
|
this.tagIds = const [],
|
||||||
|
this.isFavorite,
|
||||||
});
|
});
|
||||||
|
|
||||||
bool isFavorite;
|
List<String> tagIds;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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? isFavorite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) => identical(this, other) || other is UpdateAssetDto &&
|
bool operator ==(Object other) => identical(this, other) || other is UpdateAssetDto &&
|
||||||
|
other.tagIds == tagIds &&
|
||||||
other.isFavorite == isFavorite;
|
other.isFavorite == isFavorite;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
// ignore: unnecessary_parenthesis
|
// ignore: unnecessary_parenthesis
|
||||||
(isFavorite.hashCode);
|
(tagIds.hashCode) +
|
||||||
|
(isFavorite == null ? 0 : isFavorite!.hashCode);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => 'UpdateAssetDto[isFavorite=$isFavorite]';
|
String toString() => 'UpdateAssetDto[tagIds=$tagIds, isFavorite=$isFavorite]';
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final _json = <String, dynamic>{};
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'tagIds'] = tagIds;
|
||||||
|
if (isFavorite != null) {
|
||||||
_json[r'isFavorite'] = isFavorite;
|
_json[r'isFavorite'] = isFavorite;
|
||||||
|
} else {
|
||||||
|
_json[r'isFavorite'] = null;
|
||||||
|
}
|
||||||
return _json;
|
return _json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +71,10 @@ class UpdateAssetDto {
|
||||||
}());
|
}());
|
||||||
|
|
||||||
return UpdateAssetDto(
|
return UpdateAssetDto(
|
||||||
isFavorite: mapValueOfType<bool>(json, r'isFavorite')!,
|
tagIds: json[r'tagIds'] is List
|
||||||
|
? (json[r'tagIds'] as List).cast<String>()
|
||||||
|
: const [],
|
||||||
|
isFavorite: mapValueOfType<bool>(json, r'isFavorite'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -105,7 +124,6 @@ class UpdateAssetDto {
|
||||||
|
|
||||||
/// The list of required keys that must be present in a JSON.
|
/// The list of required keys that must be present in a JSON.
|
||||||
static const requiredKeys = <String>{
|
static const requiredKeys = <String>{
|
||||||
'isFavorite',
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
137
mobile/openapi/lib/model/update_tag_dto.dart
generated
Normal file
137
mobile/openapi/lib/model/update_tag_dto.dart
generated
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
//
|
||||||
|
// 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 UpdateTagDto {
|
||||||
|
/// Returns a new [UpdateTagDto] instance.
|
||||||
|
UpdateTagDto({
|
||||||
|
this.name,
|
||||||
|
this.renameTagId,
|
||||||
|
});
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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? name;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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? renameTagId;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is UpdateTagDto &&
|
||||||
|
other.name == name &&
|
||||||
|
other.renameTagId == renameTagId;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(name == null ? 0 : name!.hashCode) +
|
||||||
|
(renameTagId == null ? 0 : renameTagId!.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'UpdateTagDto[name=$name, renameTagId=$renameTagId]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
if (name != null) {
|
||||||
|
_json[r'name'] = name;
|
||||||
|
} else {
|
||||||
|
_json[r'name'] = null;
|
||||||
|
}
|
||||||
|
if (renameTagId != null) {
|
||||||
|
_json[r'renameTagId'] = renameTagId;
|
||||||
|
} else {
|
||||||
|
_json[r'renameTagId'] = null;
|
||||||
|
}
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [UpdateTagDto] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static UpdateTagDto? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "UpdateTagDto[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "UpdateTagDto[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return UpdateTagDto(
|
||||||
|
name: mapValueOfType<String>(json, r'name'),
|
||||||
|
renameTagId: mapValueOfType<String>(json, r'renameTagId'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<UpdateTagDto>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <UpdateTagDto>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = UpdateTagDto.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, UpdateTagDto> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, UpdateTagDto>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = UpdateTagDto.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of UpdateTagDto-objects as value to a dart map
|
||||||
|
static Map<String, List<UpdateTagDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<UpdateTagDto>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = UpdateTagDto.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 = <String>{
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
234
mobile/openapi/lib/model/user_entity.dart
generated
Normal file
234
mobile/openapi/lib/model/user_entity.dart
generated
Normal file
|
@ -0,0 +1,234 @@
|
||||||
|
//
|
||||||
|
// 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 UserEntity {
|
||||||
|
/// Returns a new [UserEntity] instance.
|
||||||
|
UserEntity({
|
||||||
|
required this.id,
|
||||||
|
required this.firstName,
|
||||||
|
required this.lastName,
|
||||||
|
required this.isAdmin,
|
||||||
|
required this.email,
|
||||||
|
this.password,
|
||||||
|
this.salt,
|
||||||
|
required this.oauthId,
|
||||||
|
required this.profileImagePath,
|
||||||
|
required this.shouldChangePassword,
|
||||||
|
required this.createdAt,
|
||||||
|
this.deletedAt,
|
||||||
|
this.tags = const [],
|
||||||
|
});
|
||||||
|
|
||||||
|
String id;
|
||||||
|
|
||||||
|
String firstName;
|
||||||
|
|
||||||
|
String lastName;
|
||||||
|
|
||||||
|
bool isAdmin;
|
||||||
|
|
||||||
|
String email;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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? password;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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? salt;
|
||||||
|
|
||||||
|
String oauthId;
|
||||||
|
|
||||||
|
String profileImagePath;
|
||||||
|
|
||||||
|
bool shouldChangePassword;
|
||||||
|
|
||||||
|
String createdAt;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// 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.
|
||||||
|
///
|
||||||
|
DateTime? deletedAt;
|
||||||
|
|
||||||
|
List<TagEntity> tags;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) => identical(this, other) || other is UserEntity &&
|
||||||
|
other.id == id &&
|
||||||
|
other.firstName == firstName &&
|
||||||
|
other.lastName == lastName &&
|
||||||
|
other.isAdmin == isAdmin &&
|
||||||
|
other.email == email &&
|
||||||
|
other.password == password &&
|
||||||
|
other.salt == salt &&
|
||||||
|
other.oauthId == oauthId &&
|
||||||
|
other.profileImagePath == profileImagePath &&
|
||||||
|
other.shouldChangePassword == shouldChangePassword &&
|
||||||
|
other.createdAt == createdAt &&
|
||||||
|
other.deletedAt == deletedAt &&
|
||||||
|
other.tags == tags;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
// ignore: unnecessary_parenthesis
|
||||||
|
(id.hashCode) +
|
||||||
|
(firstName.hashCode) +
|
||||||
|
(lastName.hashCode) +
|
||||||
|
(isAdmin.hashCode) +
|
||||||
|
(email.hashCode) +
|
||||||
|
(password == null ? 0 : password!.hashCode) +
|
||||||
|
(salt == null ? 0 : salt!.hashCode) +
|
||||||
|
(oauthId.hashCode) +
|
||||||
|
(profileImagePath.hashCode) +
|
||||||
|
(shouldChangePassword.hashCode) +
|
||||||
|
(createdAt.hashCode) +
|
||||||
|
(deletedAt == null ? 0 : deletedAt!.hashCode) +
|
||||||
|
(tags.hashCode);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'UserEntity[id=$id, firstName=$firstName, lastName=$lastName, isAdmin=$isAdmin, email=$email, password=$password, salt=$salt, oauthId=$oauthId, profileImagePath=$profileImagePath, shouldChangePassword=$shouldChangePassword, createdAt=$createdAt, deletedAt=$deletedAt, tags=$tags]';
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final _json = <String, dynamic>{};
|
||||||
|
_json[r'id'] = id;
|
||||||
|
_json[r'firstName'] = firstName;
|
||||||
|
_json[r'lastName'] = lastName;
|
||||||
|
_json[r'isAdmin'] = isAdmin;
|
||||||
|
_json[r'email'] = email;
|
||||||
|
if (password != null) {
|
||||||
|
_json[r'password'] = password;
|
||||||
|
} else {
|
||||||
|
_json[r'password'] = null;
|
||||||
|
}
|
||||||
|
if (salt != null) {
|
||||||
|
_json[r'salt'] = salt;
|
||||||
|
} else {
|
||||||
|
_json[r'salt'] = null;
|
||||||
|
}
|
||||||
|
_json[r'oauthId'] = oauthId;
|
||||||
|
_json[r'profileImagePath'] = profileImagePath;
|
||||||
|
_json[r'shouldChangePassword'] = shouldChangePassword;
|
||||||
|
_json[r'createdAt'] = createdAt;
|
||||||
|
if (deletedAt != null) {
|
||||||
|
_json[r'deletedAt'] = deletedAt!.toUtc().toIso8601String();
|
||||||
|
} else {
|
||||||
|
_json[r'deletedAt'] = null;
|
||||||
|
}
|
||||||
|
_json[r'tags'] = tags;
|
||||||
|
return _json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a new [UserEntity] instance and imports its values from
|
||||||
|
/// [value] if it's a [Map], null otherwise.
|
||||||
|
// ignore: prefer_constructors_over_static_methods
|
||||||
|
static UserEntity? fromJson(dynamic value) {
|
||||||
|
if (value is Map) {
|
||||||
|
final json = value.cast<String, dynamic>();
|
||||||
|
|
||||||
|
// 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 "UserEntity[$key]" is missing from JSON.');
|
||||||
|
assert(json[key] != null, 'Required key "UserEntity[$key]" has a null value in JSON.');
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}());
|
||||||
|
|
||||||
|
return UserEntity(
|
||||||
|
id: mapValueOfType<String>(json, r'id')!,
|
||||||
|
firstName: mapValueOfType<String>(json, r'firstName')!,
|
||||||
|
lastName: mapValueOfType<String>(json, r'lastName')!,
|
||||||
|
isAdmin: mapValueOfType<bool>(json, r'isAdmin')!,
|
||||||
|
email: mapValueOfType<String>(json, r'email')!,
|
||||||
|
password: mapValueOfType<String>(json, r'password'),
|
||||||
|
salt: mapValueOfType<String>(json, r'salt'),
|
||||||
|
oauthId: mapValueOfType<String>(json, r'oauthId')!,
|
||||||
|
profileImagePath: mapValueOfType<String>(json, r'profileImagePath')!,
|
||||||
|
shouldChangePassword: mapValueOfType<bool>(json, r'shouldChangePassword')!,
|
||||||
|
createdAt: mapValueOfType<String>(json, r'createdAt')!,
|
||||||
|
deletedAt: mapDateTime(json, r'deletedAt', ''),
|
||||||
|
tags: TagEntity.listFromJson(json[r'tags'])!,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<UserEntity>? listFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final result = <UserEntity>[];
|
||||||
|
if (json is List && json.isNotEmpty) {
|
||||||
|
for (final row in json) {
|
||||||
|
final value = UserEntity.fromJson(row);
|
||||||
|
if (value != null) {
|
||||||
|
result.add(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toList(growable: growable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Map<String, UserEntity> mapFromJson(dynamic json) {
|
||||||
|
final map = <String, UserEntity>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = UserEntity.fromJson(entry.value);
|
||||||
|
if (value != null) {
|
||||||
|
map[entry.key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// maps a json object with a list of UserEntity-objects as value to a dart map
|
||||||
|
static Map<String, List<UserEntity>> mapListFromJson(dynamic json, {bool growable = false,}) {
|
||||||
|
final map = <String, List<UserEntity>>{};
|
||||||
|
if (json is Map && json.isNotEmpty) {
|
||||||
|
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
|
||||||
|
for (final entry in json.entries) {
|
||||||
|
final value = UserEntity.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 = <String>{
|
||||||
|
'id',
|
||||||
|
'firstName',
|
||||||
|
'lastName',
|
||||||
|
'isAdmin',
|
||||||
|
'email',
|
||||||
|
'oauthId',
|
||||||
|
'profileImagePath',
|
||||||
|
'shouldChangePassword',
|
||||||
|
'createdAt',
|
||||||
|
'tags',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
122
mobile/openapi/test/asset_entity_test.dart
generated
Normal file
122
mobile/openapi/test/asset_entity_test.dart
generated
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
//
|
||||||
|
// 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 AssetEntity
|
||||||
|
void main() {
|
||||||
|
// final instance = AssetEntity();
|
||||||
|
|
||||||
|
group('test AssetEntity', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String deviceAssetId
|
||||||
|
test('to test the property `deviceAssetId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String userId
|
||||||
|
test('to test the property `userId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String deviceId
|
||||||
|
test('to test the property `deviceId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String type
|
||||||
|
test('to test the property `type`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String originalPath
|
||||||
|
test('to test the property `originalPath`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String resizePath
|
||||||
|
test('to test the property `resizePath`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String webpPath
|
||||||
|
test('to test the property `webpPath`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String encodedVideoPath
|
||||||
|
test('to test the property `encodedVideoPath`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String createdAt
|
||||||
|
test('to test the property `createdAt`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String modifiedAt
|
||||||
|
test('to test the property `modifiedAt`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// bool isFavorite
|
||||||
|
test('to test the property `isFavorite`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String mimeType
|
||||||
|
test('to test the property `mimeType`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// Object checksum
|
||||||
|
test('to test the property `checksum`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String duration
|
||||||
|
test('to test the property `duration`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// bool isVisible
|
||||||
|
test('to test the property `isVisible`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String livePhotoVideoId
|
||||||
|
test('to test the property `livePhotoVideoId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// ExifEntity exifInfo
|
||||||
|
test('to test the property `exifInfo`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// SmartInfoEntity smartInfo
|
||||||
|
test('to test the property `smartInfo`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// List<TagEntity> tags (default value: const [])
|
||||||
|
test('to test the property `tags`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
32
mobile/openapi/test/create_tag_dto_test.dart
generated
Normal file
32
mobile/openapi/test/create_tag_dto_test.dart
generated
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
//
|
||||||
|
// 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 CreateTagDto
|
||||||
|
void main() {
|
||||||
|
// final instance = CreateTagDto();
|
||||||
|
|
||||||
|
group('test CreateTagDto', () {
|
||||||
|
// TagTypeEnum type
|
||||||
|
test('to test the property `type`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String name
|
||||||
|
test('to test the property `name`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
150
mobile/openapi/test/exif_entity_test.dart
generated
Normal file
150
mobile/openapi/test/exif_entity_test.dart
generated
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
//
|
||||||
|
// 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 ExifEntity
|
||||||
|
void main() {
|
||||||
|
// final instance = ExifEntity();
|
||||||
|
|
||||||
|
group('test ExifEntity', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String assetId
|
||||||
|
test('to test the property `assetId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// General info
|
||||||
|
// String description
|
||||||
|
test('to test the property `description`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num exifImageWidth
|
||||||
|
test('to test the property `exifImageWidth`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num exifImageHeight
|
||||||
|
test('to test the property `exifImageHeight`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num fileSizeInByte
|
||||||
|
test('to test the property `fileSizeInByte`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String orientation
|
||||||
|
test('to test the property `orientation`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// DateTime dateTimeOriginal
|
||||||
|
test('to test the property `dateTimeOriginal`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// DateTime modifyDate
|
||||||
|
test('to test the property `modifyDate`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num latitude
|
||||||
|
test('to test the property `latitude`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num longitude
|
||||||
|
test('to test the property `longitude`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String city
|
||||||
|
test('to test the property `city`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String state
|
||||||
|
test('to test the property `state`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String country
|
||||||
|
test('to test the property `country`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// Image info
|
||||||
|
// String make
|
||||||
|
test('to test the property `make`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String model
|
||||||
|
test('to test the property `model`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String imageName
|
||||||
|
test('to test the property `imageName`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String lensModel
|
||||||
|
test('to test the property `lensModel`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num fNumber
|
||||||
|
test('to test the property `fNumber`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num focalLength
|
||||||
|
test('to test the property `focalLength`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num iso
|
||||||
|
test('to test the property `iso`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// num exposureTime
|
||||||
|
test('to test the property `exposureTime`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// Video info
|
||||||
|
// num fps
|
||||||
|
test('to test the property `fps`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// AssetEntity asset
|
||||||
|
test('to test the property `asset`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String exifTextSearchableColumn
|
||||||
|
test('to test the property `exifTextSearchableColumn`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
47
mobile/openapi/test/smart_info_entity_test.dart
generated
Normal file
47
mobile/openapi/test/smart_info_entity_test.dart
generated
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
//
|
||||||
|
// 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 SmartInfoEntity
|
||||||
|
void main() {
|
||||||
|
// final instance = SmartInfoEntity();
|
||||||
|
|
||||||
|
group('test SmartInfoEntity', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String assetId
|
||||||
|
test('to test the property `assetId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// List<String> tags (default value: const [])
|
||||||
|
test('to test the property `tags`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// List<String> objects (default value: const [])
|
||||||
|
test('to test the property `objects`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// AssetEntity asset
|
||||||
|
test('to test the property `asset`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
46
mobile/openapi/test/tag_api_test.dart
generated
Normal file
46
mobile/openapi/test/tag_api_test.dart
generated
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
//
|
||||||
|
// 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 TagApi
|
||||||
|
void main() {
|
||||||
|
// final instance = TagApi();
|
||||||
|
|
||||||
|
group('tests for TagApi', () {
|
||||||
|
//Future<TagEntity> create(CreateTagDto createTagDto) async
|
||||||
|
test('test create', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
//Future<List<TagEntity>> findAll() async
|
||||||
|
test('test findAll', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
//Future<Object> findOne(String id) async
|
||||||
|
test('test findOne', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
//Future<String> remove(String id) async
|
||||||
|
test('test remove', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
//Future<String> update(String id, UpdateTagDto updateTagDto) async
|
||||||
|
test('test update', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
52
mobile/openapi/test/tag_entity_test.dart
generated
Normal file
52
mobile/openapi/test/tag_entity_test.dart
generated
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
//
|
||||||
|
// 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 TagEntity
|
||||||
|
void main() {
|
||||||
|
// final instance = TagEntity();
|
||||||
|
|
||||||
|
group('test TagEntity', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String type
|
||||||
|
test('to test the property `type`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String name
|
||||||
|
test('to test the property `name`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String renameTagId
|
||||||
|
test('to test the property `renameTagId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// List<AssetEntity> assets (default value: const [])
|
||||||
|
test('to test the property `assets`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// UserEntity user
|
||||||
|
test('to test the property `user`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
37
mobile/openapi/test/tag_response_dto_test.dart
generated
Normal file
37
mobile/openapi/test/tag_response_dto_test.dart
generated
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
//
|
||||||
|
// 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 TagResponseDto
|
||||||
|
void main() {
|
||||||
|
// final instance = TagResponseDto();
|
||||||
|
|
||||||
|
group('test TagResponseDto', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// TagTypeEnum type
|
||||||
|
test('to test the property `type`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String name
|
||||||
|
test('to test the property `name`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
21
mobile/openapi/test/tag_type_enum_test.dart
generated
Normal file
21
mobile/openapi/test/tag_type_enum_test.dart
generated
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
//
|
||||||
|
// 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 TagTypeEnum
|
||||||
|
void main() {
|
||||||
|
|
||||||
|
group('test TagTypeEnum', () {
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
32
mobile/openapi/test/update_tag_dto_test.dart
generated
Normal file
32
mobile/openapi/test/update_tag_dto_test.dart
generated
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
//
|
||||||
|
// 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 UpdateTagDto
|
||||||
|
void main() {
|
||||||
|
// final instance = UpdateTagDto();
|
||||||
|
|
||||||
|
group('test UpdateTagDto', () {
|
||||||
|
// String name
|
||||||
|
test('to test the property `name`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String renameTagId
|
||||||
|
test('to test the property `renameTagId`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
82
mobile/openapi/test/user_entity_test.dart
generated
Normal file
82
mobile/openapi/test/user_entity_test.dart
generated
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
//
|
||||||
|
// 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 UserEntity
|
||||||
|
void main() {
|
||||||
|
// final instance = UserEntity();
|
||||||
|
|
||||||
|
group('test UserEntity', () {
|
||||||
|
// String id
|
||||||
|
test('to test the property `id`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String firstName
|
||||||
|
test('to test the property `firstName`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String lastName
|
||||||
|
test('to test the property `lastName`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// bool isAdmin
|
||||||
|
test('to test the property `isAdmin`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String email
|
||||||
|
test('to test the property `email`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String password
|
||||||
|
test('to test the property `password`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String salt
|
||||||
|
test('to test the property `salt`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String profileImagePath
|
||||||
|
test('to test the property `profileImagePath`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// bool shouldChangePassword
|
||||||
|
test('to test the property `shouldChangePassword`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// String createdAt
|
||||||
|
test('to test the property `createdAt`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// DateTime deletedAt
|
||||||
|
test('to test the property `deletedAt`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
// List<TagEntity> tags (default value: const [])
|
||||||
|
test('to test the property `tags`', () async {
|
||||||
|
// TODO
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
|
@ -1,32 +1,29 @@
|
||||||
import { Module } from '@nestjs/common';
|
import { forwardRef, Module } from '@nestjs/common';
|
||||||
import { AlbumService } from './album.service';
|
import { AlbumService } from './album.service';
|
||||||
import { AlbumController } from './album.controller';
|
import { AlbumController } from './album.controller';
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
import { AssetEntity } from '@app/database/entities/asset.entity';
|
|
||||||
import { UserEntity } from '@app/database/entities/user.entity';
|
|
||||||
import { AlbumEntity } from '../../../../../libs/database/src/entities/album.entity';
|
import { AlbumEntity } from '../../../../../libs/database/src/entities/album.entity';
|
||||||
import { AssetAlbumEntity } from '@app/database/entities/asset-album.entity';
|
import { AssetAlbumEntity } from '@app/database/entities/asset-album.entity';
|
||||||
import { UserAlbumEntity } from '@app/database/entities/user-album.entity';
|
import { UserAlbumEntity } from '@app/database/entities/user-album.entity';
|
||||||
import { AlbumRepository, ALBUM_REPOSITORY } from './album-repository';
|
import { AlbumRepository, ALBUM_REPOSITORY } from './album-repository';
|
||||||
import { AssetRepository, ASSET_REPOSITORY } from '../asset/asset-repository';
|
|
||||||
import { DownloadModule } from '../../modules/download/download.module';
|
import { DownloadModule } from '../../modules/download/download.module';
|
||||||
|
import { AssetModule } from '../asset/asset.module';
|
||||||
|
import { UserModule } from '../user/user.module';
|
||||||
|
|
||||||
|
const ALBUM_REPOSITORY_PROVIDER = {
|
||||||
|
provide: ALBUM_REPOSITORY,
|
||||||
|
useClass: AlbumRepository,
|
||||||
|
};
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
TypeOrmModule.forFeature([AssetEntity, UserEntity, AlbumEntity, AssetAlbumEntity, UserAlbumEntity]),
|
TypeOrmModule.forFeature([AlbumEntity, AssetAlbumEntity, UserAlbumEntity]),
|
||||||
DownloadModule,
|
DownloadModule,
|
||||||
|
UserModule,
|
||||||
|
forwardRef(() => AssetModule),
|
||||||
],
|
],
|
||||||
controllers: [AlbumController],
|
controllers: [AlbumController],
|
||||||
providers: [
|
providers: [AlbumService, ALBUM_REPOSITORY_PROVIDER],
|
||||||
AlbumService,
|
exports: [ALBUM_REPOSITORY_PROVIDER],
|
||||||
{
|
|
||||||
provide: ALBUM_REPOSITORY,
|
|
||||||
useClass: AlbumRepository,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
provide: ASSET_REPOSITORY,
|
|
||||||
useClass: AssetRepository,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
})
|
||||||
export class AlbumModule {}
|
export class AlbumModule {}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { SearchPropertiesDto } from './dto/search-properties.dto';
|
import { SearchPropertiesDto } from './dto/search-properties.dto';
|
||||||
import { CuratedLocationsResponseDto } from './response-dto/curated-locations-response.dto';
|
import { CuratedLocationsResponseDto } from './response-dto/curated-locations-response.dto';
|
||||||
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
|
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
|
||||||
import { BadRequestException, Injectable } from '@nestjs/common';
|
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
||||||
import { InjectRepository } from '@nestjs/typeorm';
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
import { Repository } from 'typeorm/repository/Repository';
|
import { Repository } from 'typeorm/repository/Repository';
|
||||||
import { CreateAssetDto } from './dto/create-asset.dto';
|
import { CreateAssetDto } from './dto/create-asset.dto';
|
||||||
|
@ -14,6 +14,7 @@ import { CheckExistingAssetsDto } from './dto/check-existing-assets.dto';
|
||||||
import { CheckExistingAssetsResponseDto } from './response-dto/check-existing-assets-response.dto';
|
import { CheckExistingAssetsResponseDto } from './response-dto/check-existing-assets-response.dto';
|
||||||
import { In } from 'typeorm/find-options/operator/In';
|
import { In } from 'typeorm/find-options/operator/In';
|
||||||
import { UpdateAssetDto } from './dto/update-asset.dto';
|
import { UpdateAssetDto } from './dto/update-asset.dto';
|
||||||
|
import { ITagRepository, TAG_REPOSITORY } from '../tag/tag.repository';
|
||||||
|
|
||||||
export interface IAssetRepository {
|
export interface IAssetRepository {
|
||||||
create(
|
create(
|
||||||
|
@ -25,7 +26,7 @@ export interface IAssetRepository {
|
||||||
checksum?: Buffer,
|
checksum?: Buffer,
|
||||||
livePhotoAssetEntity?: AssetEntity,
|
livePhotoAssetEntity?: AssetEntity,
|
||||||
): Promise<AssetEntity>;
|
): Promise<AssetEntity>;
|
||||||
update(asset: AssetEntity, dto: UpdateAssetDto): Promise<AssetEntity>;
|
update(userId: string, asset: AssetEntity, dto: UpdateAssetDto): Promise<AssetEntity>;
|
||||||
getAllByUserId(userId: string, skip?: number): Promise<AssetEntity[]>;
|
getAllByUserId(userId: string, skip?: number): Promise<AssetEntity[]>;
|
||||||
getAllByDeviceId(userId: string, deviceId: string): Promise<string[]>;
|
getAllByDeviceId(userId: string, deviceId: string): Promise<string[]>;
|
||||||
getById(assetId: string): Promise<AssetEntity>;
|
getById(assetId: string): Promise<AssetEntity>;
|
||||||
|
@ -53,6 +54,8 @@ export class AssetRepository implements IAssetRepository {
|
||||||
constructor(
|
constructor(
|
||||||
@InjectRepository(AssetEntity)
|
@InjectRepository(AssetEntity)
|
||||||
private assetRepository: Repository<AssetEntity>,
|
private assetRepository: Repository<AssetEntity>,
|
||||||
|
|
||||||
|
@Inject(TAG_REPOSITORY) private _tagRepository: ITagRepository,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async getAssetWithNoSmartInfo(): Promise<AssetEntity[]> {
|
async getAssetWithNoSmartInfo(): Promise<AssetEntity[]> {
|
||||||
|
@ -222,7 +225,7 @@ export class AssetRepository implements IAssetRepository {
|
||||||
where: {
|
where: {
|
||||||
id: assetId,
|
id: assetId,
|
||||||
},
|
},
|
||||||
relations: ['exifInfo'],
|
relations: ['exifInfo', 'tags'],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,9 +240,9 @@ export class AssetRepository implements IAssetRepository {
|
||||||
.andWhere('asset.resizePath is not NULL')
|
.andWhere('asset.resizePath is not NULL')
|
||||||
.andWhere('asset.isVisible = true')
|
.andWhere('asset.isVisible = true')
|
||||||
.leftJoinAndSelect('asset.exifInfo', 'exifInfo')
|
.leftJoinAndSelect('asset.exifInfo', 'exifInfo')
|
||||||
|
.leftJoinAndSelect('asset.tags', 'tags')
|
||||||
.skip(skip || 0)
|
.skip(skip || 0)
|
||||||
.orderBy('asset.createdAt', 'DESC');
|
.orderBy('asset.createdAt', 'DESC');
|
||||||
|
|
||||||
return await query.getMany();
|
return await query.getMany();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,9 +289,14 @@ export class AssetRepository implements IAssetRepository {
|
||||||
/**
|
/**
|
||||||
* Update asset
|
* Update asset
|
||||||
*/
|
*/
|
||||||
async update(asset: AssetEntity, dto: UpdateAssetDto): Promise<AssetEntity> {
|
async update(userId: string, asset: AssetEntity, dto: UpdateAssetDto): Promise<AssetEntity> {
|
||||||
asset.isFavorite = dto.isFavorite ?? asset.isFavorite;
|
asset.isFavorite = dto.isFavorite ?? asset.isFavorite;
|
||||||
|
|
||||||
|
if (dto.tagIds) {
|
||||||
|
const tags = await this._tagRepository.getByIds(userId, dto.tagIds);
|
||||||
|
asset.tags = tags;
|
||||||
|
}
|
||||||
|
|
||||||
return await this.assetRepository.save(asset);
|
return await this.assetRepository.save(asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,8 +357,8 @@ export class AssetRepository implements IAssetRepository {
|
||||||
return await this.assetRepository.count({
|
return await this.assetRepository.count({
|
||||||
where: {
|
where: {
|
||||||
id: assetId,
|
id: assetId,
|
||||||
userId
|
userId,
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,14 +216,14 @@ export class AssetController {
|
||||||
/**
|
/**
|
||||||
* Update an asset
|
* Update an asset
|
||||||
*/
|
*/
|
||||||
@Put('/assetById/:assetId')
|
@Put('/:assetId')
|
||||||
async updateAssetById(
|
async updateAsset(
|
||||||
@GetAuthUser() authUser: AuthUserDto,
|
@GetAuthUser() authUser: AuthUserDto,
|
||||||
@Param('assetId') assetId: string,
|
@Param('assetId') assetId: string,
|
||||||
@Body() dto: UpdateAssetDto,
|
@Body(ValidationPipe) dto: UpdateAssetDto,
|
||||||
): Promise<AssetResponseDto> {
|
): Promise<AssetResponseDto> {
|
||||||
await this.assetService.checkAssetsAccess(authUser, [assetId], true);
|
await this.assetService.checkAssetsAccess(authUser, [assetId], true);
|
||||||
return await this.assetService.updateAssetById(assetId, dto);
|
return await this.assetService.updateAsset(authUser, assetId, dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Delete('/')
|
@Delete('/')
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Module } from '@nestjs/common';
|
import { forwardRef, Module } from '@nestjs/common';
|
||||||
import { AssetService } from './asset.service';
|
import { AssetService } from './asset.service';
|
||||||
import { AssetController } from './asset.controller';
|
import { AssetController } from './asset.controller';
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
@ -10,18 +10,25 @@ import { CommunicationModule } from '../communication/communication.module';
|
||||||
import { QueueNameEnum } from '@app/job/constants/queue-name.constant';
|
import { QueueNameEnum } from '@app/job/constants/queue-name.constant';
|
||||||
import { AssetRepository, ASSET_REPOSITORY } from './asset-repository';
|
import { AssetRepository, ASSET_REPOSITORY } from './asset-repository';
|
||||||
import { DownloadModule } from '../../modules/download/download.module';
|
import { DownloadModule } from '../../modules/download/download.module';
|
||||||
import { ALBUM_REPOSITORY, AlbumRepository } from '../album/album-repository';
|
import { TagModule } from '../tag/tag.module';
|
||||||
import { AlbumEntity } from '@app/database/entities/album.entity';
|
import { AlbumModule } from '../album/album.module';
|
||||||
import { UserAlbumEntity } from '@app/database/entities/user-album.entity';
|
import { UserModule } from '../user/user.module';
|
||||||
import { UserEntity } from '@app/database/entities/user.entity';
|
|
||||||
import { AssetAlbumEntity } from '@app/database/entities/asset-album.entity';
|
const ASSET_REPOSITORY_PROVIDER = {
|
||||||
|
provide: ASSET_REPOSITORY,
|
||||||
|
useClass: AssetRepository,
|
||||||
|
};
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
|
TypeOrmModule.forFeature([AssetEntity]),
|
||||||
CommunicationModule,
|
CommunicationModule,
|
||||||
BackgroundTaskModule,
|
BackgroundTaskModule,
|
||||||
DownloadModule,
|
DownloadModule,
|
||||||
TypeOrmModule.forFeature([AssetEntity, AlbumEntity, UserAlbumEntity, UserEntity, AssetAlbumEntity]),
|
UserModule,
|
||||||
|
AlbumModule,
|
||||||
|
TagModule,
|
||||||
|
forwardRef(() => AlbumModule),
|
||||||
BullModule.registerQueue({
|
BullModule.registerQueue({
|
||||||
name: QueueNameEnum.ASSET_UPLOADED,
|
name: QueueNameEnum.ASSET_UPLOADED,
|
||||||
defaultJobOptions: {
|
defaultJobOptions: {
|
||||||
|
@ -40,18 +47,7 @@ import { AssetAlbumEntity } from '@app/database/entities/asset-album.entity';
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
controllers: [AssetController],
|
controllers: [AssetController],
|
||||||
providers: [
|
providers: [AssetService, BackgroundTaskService, ASSET_REPOSITORY_PROVIDER],
|
||||||
AssetService,
|
exports: [ASSET_REPOSITORY_PROVIDER],
|
||||||
BackgroundTaskService,
|
|
||||||
{
|
|
||||||
provide: ASSET_REPOSITORY,
|
|
||||||
useClass: AssetRepository,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
provide: ALBUM_REPOSITORY,
|
|
||||||
useClass: AlbumRepository,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
exports: [AssetService],
|
|
||||||
})
|
})
|
||||||
export class AssetModule {}
|
export class AssetModule {}
|
||||||
|
|
|
@ -231,13 +231,13 @@ export class AssetService {
|
||||||
return mapAsset(asset);
|
return mapAsset(asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async updateAssetById(assetId: string, dto: UpdateAssetDto): Promise<AssetResponseDto> {
|
public async updateAsset(authUser: AuthUserDto, assetId: string, dto: UpdateAssetDto): Promise<AssetResponseDto> {
|
||||||
const asset = await this._assetRepository.getById(assetId);
|
const asset = await this._assetRepository.getById(assetId);
|
||||||
if (!asset) {
|
if (!asset) {
|
||||||
throw new BadRequestException('Asset not found');
|
throw new BadRequestException('Asset not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
const updatedAsset = await this._assetRepository.update(asset, dto);
|
const updatedAsset = await this._assetRepository.update(authUser.id, asset, dto);
|
||||||
|
|
||||||
return mapAsset(updatedAsset);
|
return mapAsset(updatedAsset);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,24 @@
|
||||||
import { IsBoolean } from 'class-validator';
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
import { IsArray, IsBoolean, IsNotEmpty, IsOptional, IsString } from 'class-validator';
|
||||||
|
|
||||||
export class UpdateAssetDto {
|
export class UpdateAssetDto {
|
||||||
|
@IsOptional()
|
||||||
@IsBoolean()
|
@IsBoolean()
|
||||||
isFavorite!: boolean;
|
isFavorite?: boolean;
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsArray()
|
||||||
|
@IsString({ each: true })
|
||||||
|
@IsNotEmpty({ each: true })
|
||||||
|
@ApiProperty({
|
||||||
|
isArray: true,
|
||||||
|
type: String,
|
||||||
|
title: 'Array of tag IDs to add to the asset',
|
||||||
|
example: [
|
||||||
|
'bf973405-3f2a-48d2-a687-2ed4167164be',
|
||||||
|
'dd41870b-5d00-46d2-924e-1d8489a0aa0f',
|
||||||
|
'fad77c3f-deef-4e7e-9608-14c1aa4e559a',
|
||||||
|
],
|
||||||
|
})
|
||||||
|
tagIds?: string[];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
|
import { AssetEntity, AssetType } from '@app/database/entities/asset.entity';
|
||||||
import { ApiProperty } from '@nestjs/swagger';
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
import { mapTag, TagResponseDto } from '../../tag/response-dto/tag-response.dto';
|
||||||
import { ExifResponseDto, mapExif } from './exif-response.dto';
|
import { ExifResponseDto, mapExif } from './exif-response.dto';
|
||||||
import { SmartInfoResponseDto, mapSmartInfo } from './smart-info-response.dto';
|
import { SmartInfoResponseDto, mapSmartInfo } from './smart-info-response.dto';
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ export class AssetResponseDto {
|
||||||
exifInfo?: ExifResponseDto;
|
exifInfo?: ExifResponseDto;
|
||||||
smartInfo?: SmartInfoResponseDto;
|
smartInfo?: SmartInfoResponseDto;
|
||||||
livePhotoVideoId?: string | null;
|
livePhotoVideoId?: string | null;
|
||||||
|
tags!: TagResponseDto[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function mapAsset(entity: AssetEntity): AssetResponseDto {
|
export function mapAsset(entity: AssetEntity): AssetResponseDto {
|
||||||
|
@ -44,5 +46,6 @@ export function mapAsset(entity: AssetEntity): AssetResponseDto {
|
||||||
exifInfo: entity.exifInfo ? mapExif(entity.exifInfo) : undefined,
|
exifInfo: entity.exifInfo ? mapExif(entity.exifInfo) : undefined,
|
||||||
smartInfo: entity.smartInfo ? mapSmartInfo(entity.smartInfo) : undefined,
|
smartInfo: entity.smartInfo ? mapSmartInfo(entity.smartInfo) : undefined,
|
||||||
livePhotoVideoId: entity.livePhotoVideoId,
|
livePhotoVideoId: entity.livePhotoVideoId,
|
||||||
|
tags: entity.tags?.map(mapTag),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,21 @@ import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service';
|
||||||
import { ImmichJwtModule } from '../../modules/immich-jwt/immich-jwt.module';
|
import { ImmichJwtModule } from '../../modules/immich-jwt/immich-jwt.module';
|
||||||
import { JwtModule } from '@nestjs/jwt';
|
import { JwtModule } from '@nestjs/jwt';
|
||||||
import { jwtConfig } from '../../config/jwt.config';
|
import { jwtConfig } from '../../config/jwt.config';
|
||||||
import { UserEntity } from '@app/database/entities/user.entity';
|
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
import { BullModule } from '@nestjs/bull';
|
import { BullModule } from '@nestjs/bull';
|
||||||
import { QueueNameEnum } from '@app/job';
|
import { QueueNameEnum } from '@app/job';
|
||||||
import { AssetEntity } from '@app/database/entities/asset.entity';
|
|
||||||
import { ExifEntity } from '@app/database/entities/exif.entity';
|
import { ExifEntity } from '@app/database/entities/exif.entity';
|
||||||
import { AssetRepository, ASSET_REPOSITORY } from '../asset/asset-repository';
|
import { TagModule } from '../tag/tag.module';
|
||||||
|
import { AssetModule } from '../asset/asset.module';
|
||||||
|
import { UserModule } from '../user/user.module';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
TypeOrmModule.forFeature([UserEntity, AssetEntity, ExifEntity]),
|
TypeOrmModule.forFeature([ExifEntity]),
|
||||||
ImmichJwtModule,
|
ImmichJwtModule,
|
||||||
|
TagModule,
|
||||||
|
AssetModule,
|
||||||
|
UserModule,
|
||||||
JwtModule.register(jwtConfig),
|
JwtModule.register(jwtConfig),
|
||||||
BullModule.registerQueue(
|
BullModule.registerQueue(
|
||||||
{
|
{
|
||||||
|
@ -70,13 +73,6 @@ import { AssetRepository, ASSET_REPOSITORY } from '../asset/asset-repository';
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
controllers: [JobController],
|
controllers: [JobController],
|
||||||
providers: [
|
providers: [JobService, ImmichJwtService],
|
||||||
JobService,
|
|
||||||
ImmichJwtService,
|
|
||||||
{
|
|
||||||
provide: ASSET_REPOSITORY,
|
|
||||||
useClass: AssetRepository,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
})
|
||||||
export class JobModule {}
|
export class JobModule {}
|
||||||
|
|
14
server/apps/immich/src/api-v1/tag/dto/create-tag.dto.ts
Normal file
14
server/apps/immich/src/api-v1/tag/dto/create-tag.dto.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
import { TagType } from '@app/database/entities/tag.entity';
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
import { IsEnum, IsNotEmpty, IsString } from 'class-validator';
|
||||||
|
|
||||||
|
export class CreateTagDto {
|
||||||
|
@IsString()
|
||||||
|
@IsNotEmpty()
|
||||||
|
name!: string;
|
||||||
|
|
||||||
|
@IsEnum(TagType)
|
||||||
|
@IsNotEmpty()
|
||||||
|
@ApiProperty({ enumName: 'TagTypeEnum', enum: TagType })
|
||||||
|
type!: TagType;
|
||||||
|
}
|
11
server/apps/immich/src/api-v1/tag/dto/update-tag.dto.ts
Normal file
11
server/apps/immich/src/api-v1/tag/dto/update-tag.dto.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { IsOptional, IsString } from 'class-validator';
|
||||||
|
|
||||||
|
export class UpdateTagDto {
|
||||||
|
@IsString()
|
||||||
|
@IsOptional()
|
||||||
|
name?: string;
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
@IsOptional()
|
||||||
|
renameTagId?: string;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { TagEntity, TagType } from '@app/database/entities/tag.entity';
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
export class TagResponseDto {
|
||||||
|
@ApiProperty()
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@ApiProperty({ enumName: 'TagTypeEnum', enum: TagType })
|
||||||
|
type!: string;
|
||||||
|
|
||||||
|
name!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mapTag(entity: TagEntity): TagResponseDto {
|
||||||
|
return {
|
||||||
|
id: entity.id,
|
||||||
|
type: entity.type,
|
||||||
|
name: entity.name,
|
||||||
|
};
|
||||||
|
}
|
44
server/apps/immich/src/api-v1/tag/tag.controller.ts
Normal file
44
server/apps/immich/src/api-v1/tag/tag.controller.ts
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
import { Controller, Get, Post, Body, Patch, Param, Delete, ValidationPipe } from '@nestjs/common';
|
||||||
|
import { TagService } from './tag.service';
|
||||||
|
import { CreateTagDto } from './dto/create-tag.dto';
|
||||||
|
import { UpdateTagDto } from './dto/update-tag.dto';
|
||||||
|
import { Authenticated } from '../../decorators/authenticated.decorator';
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator';
|
||||||
|
import { TagEntity } from '@app/database/entities/tag.entity';
|
||||||
|
|
||||||
|
@Authenticated()
|
||||||
|
@ApiTags('Tag')
|
||||||
|
@Controller('tag')
|
||||||
|
export class TagController {
|
||||||
|
constructor(private readonly tagService: TagService) {}
|
||||||
|
|
||||||
|
@Post()
|
||||||
|
create(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) createTagDto: CreateTagDto): Promise<TagEntity> {
|
||||||
|
return this.tagService.create(authUser, createTagDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
findAll(@GetAuthUser() authUser: AuthUserDto) {
|
||||||
|
return this.tagService.findAll(authUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get(':id')
|
||||||
|
findOne(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string) {
|
||||||
|
return this.tagService.findOne(authUser, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Patch(':id')
|
||||||
|
update(
|
||||||
|
@GetAuthUser() authUser: AuthUserDto,
|
||||||
|
@Param('id') id: string,
|
||||||
|
@Body(ValidationPipe) updateTagDto: UpdateTagDto,
|
||||||
|
) {
|
||||||
|
return this.tagService.update(authUser, id, updateTagDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Delete(':id')
|
||||||
|
delete(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string) {
|
||||||
|
return this.tagService.remove(authUser, id);
|
||||||
|
}
|
||||||
|
}
|
18
server/apps/immich/src/api-v1/tag/tag.module.ts
Normal file
18
server/apps/immich/src/api-v1/tag/tag.module.ts
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { TagService } from './tag.service';
|
||||||
|
import { TagController } from './tag.controller';
|
||||||
|
import { TagEntity } from '@app/database/entities/tag.entity';
|
||||||
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
import { TagRepository, TAG_REPOSITORY } from './tag.repository';
|
||||||
|
|
||||||
|
const TAG_REPOSITORY_PROVIDER = {
|
||||||
|
provide: TAG_REPOSITORY,
|
||||||
|
useClass: TagRepository,
|
||||||
|
};
|
||||||
|
@Module({
|
||||||
|
imports: [TypeOrmModule.forFeature([TagEntity])],
|
||||||
|
controllers: [TagController],
|
||||||
|
providers: [TagService, TAG_REPOSITORY_PROVIDER],
|
||||||
|
exports: [TAG_REPOSITORY_PROVIDER],
|
||||||
|
})
|
||||||
|
export class TagModule {}
|
61
server/apps/immich/src/api-v1/tag/tag.repository.ts
Normal file
61
server/apps/immich/src/api-v1/tag/tag.repository.ts
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
import { TagEntity, TagType } from '@app/database/entities/tag.entity';
|
||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
|
import { In, Repository } from 'typeorm';
|
||||||
|
import { UpdateTagDto } from './dto/update-tag.dto';
|
||||||
|
|
||||||
|
export interface ITagRepository {
|
||||||
|
create(userId: string, tagType: TagType, tagName: string): Promise<TagEntity>;
|
||||||
|
getByIds(userId: string, tagIds: string[]): Promise<TagEntity[]>;
|
||||||
|
getById(tagId: string, userId: string): Promise<TagEntity | null>;
|
||||||
|
getByUserId(userId: string): Promise<TagEntity[]>;
|
||||||
|
update(tag: TagEntity, updateTagDto: UpdateTagDto): Promise<TagEntity | null>;
|
||||||
|
remove(tag: TagEntity): Promise<TagEntity>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TAG_REPOSITORY = 'TAG_REPOSITORY';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class TagRepository implements ITagRepository {
|
||||||
|
constructor(
|
||||||
|
@InjectRepository(TagEntity)
|
||||||
|
private tagRepository: Repository<TagEntity>,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
async create(userId: string, tagType: TagType, tagName: string): Promise<TagEntity> {
|
||||||
|
const tag = new TagEntity();
|
||||||
|
tag.name = tagName;
|
||||||
|
tag.type = tagType;
|
||||||
|
tag.userId = userId;
|
||||||
|
|
||||||
|
return this.tagRepository.save(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
async getById(tagId: string, userId: string): Promise<TagEntity | null> {
|
||||||
|
return await this.tagRepository.findOne({ where: { id: tagId, userId }, relations: ['user'] });
|
||||||
|
}
|
||||||
|
|
||||||
|
async getByIds(userId: string, tagIds: string[]): Promise<TagEntity[]> {
|
||||||
|
return await this.tagRepository.find({
|
||||||
|
where: { id: In(tagIds), userId },
|
||||||
|
relations: {
|
||||||
|
user: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getByUserId(userId: string): Promise<TagEntity[]> {
|
||||||
|
return await this.tagRepository.find({ where: { userId } });
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(tag: TagEntity, updateTagDto: UpdateTagDto): Promise<TagEntity> {
|
||||||
|
tag.name = updateTagDto.name ?? tag.name;
|
||||||
|
tag.renameTagId = updateTagDto.renameTagId ?? tag.renameTagId;
|
||||||
|
|
||||||
|
return this.tagRepository.save(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
async remove(tag: TagEntity): Promise<TagEntity> {
|
||||||
|
return await this.tagRepository.remove(tag);
|
||||||
|
}
|
||||||
|
}
|
91
server/apps/immich/src/api-v1/tag/tag.service.spec.ts
Normal file
91
server/apps/immich/src/api-v1/tag/tag.service.spec.ts
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
import { TagEntity, TagType } from '@app/database/entities/tag.entity';
|
||||||
|
import { UserEntity } from '@app/database/entities/user.entity';
|
||||||
|
import { AuthUserDto } from '../../decorators/auth-user.decorator';
|
||||||
|
import { ITagRepository } from './tag.repository';
|
||||||
|
import { TagService } from './tag.service';
|
||||||
|
|
||||||
|
describe('TagService', () => {
|
||||||
|
let sut: TagService;
|
||||||
|
let tagRepositoryMock: jest.Mocked<ITagRepository>;
|
||||||
|
|
||||||
|
const user1AuthUser: AuthUserDto = Object.freeze({
|
||||||
|
id: '1111',
|
||||||
|
email: 'testuser@email.com',
|
||||||
|
});
|
||||||
|
|
||||||
|
const user1: UserEntity = Object.freeze({
|
||||||
|
id: '1111',
|
||||||
|
firstName: 'Alex',
|
||||||
|
lastName: 'Tran',
|
||||||
|
isAdmin: true,
|
||||||
|
email: 'testuser@email.com',
|
||||||
|
profileImagePath: '',
|
||||||
|
shouldChangePassword: true,
|
||||||
|
createdAt: '2022-12-02T19:29:23.603Z',
|
||||||
|
deletedAt: undefined,
|
||||||
|
tags: [],
|
||||||
|
oauthId: 'oauth-id-1',
|
||||||
|
});
|
||||||
|
|
||||||
|
// const user2: UserEntity = Object.freeze({
|
||||||
|
// id: '2222',
|
||||||
|
// firstName: 'Alex',
|
||||||
|
// lastName: 'Tran',
|
||||||
|
// isAdmin: true,
|
||||||
|
// email: 'testuser2@email.com',
|
||||||
|
// profileImagePath: '',
|
||||||
|
// shouldChangePassword: true,
|
||||||
|
// createdAt: '2022-12-02T19:29:23.603Z',
|
||||||
|
// deletedAt: undefined,
|
||||||
|
// tags: [],
|
||||||
|
// oauthId: 'oauth-id-2',
|
||||||
|
// });
|
||||||
|
|
||||||
|
const user1Tag1: TagEntity = Object.freeze({
|
||||||
|
name: 'user 1 tag 1',
|
||||||
|
type: TagType.CUSTOM,
|
||||||
|
userId: user1.id,
|
||||||
|
user: user1,
|
||||||
|
renameTagId: '',
|
||||||
|
id: 'user1-tag-1-id',
|
||||||
|
assets: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
// const user1Tag2: TagEntity = Object.freeze({
|
||||||
|
// name: 'user 1 tag 2',
|
||||||
|
// type: TagType.CUSTOM,
|
||||||
|
// userId: user1.id,
|
||||||
|
// user: user1,
|
||||||
|
// renameTagId: '',
|
||||||
|
// id: 'user1-tag-2-id',
|
||||||
|
// assets: [],
|
||||||
|
// });
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
tagRepositoryMock = {
|
||||||
|
create: jest.fn(),
|
||||||
|
getByIds: jest.fn(),
|
||||||
|
getById: jest.fn(),
|
||||||
|
getByUserId: jest.fn(),
|
||||||
|
remove: jest.fn(),
|
||||||
|
update: jest.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
sut = new TagService(tagRepositoryMock);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('creates tag', async () => {
|
||||||
|
const createTagDto = {
|
||||||
|
name: 'user 1 tag 1',
|
||||||
|
type: TagType.CUSTOM,
|
||||||
|
};
|
||||||
|
|
||||||
|
tagRepositoryMock.create.mockResolvedValue(user1Tag1);
|
||||||
|
|
||||||
|
const result = await sut.create(user1AuthUser, createTagDto);
|
||||||
|
|
||||||
|
expect(result.userId).toEqual(user1AuthUser.id);
|
||||||
|
expect(result.name).toEqual(createTagDto.name);
|
||||||
|
expect(result.type).toEqual(createTagDto.type);
|
||||||
|
});
|
||||||
|
});
|
48
server/apps/immich/src/api-v1/tag/tag.service.ts
Normal file
48
server/apps/immich/src/api-v1/tag/tag.service.ts
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
import { TagEntity } from '@app/database/entities/tag.entity';
|
||||||
|
import { BadRequestException, Inject, Injectable, Logger } from '@nestjs/common';
|
||||||
|
import { AuthUserDto } from '../../decorators/auth-user.decorator';
|
||||||
|
import { CreateTagDto } from './dto/create-tag.dto';
|
||||||
|
import { UpdateTagDto } from './dto/update-tag.dto';
|
||||||
|
import { ITagRepository, TAG_REPOSITORY } from './tag.repository';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class TagService {
|
||||||
|
readonly logger = new Logger(TagService.name);
|
||||||
|
|
||||||
|
constructor(@Inject(TAG_REPOSITORY) private _tagRepository: ITagRepository) {}
|
||||||
|
|
||||||
|
async create(authUser: AuthUserDto, createTagDto: CreateTagDto) {
|
||||||
|
try {
|
||||||
|
return await this._tagRepository.create(authUser.id, createTagDto.type, createTagDto.name);
|
||||||
|
} catch (e: any) {
|
||||||
|
this.logger.error(e, e.stack);
|
||||||
|
throw new BadRequestException(`Failed to create tag: ${e.detail}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async findAll(authUser: AuthUserDto) {
|
||||||
|
return await this._tagRepository.getByUserId(authUser.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
async findOne(authUser: AuthUserDto, id: string): Promise<TagEntity> {
|
||||||
|
const tag = await this._tagRepository.getById(id, authUser.id);
|
||||||
|
|
||||||
|
if (!tag) {
|
||||||
|
throw new BadRequestException('Tag not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
async update(authUser: AuthUserDto, id: string, updateTagDto: UpdateTagDto) {
|
||||||
|
const tag = await this.findOne(authUser, id);
|
||||||
|
|
||||||
|
return this._tagRepository.update(tag, updateTagDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
async remove(authUser: AuthUserDto, id: string) {
|
||||||
|
const tag = await this.findOne(authUser, id);
|
||||||
|
|
||||||
|
return this._tagRepository.remove(tag);
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,6 +31,7 @@ describe('UserService', () => {
|
||||||
shouldChangePassword: false,
|
shouldChangePassword: false,
|
||||||
profileImagePath: '',
|
profileImagePath: '',
|
||||||
createdAt: '2021-01-01',
|
createdAt: '2021-01-01',
|
||||||
|
tags: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
const immichUser: UserEntity = Object.freeze({
|
const immichUser: UserEntity = Object.freeze({
|
||||||
|
@ -45,6 +46,7 @@ describe('UserService', () => {
|
||||||
shouldChangePassword: false,
|
shouldChangePassword: false,
|
||||||
profileImagePath: '',
|
profileImagePath: '',
|
||||||
createdAt: '2021-01-01',
|
createdAt: '2021-01-01',
|
||||||
|
tags: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
const updatedImmichUser: UserEntity = Object.freeze({
|
const updatedImmichUser: UserEntity = Object.freeze({
|
||||||
|
@ -59,6 +61,7 @@ describe('UserService', () => {
|
||||||
shouldChangePassword: true,
|
shouldChangePassword: true,
|
||||||
profileImagePath: '',
|
profileImagePath: '',
|
||||||
createdAt: '2021-01-01',
|
createdAt: '2021-01-01',
|
||||||
|
tags: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { DatabaseModule } from '@app/database';
|
||||||
import { JobModule } from './api-v1/job/job.module';
|
import { JobModule } from './api-v1/job/job.module';
|
||||||
import { SystemConfigModule } from './api-v1/system-config/system-config.module';
|
import { SystemConfigModule } from './api-v1/system-config/system-config.module';
|
||||||
import { OAuthModule } from './api-v1/oauth/oauth.module';
|
import { OAuthModule } from './api-v1/oauth/oauth.module';
|
||||||
|
import { TagModule } from './api-v1/tag/tag.module';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -63,6 +64,8 @@ import { OAuthModule } from './api-v1/oauth/oauth.module';
|
||||||
JobModule,
|
JobModule,
|
||||||
|
|
||||||
SystemConfigModule,
|
SystemConfigModule,
|
||||||
|
|
||||||
|
TagModule,
|
||||||
],
|
],
|
||||||
controllers: [AppController],
|
controllers: [AppController],
|
||||||
providers: [],
|
providers: [],
|
||||||
|
|
|
@ -55,7 +55,7 @@ async function bootstrap() {
|
||||||
if (process.env.NODE_ENV == 'development') {
|
if (process.env.NODE_ENV == 'development') {
|
||||||
// Generate API Documentation only in development mode
|
// Generate API Documentation only in development mode
|
||||||
const outputPath = path.resolve(process.cwd(), 'immich-openapi-specs.json');
|
const outputPath = path.resolve(process.cwd(), 'immich-openapi-specs.json');
|
||||||
writeFileSync(outputPath, JSON.stringify(apiDocument), { encoding: 'utf8' });
|
writeFileSync(outputPath, JSON.stringify(apiDocument, null, 2), { encoding: 'utf8' });
|
||||||
Logger.log(
|
Logger.log(
|
||||||
`Running Immich Server in DEVELOPMENT environment - version ${serverVersion.major}.${serverVersion.minor}.${serverVersion.patch}`,
|
`Running Immich Server in DEVELOPMENT environment - version ${serverVersion.major}.${serverVersion.minor}.${serverVersion.patch}`,
|
||||||
'ImmichServer',
|
'ImmichServer',
|
||||||
|
|
|
@ -56,6 +56,7 @@ describe('ImmichJwtService', () => {
|
||||||
profileImagePath: '',
|
profileImagePath: '',
|
||||||
shouldChangePassword: false,
|
shouldChangePassword: false,
|
||||||
createdAt: 'today',
|
createdAt: 'today',
|
||||||
|
tags: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
const dto: LoginResponseDto = {
|
const dto: LoginResponseDto = {
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,7 @@
|
||||||
import { Column, Entity, Index, OneToOne, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
import { Column, Entity, Index, JoinTable, ManyToMany, OneToOne, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
||||||
import { ExifEntity } from './exif.entity';
|
import { ExifEntity } from './exif.entity';
|
||||||
import { SmartInfoEntity } from './smart-info.entity';
|
import { SmartInfoEntity } from './smart-info.entity';
|
||||||
|
import { TagEntity } from './tag.entity';
|
||||||
|
|
||||||
@Entity('assets')
|
@Entity('assets')
|
||||||
@Unique('UQ_userid_checksum', ['userId', 'checksum'])
|
@Unique('UQ_userid_checksum', ['userId', 'checksum'])
|
||||||
|
@ -62,6 +63,11 @@ export class AssetEntity {
|
||||||
|
|
||||||
@OneToOne(() => SmartInfoEntity, (smartInfoEntity) => smartInfoEntity.asset)
|
@OneToOne(() => SmartInfoEntity, (smartInfoEntity) => smartInfoEntity.asset)
|
||||||
smartInfo?: SmartInfoEntity;
|
smartInfo?: SmartInfoEntity;
|
||||||
|
|
||||||
|
// https://github.com/typeorm/typeorm/blob/master/docs/many-to-many-relations.md
|
||||||
|
@ManyToMany(() => TagEntity, (tag) => tag.assets, { cascade: true })
|
||||||
|
@JoinTable({ name: 'tag_asset' })
|
||||||
|
tags!: TagEntity[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum AssetType {
|
export enum AssetType {
|
||||||
|
|
45
server/libs/database/src/entities/tag.entity.ts
Normal file
45
server/libs/database/src/entities/tag.entity.ts
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import { Column, Entity, ManyToMany, ManyToOne, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
||||||
|
import { AssetEntity } from './asset.entity';
|
||||||
|
import { UserEntity } from './user.entity';
|
||||||
|
|
||||||
|
@Entity('tags')
|
||||||
|
@Unique('UQ_tag_name_userId', ['name', 'userId'])
|
||||||
|
export class TagEntity {
|
||||||
|
@PrimaryGeneratedColumn('uuid')
|
||||||
|
id!: string;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
type!: TagType;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
name!: string;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
userId!: string;
|
||||||
|
|
||||||
|
@Column({ type: 'uuid', comment: 'The new renamed tagId', nullable: true })
|
||||||
|
renameTagId!: string;
|
||||||
|
|
||||||
|
@ManyToMany(() => AssetEntity, (asset) => asset.tags)
|
||||||
|
assets!: AssetEntity[];
|
||||||
|
|
||||||
|
@ManyToOne(() => UserEntity, (user) => user.tags)
|
||||||
|
user!: UserEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum TagType {
|
||||||
|
/**
|
||||||
|
* Tag that is detected by the ML model for object detection will use this type
|
||||||
|
*/
|
||||||
|
OBJECT = 'OBJECT',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Face that is detected by the ML model for facial detection (TBD/NOT YET IMPLEMENTED) will use this type
|
||||||
|
*/
|
||||||
|
FACE = 'FACE',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag that is created by the user will use this type
|
||||||
|
*/
|
||||||
|
CUSTOM = 'CUSTOM',
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
import { Column, CreateDateColumn, DeleteDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm';
|
import { Column, CreateDateColumn, DeleteDateColumn, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
|
||||||
|
import { TagEntity } from './tag.entity';
|
||||||
|
|
||||||
@Entity('users')
|
@Entity('users')
|
||||||
export class UserEntity {
|
export class UserEntity {
|
||||||
|
@ -37,4 +38,7 @@ export class UserEntity {
|
||||||
|
|
||||||
@DeleteDateColumn()
|
@DeleteDateColumn()
|
||||||
deletedAt?: Date;
|
deletedAt?: Date;
|
||||||
|
|
||||||
|
@OneToMany(() => TagEntity, (tag) => tag.user)
|
||||||
|
tags!: TagEntity[];
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
export class CreateTagsTable1670257571385 implements MigrationInterface {
|
||||||
|
name = 'CreateTagsTable1670257571385'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "tags" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "type" character varying NOT NULL, "name" character varying NOT NULL, "userId" uuid NOT NULL, "renameTagId" uuid, CONSTRAINT "UQ_tag_name_userId" UNIQUE ("name", "userId"), CONSTRAINT "PK_e7dc17249a1148a1970748eda99" PRIMARY KEY ("id")); COMMENT ON COLUMN "tags"."renameTagId" IS 'The new renamed tagId'`);
|
||||||
|
await queryRunner.query(`CREATE TABLE "tag_asset" ("assetsId" uuid NOT NULL, "tagsId" uuid NOT NULL, CONSTRAINT "PK_ef5346fe522b5fb3bc96454747e" PRIMARY KEY ("assetsId", "tagsId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_f8e8a9e893cb5c54907f1b798e" ON "tag_asset" ("assetsId") `);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_e99f31ea4cdf3a2c35c7287eb4" ON "tag_asset" ("tagsId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "tags" ADD CONSTRAINT "FK_92e67dc508c705dd66c94615576" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "tag_asset" ADD CONSTRAINT "FK_f8e8a9e893cb5c54907f1b798e9" FOREIGN KEY ("assetsId") REFERENCES "assets"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "tag_asset" ADD CONSTRAINT "FK_e99f31ea4cdf3a2c35c7287eb42" FOREIGN KEY ("tagsId") REFERENCES "tags"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "tag_asset" DROP CONSTRAINT "FK_e99f31ea4cdf3a2c35c7287eb42"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "tag_asset" DROP CONSTRAINT "FK_f8e8a9e893cb5c54907f1b798e9"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "tags" DROP CONSTRAINT "FK_92e67dc508c705dd66c94615576"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_e99f31ea4cdf3a2c35c7287eb4"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_f8e8a9e893cb5c54907f1b798e"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "tag_asset"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "tags"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
943
web/src/api/open-api/api.ts
generated
943
web/src/api/open-api/api.ts
generated
File diff suppressed because it is too large
Load diff
|
@ -183,7 +183,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
const toggleFavorite = async () => {
|
const toggleFavorite = async () => {
|
||||||
const { data } = await api.assetApi.updateAssetById(asset.id, {
|
const { data } = await api.assetApi.updateAsset(asset.id, {
|
||||||
isFavorite: !asset.isFavorite
|
isFavorite: !asset.isFavorite
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,9 @@
|
||||||
style={`width: ${getStorageUsagePercentage()}%`}
|
style={`width: ${getStorageUsagePercentage()}%`}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-xs">{asByteUnitString(serverInfo?.diskUseRaw)} of {asByteUnitString(serverInfo?.diskSizeRaw)} used</p>
|
<p class="text-xs">
|
||||||
|
{asByteUnitString(serverInfo?.diskUseRaw)} of {asByteUnitString(serverInfo?.diskSizeRaw)} used
|
||||||
|
</p>
|
||||||
{:else}
|
{:else}
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
<LoadingSpinner />
|
<LoadingSpinner />
|
||||||
|
|
|
@ -115,9 +115,7 @@
|
||||||
<input
|
<input
|
||||||
disabled
|
disabled
|
||||||
class="bg-gray-100 border w-full p-1 rounded-md text-[10px] px-2"
|
class="bg-gray-100 border w-full p-1 rounded-md text-[10px] px-2"
|
||||||
value={`[${getBytesWithUnit(uploadAsset.file.size)}] ${
|
value={`[${getBytesWithUnit(uploadAsset.file.size)}] ${uploadAsset.file.name}`}
|
||||||
uploadAsset.file.name
|
|
||||||
}`}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="w-full bg-gray-300 h-[15px] rounded-md mt-[5px] text-white relative">
|
<div class="w-full bg-gray-300 h-[15px] rounded-md mt-[5px] text-white relative">
|
||||||
|
|
Loading…
Reference in a new issue