diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index 656e8e628a..95998eb44b 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -446,7 +446,7 @@ export function searchAssetBuilder(kysely: Kysely, options: AssetSearchBuild qb.where((eb) => eb.not(eb.exists((eb) => eb.selectFrom('album_asset').whereRef('assetId', '=', 'asset.id')))), ) .$if(!!options.withExif, withExifInner) - .$if(!!(options.withFaces || options.withPeople || options.personIds), (qb) => qb.select(withFacesAndPeople)) + .$if(!!(options.withFaces || options.withPeople), (qb) => qb.select(withFacesAndPeople)) .$if(!options.withDeleted, (qb) => qb.where('asset.deletedAt', 'is', null)); } diff --git a/server/test/medium/specs/services/search.service.spec.ts b/server/test/medium/specs/services/search.service.spec.ts index 517e6cc277..f58ffb6a25 100644 --- a/server/test/medium/specs/services/search.service.spec.ts +++ b/server/test/medium/specs/services/search.service.spec.ts @@ -1,5 +1,6 @@ import { Kysely } from 'kysely'; import { AccessRepository } from 'src/repositories/access.repository'; +import { AssetRepository } from 'src/repositories/asset.repository'; import { DatabaseRepository } from 'src/repositories/database.repository'; import { LoggingRepository } from 'src/repositories/logging.repository'; import { PartnerRepository } from 'src/repositories/partner.repository'; @@ -16,7 +17,14 @@ let defaultDatabase: Kysely; const setup = (db?: Kysely) => { return newMediumService(SearchService, { database: db || defaultDatabase, - real: [AccessRepository, DatabaseRepository, SearchRepository, PartnerRepository, PersonRepository], + real: [ + AccessRepository, + AssetRepository, + DatabaseRepository, + SearchRepository, + PartnerRepository, + PersonRepository, + ], mock: [LoggingRepository], }); }; @@ -52,4 +60,32 @@ describe(SearchService.name, () => { expect.objectContaining({ id: assets[1].id }), ]); }); + + describe('searchStatistics', () => { + it('should return statistics when filtering by personIds', async () => { + const { sut, ctx } = 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, personId: person.id }); + + const auth = factory.auth({ user: { id: user.id } }); + + const result = await sut.searchStatistics(auth, { personIds: [person.id] }); + + expect(result).toEqual({ total: 1 }); + }); + + it('should return zero when no assets match the personIds filter', async () => { + const { sut, ctx } = setup(); + const { user } = await ctx.newUser(); + const { person } = await ctx.newPerson({ ownerId: user.id }); + + const auth = factory.auth({ user: { id: user.id } }); + + const result = await sut.searchStatistics(auth, { personIds: [person.id] }); + + expect(result).toEqual({ total: 0 }); + }); + }); });