From 98f38833712829fe99250a06c9221c6bde70841a Mon Sep 17 00:00:00 2001 From: Daniel Dietzler Date: Wed, 10 Dec 2025 16:33:01 -0600 Subject: [PATCH] chore: simplify update all assets --- server/src/repositories/asset.repository.ts | 4 -- server/src/services/asset.service.spec.ts | 21 ++------- server/src/services/asset.service.ts | 50 +++++---------------- 3 files changed, 13 insertions(+), 62 deletions(-) diff --git a/server/src/repositories/asset.repository.ts b/server/src/repositories/asset.repository.ts index f53c48c280..069a5f4b19 100644 --- a/server/src/repositories/asset.repository.ts +++ b/server/src/repositories/asset.repository.ts @@ -200,10 +200,6 @@ export class AssetRepository { @GenerateSql({ params: [[DummyValue.UUID], DummyValue.NUMBER, DummyValue.STRING] }) @Chunked() updateDateTimeOriginal(ids: string[], delta?: number, timeZone?: string) { - if (ids.length === 0) { - return; - } - return this.db .updateTable('asset_exif') .set((eb) => ({ diff --git a/server/src/services/asset.service.spec.ts b/server/src/services/asset.service.spec.ts index e58c868c5e..35b818bfe6 100755 --- a/server/src/services/asset.service.spec.ts +++ b/server/src/services/asset.service.spec.ts @@ -436,9 +436,7 @@ describe(AssetService.name, () => { }); expect(mocks.asset.updateAll).toHaveBeenCalled(); expect(mocks.asset.updateAllExif).toHaveBeenCalledWith(['asset-1'], { latitude: 0, longitude: 0 }); - expect(mocks.job.queueAll).toHaveBeenCalledWith([ - { name: JobName.SidecarWrite, data: { id: 'asset-1', latitude: 0, longitude: 0 } }, - ]); + expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]); }); it('should update exif table if latitude field is provided', async () => { @@ -459,9 +457,7 @@ describe(AssetService.name, () => { latitude: 30, longitude: 50, }); - expect(mocks.job.queueAll).toHaveBeenCalledWith([ - { name: JobName.SidecarWrite, data: { id: 'asset-1', dateTimeOriginal, latitude: 30, longitude: 50 } }, - ]); + expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]); }); it('should update Assets table if duplicateId is provided as null', async () => { @@ -491,18 +487,7 @@ describe(AssetService.name, () => { timeZone, }); expect(mocks.asset.updateDateTimeOriginal).toHaveBeenCalledWith(['asset-1'], dateTimeRelative, timeZone); - expect(mocks.job.queueAll).toHaveBeenCalledWith([ - { - name: JobName.SidecarWrite, - data: { - id: 'asset-1', - dateTimeOriginal: '2020-02-25T06:41:00.000+02:00', - description: undefined, - latitude: undefined, - longitude: undefined, - }, - }, - ]); + expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]); }); }); diff --git a/server/src/services/asset.service.ts b/server/src/services/asset.service.ts index 6a9c71094a..bb82bd031f 100644 --- a/server/src/services/asset.service.ts +++ b/server/src/services/asset.service.ts @@ -142,56 +142,26 @@ export class AssetService extends BaseService { } = dto; await this.requireAccess({ auth, permission: Permission.AssetUpdate, ids }); - const assetDto = { isFavorite, visibility, duplicateId }; + const assetDto = _.omitBy({ isFavorite, visibility, duplicateId }, _.isUndefined); const exifDto = _.omitBy({ latitude, longitude, rating, description, dateTimeOriginal }, _.isUndefined); - const isExifChanged = Object.keys(exifDto).length > 0; - if (isExifChanged) { + if (Object.keys(exifDto).length > 0) { await this.assetRepository.updateAllExif(ids, exifDto); } - const assets = - (dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined - ? await this.assetRepository.updateDateTimeOriginal(ids, dateTimeRelative, timeZone) - : undefined; - - const dateTimesWithTimezone = assets - ? assets.map((asset) => { - const isoString = asset.dateTimeOriginal?.toISOString(); - let dateTime = isoString ? DateTime.fromISO(isoString) : null; - - if (dateTime && asset.timeZone) { - dateTime = dateTime.setZone(asset.timeZone); - } - - return { - assetId: asset.assetId, - dateTimeOriginal: dateTime?.toISO() ?? null, - }; - }) - : ids.map((id) => ({ assetId: id, dateTimeOriginal })); - - if (dateTimesWithTimezone.length > 0) { - await this.jobRepository.queueAll( - dateTimesWithTimezone.map(({ assetId: id, dateTimeOriginal }) => ({ - name: JobName.SidecarWrite, - data: { - ...exifDto, - id, - dateTimeOriginal: dateTimeOriginal ?? undefined, - }, - })), - ); + if ((dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined) { + await this.assetRepository.updateDateTimeOriginal(ids, dateTimeRelative, timeZone); } - const isAssetChanged = Object.values(assetDto).some((v) => v !== undefined); - if (isAssetChanged) { + if (Object.keys(assetDto).length > 0) { await this.assetRepository.updateAll(ids, assetDto); + } - if (visibility === AssetVisibility.Locked) { - await this.albumRepository.removeAssetsFromAll(ids); - } + if (visibility === AssetVisibility.Locked) { + await this.albumRepository.removeAssetsFromAll(ids); } + + await this.jobRepository.queueAll(ids.map((id) => ({ name: JobName.SidecarWrite, data: { id } }))); } async copy(