diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index 92f15f288..c223c71b2 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -14,7 +14,6 @@ doc/AssetApi.md doc/AssetCountByTimeBucket.md doc/AssetCountByTimeBucketResponseDto.md doc/AssetCountByUserIdResponseDto.md -doc/AssetEntity.md doc/AssetFileUploadResponseDto.md doc/AssetResponseDto.md doc/AssetTypeEnum.md @@ -36,7 +35,6 @@ doc/DeleteAssetStatus.md doc/DeviceInfoApi.md doc/DeviceInfoResponseDto.md doc/DeviceTypeEnum.md -doc/ExifEntity.md doc/ExifResponseDto.md doc/GetAssetByTimeBucketDto.md doc/GetAssetCountByTimeBucketDto.md @@ -61,14 +59,12 @@ doc/ServerPingResponse.md doc/ServerStatsResponseDto.md doc/ServerVersionReponseDto.md doc/SignUpDto.md -doc/SmartInfoEntity.md doc/SmartInfoResponseDto.md doc/SystemConfigApi.md doc/SystemConfigKey.md doc/SystemConfigResponseDto.md doc/SystemConfigResponseItem.md doc/TagApi.md -doc/TagEntity.md doc/TagResponseDto.md doc/TagTypeEnum.md doc/ThumbnailFormat.md @@ -81,7 +77,6 @@ doc/UpdateUserDto.md doc/UsageByUserDto.md doc/UserApi.md doc/UserCountResponseDto.md -doc/UserEntity.md doc/UserResponseDto.md doc/ValidateAccessTokenResponseDto.md git_push.sh @@ -114,7 +109,6 @@ lib/model/all_job_status_response_dto.dart lib/model/asset_count_by_time_bucket.dart lib/model/asset_count_by_time_bucket_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_response_dto.dart lib/model/asset_type_enum.dart @@ -134,7 +128,6 @@ lib/model/delete_asset_response_dto.dart lib/model/delete_asset_status.dart lib/model/device_info_response_dto.dart lib/model/device_type_enum.dart -lib/model/exif_entity.dart lib/model/exif_response_dto.dart lib/model/get_asset_by_time_bucket_dto.dart lib/model/get_asset_count_by_time_bucket_dto.dart @@ -156,12 +149,10 @@ lib/model/server_ping_response.dart lib/model/server_stats_response_dto.dart lib/model/server_version_reponse_dto.dart lib/model/sign_up_dto.dart -lib/model/smart_info_entity.dart lib/model/smart_info_response_dto.dart lib/model/system_config_key.dart lib/model/system_config_response_dto.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 @@ -173,7 +164,6 @@ lib/model/update_tag_dto.dart lib/model/update_user_dto.dart lib/model/usage_by_user_dto.dart lib/model/user_count_response_dto.dart -lib/model/user_entity.dart lib/model/user_response_dto.dart lib/model/validate_access_token_response_dto.dart pubspec.yaml diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 2974e839e..3f71fdba5 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -141,7 +141,6 @@ Class | Method | HTTP request | Description - [AssetCountByTimeBucket](doc//AssetCountByTimeBucket.md) - [AssetCountByTimeBucketResponseDto](doc//AssetCountByTimeBucketResponseDto.md) - [AssetCountByUserIdResponseDto](doc//AssetCountByUserIdResponseDto.md) - - [AssetEntity](doc//AssetEntity.md) - [AssetFileUploadResponseDto](doc//AssetFileUploadResponseDto.md) - [AssetResponseDto](doc//AssetResponseDto.md) - [AssetTypeEnum](doc//AssetTypeEnum.md) @@ -161,7 +160,6 @@ Class | Method | HTTP request | Description - [DeleteAssetStatus](doc//DeleteAssetStatus.md) - [DeviceInfoResponseDto](doc//DeviceInfoResponseDto.md) - [DeviceTypeEnum](doc//DeviceTypeEnum.md) - - [ExifEntity](doc//ExifEntity.md) - [ExifResponseDto](doc//ExifResponseDto.md) - [GetAssetByTimeBucketDto](doc//GetAssetByTimeBucketDto.md) - [GetAssetCountByTimeBucketDto](doc//GetAssetCountByTimeBucketDto.md) @@ -183,12 +181,10 @@ Class | Method | HTTP request | Description - [ServerStatsResponseDto](doc//ServerStatsResponseDto.md) - [ServerVersionReponseDto](doc//ServerVersionReponseDto.md) - [SignUpDto](doc//SignUpDto.md) - - [SmartInfoEntity](doc//SmartInfoEntity.md) - [SmartInfoResponseDto](doc//SmartInfoResponseDto.md) - [SystemConfigKey](doc//SystemConfigKey.md) - [SystemConfigResponseDto](doc//SystemConfigResponseDto.md) - [SystemConfigResponseItem](doc//SystemConfigResponseItem.md) - - [TagEntity](doc//TagEntity.md) - [TagResponseDto](doc//TagResponseDto.md) - [TagTypeEnum](doc//TagTypeEnum.md) - [ThumbnailFormat](doc//ThumbnailFormat.md) @@ -200,7 +196,6 @@ Class | Method | HTTP request | Description - [UpdateUserDto](doc//UpdateUserDto.md) - [UsageByUserDto](doc//UsageByUserDto.md) - [UserCountResponseDto](doc//UserCountResponseDto.md) - - [UserEntity](doc//UserEntity.md) - [UserResponseDto](doc//UserResponseDto.md) - [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md) diff --git a/mobile/openapi/doc/TagApi.md b/mobile/openapi/doc/TagApi.md index 5137a1dba..2603525e1 100644 --- a/mobile/openapi/doc/TagApi.md +++ b/mobile/openapi/doc/TagApi.md @@ -17,7 +17,7 @@ Method | HTTP request | Description # **create** -> TagEntity create(createTagDto) +> TagResponseDto create(createTagDto) @@ -44,7 +44,7 @@ Name | Type | Description | Notes ### Return type -[**TagEntity**](TagEntity.md) +[**TagResponseDto**](TagResponseDto.md) ### Authorization @@ -58,7 +58,7 @@ No authorization required [[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) +> delete(id) @@ -70,8 +70,7 @@ final api_instance = TagApi(); final id = id_example; // String | try { - final result = api_instance.delete(id); - print(result); + api_instance.delete(id); } catch (e) { print('Exception when calling TagApi->delete: $e\n'); } @@ -85,7 +84,7 @@ Name | Type | Description | Notes ### Return type -[**TagEntity**](TagEntity.md) +void (empty response body) ### Authorization @@ -94,12 +93,12 @@ No authorization required ### HTTP request headers - **Content-Type**: Not defined - - **Accept**: application/json + - **Accept**: Not defined [[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 findAll() +> List findAll() @@ -122,7 +121,7 @@ This endpoint does not need any parameter. ### Return type -[**List**](TagEntity.md) +[**List**](TagResponseDto.md) ### Authorization @@ -136,7 +135,7 @@ No authorization required [[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) +> TagResponseDto findOne(id) @@ -163,7 +162,7 @@ Name | Type | Description | Notes ### Return type -[**TagEntity**](TagEntity.md) +[**TagResponseDto**](TagResponseDto.md) ### Authorization @@ -177,7 +176,7 @@ No authorization required [[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) +> TagResponseDto update(id, updateTagDto) @@ -206,7 +205,7 @@ Name | Type | Description | Notes ### Return type -[**Object**](Object.md) +[**TagResponseDto**](TagResponseDto.md) ### Authorization diff --git a/mobile/openapi/doc/TagResponseDto.md b/mobile/openapi/doc/TagResponseDto.md index 6e2685477..31805c2a8 100644 --- a/mobile/openapi/doc/TagResponseDto.md +++ b/mobile/openapi/doc/TagResponseDto.md @@ -11,6 +11,8 @@ Name | Type | Description | Notes **id** | **String** | | **type** | [**TagTypeEnum**](TagTypeEnum.md) | | **name** | **String** | | +**userId** | **String** | | +**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) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 930cf69df..7d403fe59 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -48,7 +48,6 @@ part 'model/all_job_status_response_dto.dart'; part 'model/asset_count_by_time_bucket.dart'; part 'model/asset_count_by_time_bucket_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_response_dto.dart'; part 'model/asset_type_enum.dart'; @@ -68,7 +67,6 @@ part 'model/delete_asset_response_dto.dart'; part 'model/delete_asset_status.dart'; part 'model/device_info_response_dto.dart'; part 'model/device_type_enum.dart'; -part 'model/exif_entity.dart'; part 'model/exif_response_dto.dart'; part 'model/get_asset_by_time_bucket_dto.dart'; part 'model/get_asset_count_by_time_bucket_dto.dart'; @@ -90,12 +88,10 @@ part 'model/server_ping_response.dart'; part 'model/server_stats_response_dto.dart'; part 'model/server_version_reponse_dto.dart'; part 'model/sign_up_dto.dart'; -part 'model/smart_info_entity.dart'; part 'model/smart_info_response_dto.dart'; part 'model/system_config_key.dart'; part 'model/system_config_response_dto.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'; @@ -107,7 +103,6 @@ part 'model/update_tag_dto.dart'; part 'model/update_user_dto.dart'; part 'model/usage_by_user_dto.dart'; part 'model/user_count_response_dto.dart'; -part 'model/user_entity.dart'; part 'model/user_response_dto.dart'; part 'model/validate_access_token_response_dto.dart'; diff --git a/mobile/openapi/lib/api/tag_api.dart b/mobile/openapi/lib/api/tag_api.dart index 662b6c772..3591cf11c 100644 --- a/mobile/openapi/lib/api/tag_api.dart +++ b/mobile/openapi/lib/api/tag_api.dart @@ -48,7 +48,7 @@ class TagApi { /// Parameters: /// /// * [CreateTagDto] createTagDto (required): - Future create(CreateTagDto createTagDto,) async { + Future create(CreateTagDto createTagDto,) async { final response = await createWithHttpInfo(createTagDto,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); @@ -57,7 +57,7 @@ class TagApi { // 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 await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; } return null; @@ -96,19 +96,11 @@ class TagApi { /// Parameters: /// /// * [String] id (required): - Future delete(String id,) async { + Future 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]. @@ -137,7 +129,7 @@ class TagApi { ); } - Future?> findAll() async { + Future?> findAll() async { final response = await findAllWithHttpInfo(); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); @@ -147,8 +139,8 @@ class TagApi { // 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') as List) - .cast() + return (await apiClient.deserializeAsync(responseBody, 'List') as List) + .cast() .toList(); } @@ -188,7 +180,7 @@ class TagApi { /// Parameters: /// /// * [String] id (required): - Future findOne(String id,) async { + Future findOne(String id,) async { final response = await findOneWithHttpInfo(id,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); @@ -197,7 +189,7 @@ class TagApi { // 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 await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; } return null; @@ -240,7 +232,7 @@ class TagApi { /// * [String] id (required): /// /// * [UpdateTagDto] updateTagDto (required): - Future update(String id, UpdateTagDto updateTagDto,) async { + Future update(String id, UpdateTagDto updateTagDto,) async { final response = await updateWithHttpInfo(id, updateTagDto,); if (response.statusCode >= HttpStatus.badRequest) { throw ApiException(response.statusCode, await _decodeBodyBytes(response)); @@ -249,7 +241,7 @@ class TagApi { // 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 await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'TagResponseDto',) as TagResponseDto; } return null; diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index cf61c2a85..b65d7d7a1 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -212,8 +212,6 @@ class ApiClient { return AssetCountByTimeBucketResponseDto.fromJson(value); case 'AssetCountByUserIdResponseDto': return AssetCountByUserIdResponseDto.fromJson(value); - case 'AssetEntity': - return AssetEntity.fromJson(value); case 'AssetFileUploadResponseDto': return AssetFileUploadResponseDto.fromJson(value); case 'AssetResponseDto': @@ -252,8 +250,6 @@ class ApiClient { return DeviceInfoResponseDto.fromJson(value); case 'DeviceTypeEnum': return DeviceTypeEnumTypeTransformer().decode(value); - case 'ExifEntity': - return ExifEntity.fromJson(value); case 'ExifResponseDto': return ExifResponseDto.fromJson(value); case 'GetAssetByTimeBucketDto': @@ -296,8 +292,6 @@ class ApiClient { return ServerVersionReponseDto.fromJson(value); case 'SignUpDto': return SignUpDto.fromJson(value); - case 'SmartInfoEntity': - return SmartInfoEntity.fromJson(value); case 'SmartInfoResponseDto': return SmartInfoResponseDto.fromJson(value); case 'SystemConfigKey': @@ -306,8 +300,6 @@ class ApiClient { return SystemConfigResponseDto.fromJson(value); case 'SystemConfigResponseItem': return SystemConfigResponseItem.fromJson(value); - case 'TagEntity': - return TagEntity.fromJson(value); case 'TagResponseDto': return TagResponseDto.fromJson(value); case 'TagTypeEnum': @@ -330,8 +322,6 @@ class ApiClient { return UsageByUserDto.fromJson(value); case 'UserCountResponseDto': return UserCountResponseDto.fromJson(value); - case 'UserEntity': - return UserEntity.fromJson(value); case 'UserResponseDto': return UserResponseDto.fromJson(value); case 'ValidateAccessTokenResponseDto': diff --git a/mobile/openapi/lib/model/tag_response_dto.dart b/mobile/openapi/lib/model/tag_response_dto.dart index d4ed671a2..69626a2fc 100644 --- a/mobile/openapi/lib/model/tag_response_dto.dart +++ b/mobile/openapi/lib/model/tag_response_dto.dart @@ -16,6 +16,8 @@ class TagResponseDto { required this.id, required this.type, required this.name, + required this.userId, + this.renameTagId, }); String id; @@ -24,27 +26,41 @@ class TagResponseDto { String name; + String userId; + + String? renameTagId; + @override bool operator ==(Object other) => identical(this, other) || other is TagResponseDto && other.id == id && other.type == type && - other.name == name; + other.name == name && + other.userId == userId && + other.renameTagId == renameTagId; @override int get hashCode => // ignore: unnecessary_parenthesis (id.hashCode) + (type.hashCode) + - (name.hashCode); + (name.hashCode) + + (userId.hashCode) + + (renameTagId == null ? 0 : renameTagId!.hashCode); @override - String toString() => 'TagResponseDto[id=$id, type=$type, name=$name]'; + String toString() => 'TagResponseDto[id=$id, type=$type, name=$name, userId=$userId, renameTagId=$renameTagId]'; Map toJson() { final _json = {}; _json[r'id'] = id; _json[r'type'] = type; _json[r'name'] = name; + _json[r'userId'] = userId; + if (renameTagId != null) { + _json[r'renameTagId'] = renameTagId; + } else { + _json[r'renameTagId'] = null; + } return _json; } @@ -70,6 +86,8 @@ class TagResponseDto { id: mapValueOfType(json, r'id')!, type: TagTypeEnum.fromJson(json[r'type'])!, name: mapValueOfType(json, r'name')!, + userId: mapValueOfType(json, r'userId')!, + renameTagId: mapValueOfType(json, r'renameTagId'), ); } return null; @@ -122,6 +140,7 @@ class TagResponseDto { 'id', 'type', 'name', + 'userId', }; } diff --git a/server/apps/immich/src/api-v1/tag/response-dto/tag-response.dto.ts b/server/apps/immich/src/api-v1/tag/response-dto/tag-response.dto.ts index 973b47db6..dffb48735 100644 --- a/server/apps/immich/src/api-v1/tag/response-dto/tag-response.dto.ts +++ b/server/apps/immich/src/api-v1/tag/response-dto/tag-response.dto.ts @@ -9,6 +9,10 @@ export class TagResponseDto { type!: string; name!: string; + + userId!: string; + + renameTagId?: string | null; } export function mapTag(entity: TagEntity): TagResponseDto { @@ -16,5 +20,7 @@ export function mapTag(entity: TagEntity): TagResponseDto { id: entity.id, type: entity.type, name: entity.name, + userId: entity.userId, + renameTagId: entity.renameTagId, }; } diff --git a/server/apps/immich/src/api-v1/tag/tag.controller.ts b/server/apps/immich/src/api-v1/tag/tag.controller.ts index fb2d79f82..978033306 100644 --- a/server/apps/immich/src/api-v1/tag/tag.controller.ts +++ b/server/apps/immich/src/api-v1/tag/tag.controller.ts @@ -5,7 +5,7 @@ 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'; +import { mapTag, TagResponseDto } from "./response-dto/tag-response.dto"; @Authenticated() @ApiTags('Tag') @@ -14,18 +14,19 @@ export class TagController { constructor(private readonly tagService: TagService) {} @Post() - create(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) createTagDto: CreateTagDto): Promise { + create(@GetAuthUser() authUser: AuthUserDto, @Body(ValidationPipe) createTagDto: CreateTagDto): Promise { return this.tagService.create(authUser, createTagDto); } @Get() - findAll(@GetAuthUser() authUser: AuthUserDto) { + findAll(@GetAuthUser() authUser: AuthUserDto): Promise { return this.tagService.findAll(authUser); } @Get(':id') - findOne(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string) { - return this.tagService.findOne(authUser, id); + async findOne(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string): Promise { + const tag = await this.tagService.findOne(authUser, id); + return mapTag(tag); } @Patch(':id') @@ -33,12 +34,12 @@ export class TagController { @GetAuthUser() authUser: AuthUserDto, @Param('id') id: string, @Body(ValidationPipe) updateTagDto: UpdateTagDto, - ) { + ): Promise { return this.tagService.update(authUser, id, updateTagDto); } @Delete(':id') - delete(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string) { + delete(@GetAuthUser() authUser: AuthUserDto, @Param('id') id: string): Promise { return this.tagService.remove(authUser, id); } } diff --git a/server/apps/immich/src/api-v1/tag/tag.service.ts b/server/apps/immich/src/api-v1/tag/tag.service.ts index e14e97880..dc8c5a166 100644 --- a/server/apps/immich/src/api-v1/tag/tag.service.ts +++ b/server/apps/immich/src/api-v1/tag/tag.service.ts @@ -4,6 +4,7 @@ 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'; +import { mapTag, TagResponseDto } from "./response-dto/tag-response.dto"; @Injectable() export class TagService { @@ -13,7 +14,8 @@ export class TagService { async create(authUser: AuthUserDto, createTagDto: CreateTagDto) { try { - return await this._tagRepository.create(authUser.id, createTagDto.type, createTagDto.name); + const newTag = await this._tagRepository.create(authUser.id, createTagDto.type, createTagDto.name); + return mapTag(newTag); } catch (e: any) { this.logger.error(e, e.stack); throw new BadRequestException(`Failed to create tag: ${e.detail}`); @@ -21,7 +23,8 @@ export class TagService { } async findAll(authUser: AuthUserDto) { - return await this._tagRepository.getByUserId(authUser.id); + const tags = await this._tagRepository.getByUserId(authUser.id); + return tags.map(mapTag); } async findOne(authUser: AuthUserDto, id: string): Promise { @@ -34,15 +37,16 @@ export class TagService { return tag; } - async update(authUser: AuthUserDto, id: string, updateTagDto: UpdateTagDto) { + async update(authUser: AuthUserDto, id: string, updateTagDto: UpdateTagDto): Promise { const tag = await this.findOne(authUser, id); - return this._tagRepository.update(tag, updateTagDto); + await this._tagRepository.update(tag, updateTagDto); + + return mapTag(tag); } - async remove(authUser: AuthUserDto, id: string) { + async remove(authUser: AuthUserDto, id: string): Promise { const tag = await this.findOne(authUser, id); - - return this._tagRepository.remove(tag); + await this._tagRepository.remove(tag); } } diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 7ff2daa56..9c4c3cc59 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -1490,7 +1490,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TagEntity" + "$ref": "#/components/schemas/TagResponseDto" } } } @@ -1511,7 +1511,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/TagEntity" + "$ref": "#/components/schemas/TagResponseDto" } } } @@ -1542,7 +1542,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TagEntity" + "$ref": "#/components/schemas/TagResponseDto" } } } @@ -1580,7 +1580,7 @@ "content": { "application/json": { "schema": { - "type": "object" + "$ref": "#/components/schemas/TagResponseDto" } } } @@ -1604,14 +1604,7 @@ ], "responses": { "200": { - "description": "", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TagEntity" - } - } - } + "description": "" } }, "tags": [ @@ -2527,12 +2520,20 @@ }, "name": { "type": "string" + }, + "userId": { + "type": "string" + }, + "renameTagId": { + "type": "string", + "nullable": true } }, "required": [ "id", "type", - "name" + "name", + "userId" ] }, "AssetResponseDto": { @@ -3025,372 +3026,6 @@ "name" ] }, - "ExifEntity": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "assetId": { - "type": "string" - }, - "description": { - "type": "string", - "description": "General info" - }, - "exifImageWidth": { - "type": "number", - "nullable": true - }, - "exifImageHeight": { - "type": "number", - "nullable": true - }, - "fileSizeInByte": { - "type": "number", - "nullable": true - }, - "orientation": { - "type": "string", - "nullable": true - }, - "dateTimeOriginal": { - "format": "date-time", - "type": "string", - "nullable": true - }, - "modifyDate": { - "format": "date-time", - "type": "string", - "nullable": true - }, - "latitude": { - "type": "number", - "nullable": true - }, - "longitude": { - "type": "number", - "nullable": true - }, - "city": { - "type": "string", - "nullable": true - }, - "state": { - "type": "string", - "nullable": true - }, - "country": { - "type": "string", - "nullable": true - }, - "make": { - "type": "string", - "nullable": true, - "description": "Image info" - }, - "model": { - "type": "string", - "nullable": true - }, - "imageName": { - "type": "string", - "nullable": true - }, - "lensModel": { - "type": "string", - "nullable": true - }, - "fNumber": { - "type": "number", - "nullable": true - }, - "focalLength": { - "type": "number", - "nullable": true - }, - "iso": { - "type": "number", - "nullable": true - }, - "exposureTime": { - "type": "number", - "nullable": true - }, - "fps": { - "type": "number", - "nullable": true, - "description": "Video info" - }, - "asset": { - "$ref": "#/components/schemas/AssetEntity" - }, - "exifTextSearchableColumn": { - "type": "string" - } - }, - "required": [ - "id", - "assetId", - "description", - "exifImageWidth", - "exifImageHeight", - "fileSizeInByte", - "orientation", - "dateTimeOriginal", - "modifyDate", - "latitude", - "longitude", - "city", - "state", - "country", - "make", - "model", - "imageName", - "lensModel", - "fNumber", - "focalLength", - "iso", - "exposureTime", - "exifTextSearchableColumn" - ] - }, - "SmartInfoEntity": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "assetId": { - "type": "string" - }, - "tags": { - "nullable": true, - "type": "array", - "items": { - "type": "string" - } - }, - "objects": { - "nullable": true, - "type": "array", - "items": { - "type": "string" - } - }, - "asset": { - "$ref": "#/components/schemas/AssetEntity" - } - }, - "required": [ - "id", - "assetId", - "tags", - "objects" - ] - }, - "UserEntity": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "isAdmin": { - "type": "boolean" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - }, - "salt": { - "type": "string" - }, - "oauthId": { - "type": "string" - }, - "profileImagePath": { - "type": "string" - }, - "shouldChangePassword": { - "type": "boolean" - }, - "createdAt": { - "type": "string" - }, - "deletedAt": { - "format": "date-time", - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagEntity" - } - } - }, - "required": [ - "id", - "firstName", - "lastName", - "isAdmin", - "email", - "oauthId", - "profileImagePath", - "shouldChangePassword", - "createdAt", - "tags" - ] - }, - "TagEntity": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "enum": [ - "OBJECT", - "FACE", - "CUSTOM" - ], - "type": "string" - }, - "name": { - "type": "string" - }, - "userId": { - "type": "string" - }, - "renameTagId": { - "type": "string" - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AssetEntity" - } - }, - "user": { - "$ref": "#/components/schemas/UserEntity" - } - }, - "required": [ - "id", - "type", - "name", - "userId", - "renameTagId", - "assets", - "user" - ] - }, - "AssetEntity": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "deviceAssetId": { - "type": "string" - }, - "userId": { - "type": "string" - }, - "deviceId": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "IMAGE", - "VIDEO", - "AUDIO", - "OTHER" - ] - }, - "originalPath": { - "type": "string" - }, - "resizePath": { - "type": "string", - "nullable": true - }, - "webpPath": { - "type": "string", - "nullable": true - }, - "encodedVideoPath": { - "type": "string" - }, - "createdAt": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "isFavorite": { - "type": "boolean" - }, - "mimeType": { - "type": "string", - "nullable": true - }, - "checksum": { - "type": "object", - "nullable": true - }, - "duration": { - "type": "string", - "nullable": true - }, - "isVisible": { - "type": "boolean" - }, - "livePhotoVideoId": { - "type": "string", - "nullable": true - }, - "exifInfo": { - "$ref": "#/components/schemas/ExifEntity" - }, - "smartInfo": { - "$ref": "#/components/schemas/SmartInfoEntity" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TagEntity" - } - } - }, - "required": [ - "id", - "deviceAssetId", - "userId", - "deviceId", - "type", - "originalPath", - "resizePath", - "webpPath", - "encodedVideoPath", - "createdAt", - "modifiedAt", - "isFavorite", - "mimeType", - "duration", - "isVisible", - "livePhotoVideoId", - "tags" - ] - }, "UpdateTagDto": { "type": "object", "properties": { diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index c9874b681..db4ce2774 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -325,143 +325,6 @@ export interface AssetCountByUserIdResponseDto { */ 'total': number; } -/** - * - * @export - * @interface AssetEntity - */ -export interface AssetEntity { - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'id': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'deviceAssetId': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'userId': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'deviceId': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'type': AssetEntityTypeEnum; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'originalPath': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'resizePath': string | null; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'webpPath': string | null; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'encodedVideoPath': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'createdAt': string; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'modifiedAt': string; - /** - * - * @type {boolean} - * @memberof AssetEntity - */ - 'isFavorite': boolean; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'mimeType': string | null; - /** - * - * @type {object} - * @memberof AssetEntity - */ - 'checksum'?: object | null; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'duration': string | null; - /** - * - * @type {boolean} - * @memberof AssetEntity - */ - 'isVisible': boolean; - /** - * - * @type {string} - * @memberof AssetEntity - */ - 'livePhotoVideoId': string | null; - /** - * - * @type {ExifEntity} - * @memberof AssetEntity - */ - 'exifInfo'?: ExifEntity; - /** - * - * @type {SmartInfoEntity} - * @memberof AssetEntity - */ - 'smartInfo'?: SmartInfoEntity; - /** - * - * @type {Array} - * @memberof AssetEntity - */ - 'tags': Array; -} - -export const AssetEntityTypeEnum = { - Image: 'IMAGE', - Video: 'VIDEO', - Audio: 'AUDIO', - Other: 'OTHER' -} as const; - -export type AssetEntityTypeEnum = typeof AssetEntityTypeEnum[keyof typeof AssetEntityTypeEnum]; - /** * * @export @@ -973,163 +836,6 @@ export const DeviceTypeEnum = { export type DeviceTypeEnum = typeof DeviceTypeEnum[keyof typeof DeviceTypeEnum]; -/** - * - * @export - * @interface ExifEntity - */ -export interface ExifEntity { - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'id': string; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'assetId': string; - /** - * General info - * @type {string} - * @memberof ExifEntity - */ - 'description': string; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'exifImageWidth': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'exifImageHeight': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'fileSizeInByte': number | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'orientation': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'dateTimeOriginal': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'modifyDate': string | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'latitude': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'longitude': number | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'city': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'state': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'country': string | null; - /** - * Image info - * @type {string} - * @memberof ExifEntity - */ - 'make': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'model': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'imageName': string | null; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'lensModel': string | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'fNumber': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'focalLength': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'iso': number | null; - /** - * - * @type {number} - * @memberof ExifEntity - */ - 'exposureTime': number | null; - /** - * Video info - * @type {number} - * @memberof ExifEntity - */ - 'fps'?: number | null; - /** - * - * @type {AssetEntity} - * @memberof ExifEntity - */ - 'asset'?: AssetEntity; - /** - * - * @type {string} - * @memberof ExifEntity - */ - 'exifTextSearchableColumn': string; -} /** * * @export @@ -1719,43 +1425,6 @@ export interface SignUpDto { */ 'lastName': string; } -/** - * - * @export - * @interface SmartInfoEntity - */ -export interface SmartInfoEntity { - /** - * - * @type {string} - * @memberof SmartInfoEntity - */ - 'id': string; - /** - * - * @type {string} - * @memberof SmartInfoEntity - */ - 'assetId': string; - /** - * - * @type {Array} - * @memberof SmartInfoEntity - */ - 'tags': Array | null; - /** - * - * @type {Array} - * @memberof SmartInfoEntity - */ - 'objects': Array | null; - /** - * - * @type {AssetEntity} - * @memberof SmartInfoEntity - */ - 'asset'?: AssetEntity; -} /** * * @export @@ -1842,64 +1511,6 @@ export interface SystemConfigResponseItem { */ 'defaultValue': string; } -/** - * - * @export - * @interface TagEntity - */ -export interface TagEntity { - /** - * - * @type {string} - * @memberof TagEntity - */ - 'id': string; - /** - * - * @type {string} - * @memberof TagEntity - */ - 'type': TagEntityTypeEnum; - /** - * - * @type {string} - * @memberof TagEntity - */ - 'name': string; - /** - * - * @type {string} - * @memberof TagEntity - */ - 'userId': string; - /** - * - * @type {string} - * @memberof TagEntity - */ - 'renameTagId': string; - /** - * - * @type {Array} - * @memberof TagEntity - */ - 'assets': Array; - /** - * - * @type {UserEntity} - * @memberof TagEntity - */ - 'user': UserEntity; -} - -export const TagEntityTypeEnum = { - Object: 'OBJECT', - Face: 'FACE', - Custom: 'CUSTOM' -} as const; - -export type TagEntityTypeEnum = typeof TagEntityTypeEnum[keyof typeof TagEntityTypeEnum]; - /** * * @export @@ -1924,6 +1535,18 @@ export interface TagResponseDto { * @memberof TagResponseDto */ 'name': string; + /** + * + * @type {string} + * @memberof TagResponseDto + */ + 'userId': string; + /** + * + * @type {string} + * @memberof TagResponseDto + */ + 'renameTagId'?: string | null; } /** * @@ -2149,91 +1772,6 @@ export interface UserCountResponseDto { */ 'userCount': number; } -/** - * - * @export - * @interface UserEntity - */ -export interface UserEntity { - /** - * - * @type {string} - * @memberof UserEntity - */ - 'id': string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'firstName': string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'lastName': string; - /** - * - * @type {boolean} - * @memberof UserEntity - */ - 'isAdmin': boolean; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'email': string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'password'?: string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'salt'?: string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'oauthId': string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'profileImagePath': string; - /** - * - * @type {boolean} - * @memberof UserEntity - */ - 'shouldChangePassword': boolean; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'createdAt': string; - /** - * - * @type {string} - * @memberof UserEntity - */ - 'deletedAt'?: string; - /** - * - * @type {Array} - * @memberof UserEntity - */ - 'tags': Array; -} /** * * @export @@ -6005,7 +5543,7 @@ export const TagApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async _delete(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async _delete(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator._delete(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -6015,7 +5553,7 @@ export const TagApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async create(createTagDto: CreateTagDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async create(createTagDto: CreateTagDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.create(createTagDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -6024,7 +5562,7 @@ export const TagApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async findAll(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + async findAll(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { const localVarAxiosArgs = await localVarAxiosParamCreator.findAll(options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -6034,7 +5572,7 @@ export const TagApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async findOne(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async findOne(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.findOne(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -6045,7 +5583,7 @@ export const TagApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async update(id: string, updateTagDto: UpdateTagDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async update(id: string, updateTagDto: UpdateTagDto, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.update(id, updateTagDto, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -6065,7 +5603,7 @@ export const TagApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - _delete(id: string, options?: any): AxiosPromise { + _delete(id: string, options?: any): AxiosPromise { return localVarFp._delete(id, options).then((request) => request(axios, basePath)); }, /** @@ -6074,7 +5612,7 @@ export const TagApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - create(createTagDto: CreateTagDto, options?: any): AxiosPromise { + create(createTagDto: CreateTagDto, options?: any): AxiosPromise { return localVarFp.create(createTagDto, options).then((request) => request(axios, basePath)); }, /** @@ -6082,7 +5620,7 @@ export const TagApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - findAll(options?: any): AxiosPromise> { + findAll(options?: any): AxiosPromise> { return localVarFp.findAll(options).then((request) => request(axios, basePath)); }, /** @@ -6091,7 +5629,7 @@ export const TagApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - findOne(id: string, options?: any): AxiosPromise { + findOne(id: string, options?: any): AxiosPromise { return localVarFp.findOne(id, options).then((request) => request(axios, basePath)); }, /** @@ -6101,7 +5639,7 @@ export const TagApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - update(id: string, updateTagDto: UpdateTagDto, options?: any): AxiosPromise { + update(id: string, updateTagDto: UpdateTagDto, options?: any): AxiosPromise { return localVarFp.update(id, updateTagDto, options).then((request) => request(axios, basePath)); }, };