chore: simplify update all assets

This commit is contained in:
Daniel Dietzler
2025-12-10 16:33:01 -06:00
parent e8c68d0289
commit 98f3883371
3 changed files with 14 additions and 63 deletions

View File

@@ -200,10 +200,6 @@ export class AssetRepository {
@GenerateSql({ params: [[DummyValue.UUID], DummyValue.NUMBER, DummyValue.STRING] }) @GenerateSql({ params: [[DummyValue.UUID], DummyValue.NUMBER, DummyValue.STRING] })
@Chunked() @Chunked()
updateDateTimeOriginal(ids: string[], delta?: number, timeZone?: string) { updateDateTimeOriginal(ids: string[], delta?: number, timeZone?: string) {
if (ids.length === 0) {
return;
}
return this.db return this.db
.updateTable('asset_exif') .updateTable('asset_exif')
.set((eb) => ({ .set((eb) => ({

View File

@@ -436,9 +436,7 @@ describe(AssetService.name, () => {
}); });
expect(mocks.asset.updateAll).toHaveBeenCalled(); expect(mocks.asset.updateAll).toHaveBeenCalled();
expect(mocks.asset.updateAllExif).toHaveBeenCalledWith(['asset-1'], { latitude: 0, longitude: 0 }); expect(mocks.asset.updateAllExif).toHaveBeenCalledWith(['asset-1'], { latitude: 0, longitude: 0 });
expect(mocks.job.queueAll).toHaveBeenCalledWith([ expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]);
{ name: JobName.SidecarWrite, data: { id: 'asset-1', latitude: 0, longitude: 0 } },
]);
}); });
it('should update exif table if latitude field is provided', async () => { it('should update exif table if latitude field is provided', async () => {
@@ -459,9 +457,7 @@ describe(AssetService.name, () => {
latitude: 30, latitude: 30,
longitude: 50, longitude: 50,
}); });
expect(mocks.job.queueAll).toHaveBeenCalledWith([ expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]);
{ name: JobName.SidecarWrite, data: { id: 'asset-1', dateTimeOriginal, latitude: 30, longitude: 50 } },
]);
}); });
it('should update Assets table if duplicateId is provided as null', async () => { it('should update Assets table if duplicateId is provided as null', async () => {
@@ -491,18 +487,7 @@ describe(AssetService.name, () => {
timeZone, timeZone,
}); });
expect(mocks.asset.updateDateTimeOriginal).toHaveBeenCalledWith(['asset-1'], dateTimeRelative, timeZone); expect(mocks.asset.updateDateTimeOriginal).toHaveBeenCalledWith(['asset-1'], dateTimeRelative, timeZone);
expect(mocks.job.queueAll).toHaveBeenCalledWith([ expect(mocks.job.queueAll).toHaveBeenCalledWith([{ name: JobName.SidecarWrite, data: { id: 'asset-1' } }]);
{
name: JobName.SidecarWrite,
data: {
id: 'asset-1',
dateTimeOriginal: '2020-02-25T06:41:00.000+02:00',
description: undefined,
latitude: undefined,
longitude: undefined,
},
},
]);
}); });
}); });

View File

@@ -142,56 +142,26 @@ export class AssetService extends BaseService {
} = dto; } = dto;
await this.requireAccess({ auth, permission: Permission.AssetUpdate, ids }); 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 exifDto = _.omitBy({ latitude, longitude, rating, description, dateTimeOriginal }, _.isUndefined);
const isExifChanged = Object.keys(exifDto).length > 0; if (Object.keys(exifDto).length > 0) {
if (isExifChanged) {
await this.assetRepository.updateAllExif(ids, exifDto); await this.assetRepository.updateAllExif(ids, exifDto);
} }
const assets = if ((dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined) {
(dateTimeRelative !== undefined && dateTimeRelative !== 0) || timeZone !== undefined await this.assetRepository.updateDateTimeOriginal(ids, dateTimeRelative, timeZone);
? 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,
},
})),
);
} }
const isAssetChanged = Object.values(assetDto).some((v) => v !== undefined); if (Object.keys(assetDto).length > 0) {
if (isAssetChanged) {
await this.assetRepository.updateAll(ids, assetDto); 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( async copy(