From c9274c1c7c7afe88c52525c6b3b6b4a9f12cc4c6 Mon Sep 17 00:00:00 2001 From: YFrendo Date: Tue, 21 Nov 2023 18:38:49 +0100 Subject: [PATCH] Namming convention + isUndefined on service --- cli/src/api/open-api/api.ts | 4 ++-- mobile/openapi/doc/AssetBulkUpdateDto.md | 2 +- mobile/openapi/doc/UpdateAssetDto.md | 2 +- .../lib/model/asset_bulk_update_dto.dart | 18 +++++++++--------- mobile/openapi/lib/model/update_asset_dto.dart | 18 +++++++++--------- .../test/asset_bulk_update_dto_test.dart | 4 ++-- mobile/openapi/test/update_asset_dto_test.dart | 4 ++-- server/immich-openapi-specs.json | 4 ++-- server/src/domain/asset/asset.service.ts | 12 ++++++------ server/src/domain/asset/dto/asset.dto.ts | 4 ++-- server/src/domain/job/job.interface.ts | 2 +- server/src/domain/metadata/metadata.service.ts | 17 ++++++++++------- web/src/api/open-api/api.ts | 4 ++-- .../asset-viewer/detail-panel.svelte | 2 +- .../photos-page/actions/change-date.svelte | 2 +- 15 files changed, 51 insertions(+), 48 deletions(-) diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 853ac19ade5ef..5752e722589fc 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -452,7 +452,7 @@ export interface AssetBulkUpdateDto { * @type {string} * @memberof AssetBulkUpdateDto */ - 'creationDate'?: string; + 'dateTimeOriginal'?: string; /** * * @type {Array} @@ -4184,7 +4184,7 @@ export interface UpdateAssetDto { * @type {string} * @memberof UpdateAssetDto */ - 'creationDate'?: string; + 'dateTimeOriginal'?: string; /** * * @type {string} diff --git a/mobile/openapi/doc/AssetBulkUpdateDto.md b/mobile/openapi/doc/AssetBulkUpdateDto.md index 18b9c482717bb..40ebe6a411297 100644 --- a/mobile/openapi/doc/AssetBulkUpdateDto.md +++ b/mobile/openapi/doc/AssetBulkUpdateDto.md @@ -8,7 +8,7 @@ import 'package:openapi/api.dart'; ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**creationDate** | **String** | | [optional] +**dateTimeOriginal** | **String** | | [optional] **ids** | **List** | | [default to const []] **isArchived** | **bool** | | [optional] **isFavorite** | **bool** | | [optional] diff --git a/mobile/openapi/doc/UpdateAssetDto.md b/mobile/openapi/doc/UpdateAssetDto.md index b2f5639e34fcb..cfd8f604d249c 100644 --- a/mobile/openapi/doc/UpdateAssetDto.md +++ b/mobile/openapi/doc/UpdateAssetDto.md @@ -8,7 +8,7 @@ import 'package:openapi/api.dart'; ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**creationDate** | **String** | | [optional] +**dateTimeOriginal** | **String** | | [optional] **description** | **String** | | [optional] **isArchived** | **bool** | | [optional] **isFavorite** | **bool** | | [optional] diff --git a/mobile/openapi/lib/model/asset_bulk_update_dto.dart b/mobile/openapi/lib/model/asset_bulk_update_dto.dart index 302e48a5a1a6d..60cab8c749da9 100644 --- a/mobile/openapi/lib/model/asset_bulk_update_dto.dart +++ b/mobile/openapi/lib/model/asset_bulk_update_dto.dart @@ -13,7 +13,7 @@ part of openapi.api; class AssetBulkUpdateDto { /// Returns a new [AssetBulkUpdateDto] instance. AssetBulkUpdateDto({ - this.creationDate, + this.dateTimeOriginal, this.ids = const [], this.isArchived, this.isFavorite, @@ -29,7 +29,7 @@ class AssetBulkUpdateDto { /// source code must fall back to having a nullable type. /// Consider adding a "default:" property in the specification file to hide this note. /// - String? creationDate; + String? dateTimeOriginal; List ids; @@ -83,7 +83,7 @@ class AssetBulkUpdateDto { @override bool operator ==(Object other) => identical(this, other) || other is AssetBulkUpdateDto && - other.creationDate == creationDate && + other.dateTimeOriginal == dateTimeOriginal && other.ids == ids && other.isArchived == isArchived && other.isFavorite == isFavorite && @@ -95,7 +95,7 @@ class AssetBulkUpdateDto { @override int get hashCode => // ignore: unnecessary_parenthesis - (creationDate == null ? 0 : creationDate!.hashCode) + + (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + (ids.hashCode) + (isArchived == null ? 0 : isArchived!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + @@ -105,14 +105,14 @@ class AssetBulkUpdateDto { (stackParentId == null ? 0 : stackParentId!.hashCode); @override - String toString() => 'AssetBulkUpdateDto[creationDate=$creationDate, ids=$ids, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, removeParent=$removeParent, stackParentId=$stackParentId]'; + String toString() => 'AssetBulkUpdateDto[dateTimeOriginal=$dateTimeOriginal, ids=$ids, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude, removeParent=$removeParent, stackParentId=$stackParentId]'; Map toJson() { final json = {}; - if (this.creationDate != null) { - json[r'creationDate'] = this.creationDate; + if (this.dateTimeOriginal != null) { + json[r'dateTimeOriginal'] = this.dateTimeOriginal; } else { - // json[r'creationDate'] = null; + // json[r'dateTimeOriginal'] = null; } json[r'ids'] = this.ids; if (this.isArchived != null) { @@ -156,7 +156,7 @@ class AssetBulkUpdateDto { final json = value.cast(); return AssetBulkUpdateDto( - creationDate: mapValueOfType(json, r'creationDate'), + dateTimeOriginal: mapValueOfType(json, r'dateTimeOriginal'), ids: json[r'ids'] is List ? (json[r'ids'] as List).cast() : const [], diff --git a/mobile/openapi/lib/model/update_asset_dto.dart b/mobile/openapi/lib/model/update_asset_dto.dart index 1032bf984ba95..d90b365b72705 100644 --- a/mobile/openapi/lib/model/update_asset_dto.dart +++ b/mobile/openapi/lib/model/update_asset_dto.dart @@ -13,7 +13,7 @@ part of openapi.api; class UpdateAssetDto { /// Returns a new [UpdateAssetDto] instance. UpdateAssetDto({ - this.creationDate, + this.dateTimeOriginal, this.description, this.isArchived, this.isFavorite, @@ -27,7 +27,7 @@ class UpdateAssetDto { /// source code must fall back to having a nullable type. /// Consider adding a "default:" property in the specification file to hide this note. /// - String? creationDate; + String? dateTimeOriginal; /// /// Please note: This property should have been non-nullable! Since the specification file @@ -71,7 +71,7 @@ class UpdateAssetDto { @override bool operator ==(Object other) => identical(this, other) || other is UpdateAssetDto && - other.creationDate == creationDate && + other.dateTimeOriginal == dateTimeOriginal && other.description == description && other.isArchived == isArchived && other.isFavorite == isFavorite && @@ -81,7 +81,7 @@ class UpdateAssetDto { @override int get hashCode => // ignore: unnecessary_parenthesis - (creationDate == null ? 0 : creationDate!.hashCode) + + (dateTimeOriginal == null ? 0 : dateTimeOriginal!.hashCode) + (description == null ? 0 : description!.hashCode) + (isArchived == null ? 0 : isArchived!.hashCode) + (isFavorite == null ? 0 : isFavorite!.hashCode) + @@ -89,14 +89,14 @@ class UpdateAssetDto { (longitude == null ? 0 : longitude!.hashCode); @override - String toString() => 'UpdateAssetDto[creationDate=$creationDate, description=$description, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude]'; + String toString() => 'UpdateAssetDto[dateTimeOriginal=$dateTimeOriginal, description=$description, isArchived=$isArchived, isFavorite=$isFavorite, latitude=$latitude, longitude=$longitude]'; Map toJson() { final json = {}; - if (this.creationDate != null) { - json[r'creationDate'] = this.creationDate; + if (this.dateTimeOriginal != null) { + json[r'dateTimeOriginal'] = this.dateTimeOriginal; } else { - // json[r'creationDate'] = null; + // json[r'dateTimeOriginal'] = null; } if (this.description != null) { json[r'description'] = this.description; @@ -134,7 +134,7 @@ class UpdateAssetDto { final json = value.cast(); return UpdateAssetDto( - creationDate: mapValueOfType(json, r'creationDate'), + dateTimeOriginal: mapValueOfType(json, r'dateTimeOriginal'), description: mapValueOfType(json, r'description'), isArchived: mapValueOfType(json, r'isArchived'), isFavorite: mapValueOfType(json, r'isFavorite'), diff --git a/mobile/openapi/test/asset_bulk_update_dto_test.dart b/mobile/openapi/test/asset_bulk_update_dto_test.dart index c17e533a0f650..d04bdd8091ff7 100644 --- a/mobile/openapi/test/asset_bulk_update_dto_test.dart +++ b/mobile/openapi/test/asset_bulk_update_dto_test.dart @@ -16,8 +16,8 @@ void main() { // final instance = AssetBulkUpdateDto(); group('test AssetBulkUpdateDto', () { - // String creationDate - test('to test the property `creationDate`', () async { + // String dateTimeOriginal + test('to test the property `dateTimeOriginal`', () async { // TODO }); diff --git a/mobile/openapi/test/update_asset_dto_test.dart b/mobile/openapi/test/update_asset_dto_test.dart index d8dbf5fb71e27..9d9874beb8fa2 100644 --- a/mobile/openapi/test/update_asset_dto_test.dart +++ b/mobile/openapi/test/update_asset_dto_test.dart @@ -16,8 +16,8 @@ void main() { // final instance = UpdateAssetDto(); group('test UpdateAssetDto', () { - // String creationDate - test('to test the property `creationDate`', () async { + // String dateTimeOriginal + test('to test the property `dateTimeOriginal`', () async { // TODO }); diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 2f32c750ec7db..d5c6dfa6a0e11 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -6404,7 +6404,7 @@ }, "AssetBulkUpdateDto": { "properties": { - "creationDate": { + "dateTimeOriginal": { "type": "string" }, "ids": { @@ -9320,7 +9320,7 @@ }, "UpdateAssetDto": { "properties": { - "creationDate": { + "dateTimeOriginal": { "type": "string" }, "description": { diff --git a/server/src/domain/asset/asset.service.ts b/server/src/domain/asset/asset.service.ts index 3f5377c40ece1..281a8e0662b7e 100644 --- a/server/src/domain/asset/asset.service.ts +++ b/server/src/domain/asset/asset.service.ts @@ -389,17 +389,17 @@ export class AssetService { async update(authUser: AuthUserDto, id: string, dto: UpdateAssetDto): Promise { await this.access.requirePermission(authUser, Permission.ASSET_UPDATE, id); - const { description, creationDate, latitude, longitude, ...rest } = dto; + const { description, dateTimeOriginal, latitude, longitude, ...rest } = dto; if (description !== undefined) { await this.assetRepository.upsertExif({ assetId: id, description }); } - if (creationDate !== undefined || latitude !== undefined || longitude !== undefined) { + if (dateTimeOriginal !== undefined || latitude !== undefined || longitude !== undefined) { await this.jobRepository.queue({ name: JobName.WRITE_EXIF, data: { id: id, - creationDate: creationDate, + CreationDate: dateTimeOriginal, GPSLatitude: latitude, GPSLongitude: longitude, }, @@ -412,7 +412,7 @@ export class AssetService { } async updateAll(authUser: AuthUserDto, dto: AssetBulkUpdateDto): Promise { - const { ids, removeParent, creationDate, latitude, longitude, ...options } = dto; + const { ids, removeParent, dateTimeOriginal, latitude, longitude, ...options } = dto; await this.access.requirePermission(authUser, Permission.ASSET_UPDATE, ids); if (removeParent) { @@ -432,13 +432,13 @@ export class AssetService { await this.assetRepository.updateAll([options.stackParentId], { stackParentId: null }); } - if (creationDate !== undefined || latitude !== undefined || longitude !== undefined) { + if (dateTimeOriginal !== undefined || latitude !== undefined || longitude !== undefined) { for (const id of ids) { await this.jobRepository.queue({ name: JobName.WRITE_EXIF, data: { id: id, - creationDate: creationDate, + CreationDate: dateTimeOriginal, GPSLatitude: latitude, GPSLongitude: longitude, }, diff --git a/server/src/domain/asset/dto/asset.dto.ts b/server/src/domain/asset/dto/asset.dto.ts index 257428ffb0893..ac50f2242610d 100644 --- a/server/src/domain/asset/dto/asset.dto.ts +++ b/server/src/domain/asset/dto/asset.dto.ts @@ -191,7 +191,7 @@ export class AssetBulkUpdateDto extends BulkIdsDto { @Optional() @IsDateString() - creationDate?: string; + dateTimeOriginal?: string; @ValidateGPS() @IsLatitude() @@ -219,7 +219,7 @@ export class UpdateAssetDto { @Optional() @IsDateString() - creationDate?: string; + dateTimeOriginal?: string; @ValidateGPS() @IsLatitude() diff --git a/server/src/domain/job/job.interface.ts b/server/src/domain/job/job.interface.ts index 5e8f1e4aa56ec..34e96712e4302 100644 --- a/server/src/domain/job/job.interface.ts +++ b/server/src/domain/job/job.interface.ts @@ -35,7 +35,7 @@ export interface IDeleteFilesJob extends IBaseJob { } export interface IWriteExifJob extends IEntityJob { - creationDate?: string; + CreationDate?: string; GPSLatitude?: number; GPSLongitude?: number; } diff --git a/server/src/domain/metadata/metadata.service.ts b/server/src/domain/metadata/metadata.service.ts index f2685cdb59b45..df470104961c8 100644 --- a/server/src/domain/metadata/metadata.service.ts +++ b/server/src/domain/metadata/metadata.service.ts @@ -3,6 +3,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common'; import { ExifDateTime, Tags } from 'exiftool-vendored'; import { firstDateTime } from 'exiftool-vendored/dist/FirstDateTime'; import { constants } from 'fs/promises'; +import _ from 'lodash'; import { Duration } from 'luxon'; import { Subscription } from 'rxjs'; import { usePagination } from '../domain.util'; @@ -239,8 +240,14 @@ export class MetadataService { return true; } - async handleWriteExif({ id, creationDate, GPSLatitude, GPSLongitude }: IWriteExifJob) { + async handleWriteExif({ id, CreationDate, GPSLatitude, GPSLongitude }: IWriteExifJob) { const asset = await this.assetRepository.getById(id); + const newExifData = { + CreationDate: CreationDate, + GPSLatitude: GPSLatitude, + GPSLongitude: GPSLongitude, + }; + if (!asset) { return false; } @@ -253,13 +260,9 @@ export class MetadataService { pathMetadata = asset.sidecarPath; } - const newExifData = { - ...(creationDate !== undefined && { CreationDate: creationDate }), - ...(typeof GPSLatitude == 'number' && { GPSLatitude: GPSLatitude }), - ...(typeof GPSLongitude === 'number' && { GPSLongitude: GPSLongitude }), - }; + const cleanedExifData = _.omitBy(newExifData, _.isUndefined); - await this.assetRepository.writeExif(pathMetadata, newExifData); + await this.assetRepository.writeExif(pathMetadata, cleanedExifData); await this.assetRepository.save({ id, sidecarPath: pathMetadata }); await this.jobRepository.queue({ name: JobName.METADATA_EXTRACTION, data: { id: id } }); diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 853ac19ade5ef..5752e722589fc 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -452,7 +452,7 @@ export interface AssetBulkUpdateDto { * @type {string} * @memberof AssetBulkUpdateDto */ - 'creationDate'?: string; + 'dateTimeOriginal'?: string; /** * * @type {Array} @@ -4184,7 +4184,7 @@ export interface UpdateAssetDto { * @type {string} * @memberof UpdateAssetDto */ - 'creationDate'?: string; + 'dateTimeOriginal'?: string; /** * * @type {string} diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index 6f2f16f447e2b..f4f6e5e6be37a 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -109,7 +109,7 @@ await api.assetApi.updateAsset({ id: asset.id, updateAssetDto: { - creationDate: event.detail, + dateTimeOriginal: event.detail, }, }); notificationController.show({ message: 'Metadata updated please reload to apply', type: NotificationType.Info }); diff --git a/web/src/lib/components/photos-page/actions/change-date.svelte b/web/src/lib/components/photos-page/actions/change-date.svelte index 537cee81ff4c6..1fade93ac0824 100644 --- a/web/src/lib/components/photos-page/actions/change-date.svelte +++ b/web/src/lib/components/photos-page/actions/change-date.svelte @@ -25,7 +25,7 @@ await api.assetApi.updateAssets({ assetBulkUpdateDto: { ids: ids, - creationDate: event.detail, + dateTimeOriginal: event.detail, }, }); notificationController.show({ message: 'Metadata updated please reload to apply', type: NotificationType.Info });