From ef9718e93d926f1a8ccae3270d839c9294884050 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Mon, 14 Sep 2026 15:47:02 +0200 Subject: [PATCH] fix: feature face update ignores soft-deleted faces (#31533) --- server/src/queries/person.repository.sql | 1 + server/src/repositories/person.repository.ts | 1 + .../specs/repositories/person.repository.spec.ts | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/server/src/queries/person.repository.sql b/server/src/queries/person.repository.sql index 821041c5c..e50446aa5 100644 --- a/server/src/queries/person.repository.sql +++ b/server/src/queries/person.repository.sql @@ -616,6 +616,7 @@ from where "asset_face"."assetId" = $2 and "asset_face"."personGroupId" = $3 + and "asset_face"."deletedAt" is null -- PersonRepository.getForMergePerson select diff --git a/server/src/repositories/person.repository.ts b/server/src/repositories/person.repository.ts index 67c0b85be..01448646a 100644 --- a/server/src/repositories/person.repository.ts +++ b/server/src/repositories/person.repository.ts @@ -767,6 +767,7 @@ export class PersonRepository { .select('asset_face.id') .where('asset_face.assetId', '=', assetId) .where('asset_face.personGroupId', '=', personGroupId) + .where('asset_face.deletedAt', 'is', null) .innerJoin('asset', (join) => join.onRef('asset.id', '=', 'asset_face.assetId').on('asset.isOffline', '=', false)) .executeTakeFirst(); } diff --git a/server/test/medium/specs/repositories/person.repository.spec.ts b/server/test/medium/specs/repositories/person.repository.spec.ts index bf38eb774..fc0c9245d 100644 --- a/server/test/medium/specs/repositories/person.repository.spec.ts +++ b/server/test/medium/specs/repositories/person.repository.spec.ts @@ -228,4 +228,18 @@ describe(PersonRepository.name, () => { ); }); }); + + describe('getForFeatureFaceUpdate', () => { + it('should ignore soft deleted faces', async () => { + const { ctx, sut } = setup(); + const { user } = await ctx.newUser(); + const { asset } = await ctx.newAsset({ ownerId: user.id }); + const { person } = await ctx.newPerson({ ownerId: user.id }); + await ctx.newAssetFace({ assetId: asset.id, deletedAt: new Date(), personGroupId: person.personGroupId }); + + await expect( + sut.getForFeatureFaceUpdate({ personGroupId: person.personGroupId, assetId: asset.id }), + ).resolves.toEqual(undefined); + }); + }); });