mirror of
https://github.com/immich-app/immich.git
synced 2025-06-02 21:24:28 -04:00
refactor(server): bulk update exif (#17109)
* bulk update exif * update sql * update tests * check job queeuing in test
This commit is contained in:
parent
4cf7c55680
commit
75df8fc10e
@ -1,5 +1,12 @@
|
|||||||
-- NOTE: This file is auto generated by ./sql-generator
|
-- NOTE: This file is auto generated by ./sql-generator
|
||||||
|
|
||||||
|
-- AssetRepository.updateAllExif
|
||||||
|
update "exif"
|
||||||
|
set
|
||||||
|
"model" = $1
|
||||||
|
where
|
||||||
|
"assetId" in ($2)
|
||||||
|
|
||||||
-- AssetRepository.getByDayOfYear
|
-- AssetRepository.getByDayOfYear
|
||||||
with
|
with
|
||||||
"res" as (
|
"res" as (
|
||||||
|
@ -201,6 +201,16 @@ export class AssetRepository {
|
|||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GenerateSql({ params: [[DummyValue.UUID], { model: DummyValue.STRING }] })
|
||||||
|
@Chunked()
|
||||||
|
async updateAllExif(ids: string[], options: Updateable<Exif>): Promise<void> {
|
||||||
|
if (ids.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.db.updateTable('exif').set(options).where('assetId', 'in', ids).execute();
|
||||||
|
}
|
||||||
|
|
||||||
async upsertJobStatus(...jobStatus: Insertable<AssetJobStatus>[]): Promise<void> {
|
async upsertJobStatus(...jobStatus: Insertable<AssetJobStatus>[]): Promise<void> {
|
||||||
if (jobStatus.length === 0) {
|
if (jobStatus.length === 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -460,6 +460,34 @@ describe(AssetService.name, () => {
|
|||||||
rating: undefined,
|
rating: undefined,
|
||||||
});
|
});
|
||||||
expect(mocks.asset.updateAll).toHaveBeenCalled();
|
expect(mocks.asset.updateAll).toHaveBeenCalled();
|
||||||
|
expect(mocks.asset.updateAllExif).toHaveBeenCalledWith(['asset-1'], { latitude: 0, longitude: 0 });
|
||||||
|
expect(mocks.job.queueAll).toHaveBeenCalledWith([
|
||||||
|
{ name: JobName.SIDECAR_WRITE, data: { id: 'asset-1', latitude: 0, longitude: 0 } },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should update exif table if latitude field is provided', async () => {
|
||||||
|
mocks.access.asset.checkOwnerAccess.mockResolvedValue(new Set(['asset-1']));
|
||||||
|
const dateTimeOriginal = new Date().toISOString();
|
||||||
|
await sut.updateAll(authStub.admin, {
|
||||||
|
ids: ['asset-1'],
|
||||||
|
latitude: 30,
|
||||||
|
longitude: 50,
|
||||||
|
dateTimeOriginal,
|
||||||
|
isArchived: undefined,
|
||||||
|
isFavorite: false,
|
||||||
|
duplicateId: undefined,
|
||||||
|
rating: undefined,
|
||||||
|
});
|
||||||
|
expect(mocks.asset.updateAll).toHaveBeenCalled();
|
||||||
|
expect(mocks.asset.updateAllExif).toHaveBeenCalledWith(['asset-1'], {
|
||||||
|
dateTimeOriginal,
|
||||||
|
latitude: 30,
|
||||||
|
longitude: 50,
|
||||||
|
});
|
||||||
|
expect(mocks.job.queueAll).toHaveBeenCalledWith([
|
||||||
|
{ name: JobName.SIDECAR_WRITE, data: { id: 'asset-1', dateTimeOriginal, latitude: 30, longitude: 50 } },
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -134,8 +134,11 @@ export class AssetService extends BaseService {
|
|||||||
const { ids, dateTimeOriginal, latitude, longitude, ...options } = dto;
|
const { ids, dateTimeOriginal, latitude, longitude, ...options } = dto;
|
||||||
await this.requireAccess({ auth, permission: Permission.ASSET_UPDATE, ids });
|
await this.requireAccess({ auth, permission: Permission.ASSET_UPDATE, ids });
|
||||||
|
|
||||||
for (const id of ids) {
|
if (dateTimeOriginal !== undefined || latitude !== undefined || longitude !== undefined) {
|
||||||
await this.updateMetadata({ id, dateTimeOriginal, latitude, longitude });
|
await this.assetRepository.updateAllExif(ids, { dateTimeOriginal, latitude, longitude });
|
||||||
|
await this.jobRepository.queueAll(
|
||||||
|
ids.map((id) => ({ name: JobName.SIDECAR_WRITE, data: { id, dateTimeOriginal, latitude, longitude } })),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
@ -7,6 +7,7 @@ export const newAssetRepositoryMock = (): Mocked<RepositoryInterface<AssetReposi
|
|||||||
create: vitest.fn(),
|
create: vitest.fn(),
|
||||||
createAll: vitest.fn(),
|
createAll: vitest.fn(),
|
||||||
upsertExif: vitest.fn(),
|
upsertExif: vitest.fn(),
|
||||||
|
updateAllExif: vitest.fn(),
|
||||||
upsertJobStatus: vitest.fn(),
|
upsertJobStatus: vitest.fn(),
|
||||||
getByDayOfYear: vitest.fn(),
|
getByDayOfYear: vitest.fn(),
|
||||||
getByIds: vitest.fn().mockResolvedValue([]),
|
getByIds: vitest.fn().mockResolvedValue([]),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user