diff --git a/server/src/repositories/person.repository.ts b/server/src/repositories/person.repository.ts index f653bb8179..725304938c 100644 --- a/server/src/repositories/person.repository.ts +++ b/server/src/repositories/person.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { ExpressionBuilder, Insertable, Kysely, Selectable, sql, Updateable } from 'kysely'; +import { ExpressionBuilder, Insertable, Kysely, NotNull, Selectable, sql, Updateable } from 'kysely'; import { jsonObjectFrom } from 'kysely/helpers/postgres'; import { InjectKysely } from 'nestjs-kysely'; import { Chunked, ChunkedArray, DummyValue, GenerateSql } from 'src/decorators'; @@ -68,12 +68,6 @@ const withPerson = (eb: ExpressionBuilder) => { ).as('person'); }; -const withAsset = (eb: ExpressionBuilder) => { - return jsonObjectFrom(eb.selectFrom('asset').selectAll('asset').whereRef('asset.id', '=', 'asset_face.assetId')).as( - 'asset', - ); -}; - const withFaceSearch = (eb: ExpressionBuilder) => { return jsonObjectFrom( eb.selectFrom('face_search').selectAll('face_search').whereRef('face_search.faceId', '=', 'asset_face.id'), @@ -481,7 +475,12 @@ export class PersonRepository { return this.db .selectFrom('asset_face') .selectAll('asset_face') - .select(withAsset) + .select((eb) => + jsonObjectFrom(eb.selectFrom('asset').selectAll('asset').whereRef('asset.id', '=', 'asset_face.assetId')).as( + 'asset', + ), + ) + .$narrowType<{ asset: NotNull }>() .select(withPerson) .where('asset_face.assetId', 'in', assetIds) .where('asset_face.personId', 'in', personIds) diff --git a/server/src/services/media.service.spec.ts b/server/src/services/media.service.spec.ts index 42f7c7bba3..e494dd9bcc 100644 --- a/server/src/services/media.service.spec.ts +++ b/server/src/services/media.service.spec.ts @@ -42,7 +42,6 @@ describe(MediaService.name, () => { mocks.assetJob.streamForThumbnailJob.mockReturnValue(makeStream([assetStub.image])); mocks.person.getAll.mockReturnValue(makeStream([personStub.newThumbnail])); - mocks.person.getFacesByIds.mockResolvedValue([faceStub.face1]); await sut.handleQueueGenerateThumbnails({ force: true }); diff --git a/server/src/services/person.service.ts b/server/src/services/person.service.ts index d0c43c3dad..344b69efde 100644 --- a/server/src/services/person.service.ts +++ b/server/src/services/person.service.ts @@ -197,6 +197,10 @@ export class PersonService extends BaseService { throw new BadRequestException('Invalid assetId for feature face'); } + if (face.asset.isOffline) { + throw new BadRequestException('An offline asset cannot be used for feature face'); + } + faceId = face.id; }