fix: asset update race condition

This commit is contained in:
Daniel Dietzler
2025-03-16 13:17:55 +01:00
parent 9a4495eb5b
commit 75d1d21cc6
13 changed files with 172 additions and 114 deletions
+20
View File
@@ -88,6 +88,7 @@ export const assetStub = {
isExternal: false,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
noWebpPath: Object.freeze<AssetEntity>({
@@ -126,6 +127,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
noThumbhash: Object.freeze<AssetEntity>({
@@ -161,6 +163,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
primaryImage: Object.freeze<AssetEntity>({
@@ -207,6 +210,7 @@ export const assetStub = {
]),
duplicateId: null,
isOffline: false,
isDirty: false,
}),
image: Object.freeze<AssetEntity>({
@@ -247,6 +251,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
trashed: Object.freeze<AssetEntity>({
@@ -287,6 +292,7 @@ export const assetStub = {
duplicateId: null,
isOffline: false,
status: AssetStatus.TRASHED,
isDirty: false,
}),
trashedOffline: Object.freeze<AssetEntity>({
@@ -328,6 +334,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: true,
isDirty: false,
}),
archived: Object.freeze<AssetEntity>({
id: 'asset-id',
@@ -367,6 +374,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
external: Object.freeze<AssetEntity>({
@@ -406,6 +414,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
image1: Object.freeze<AssetEntity>({
@@ -444,6 +453,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
imageFrom2015: Object.freeze<AssetEntity>({
@@ -482,6 +492,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
video: Object.freeze<AssetEntity>({
@@ -522,6 +533,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
livePhotoMotionAsset: Object.freeze({
@@ -613,6 +625,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
sidecar: Object.freeze<AssetEntity>({
@@ -648,6 +661,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
sidecarWithoutExt: Object.freeze<AssetEntity>({
@@ -683,6 +697,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
hasEncodedVideo: Object.freeze<AssetEntity>({
@@ -721,6 +736,7 @@ export const assetStub = {
deletedAt: null,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
hasFileExtension: Object.freeze<AssetEntity>({
@@ -760,6 +776,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
imageDng: Object.freeze<AssetEntity>({
@@ -800,6 +817,7 @@ export const assetStub = {
} as ExifEntity,
duplicateId: null,
isOffline: false,
isDirty: false,
}),
hasEmbedding: Object.freeze<AssetEntity>({
@@ -842,6 +860,7 @@ export const assetStub = {
embedding: '[1, 2, 3, 4]',
},
isOffline: false,
isDirty: false,
}),
hasDupe: Object.freeze<AssetEntity>({
@@ -884,5 +903,6 @@ export const assetStub = {
embedding: '[1, 2, 3, 4]',
},
isOffline: false,
isDirty: false,
}),
};
+1
View File
@@ -247,6 +247,7 @@ export const sharedLinkStub = {
sidecarPath: null,
deletedAt: null,
duplicateId: null,
isDirty: false,
},
],
},
@@ -123,7 +123,7 @@ describe(MetadataService.name, () => {
process.env.TZ = serverTimeZone ?? undefined;
const { filePath } = await createTestFile(exifData);
mocks.asset.getByIds.mockResolvedValue([{ id: 'asset-1', originalPath: filePath } as AssetEntity]);
mocks.asset.getById.mockResolvedValue({ id: 'asset-1', originalPath: filePath } as AssetEntity);
await sut.handleMetadataExtraction({ id: 'asset-1' });
+1
View File
@@ -105,6 +105,7 @@ const assetFactory = (asset: Partial<Asset> = {}) => ({
isFavorite: false,
isOffline: false,
isVisible: true,
isDirty: false,
libraryId: null,
livePhotoVideoId: null,
localDateTime: newDate(),