- updated dtos

- added inAlbums to search builder
- only check isNotInAlbum if albumIds is blank/empty
This commit is contained in:
CJPeckover
2025-06-06 15:49:52 -04:00
parent 737fedd527
commit fb1d3bd7f4
4 changed files with 46 additions and 2 deletions

View File

@@ -108,6 +108,9 @@ class BaseSearchDto {
@ValidateUUID({ each: true, optional: true })
tagIds?: string[];
@ValidateUUID({each: true, optional: true})
albumIds?: string[];
@Optional()
@IsInt()
@Max(5)

View File

@@ -91,6 +91,10 @@ export interface SearchTagOptions {
tagIds?: string[];
}
export interface SearchAlbumOptions {
albumIds?: string[];
}
export interface SearchOrderOptions {
orderDirection?: 'asc' | 'desc';
}
@@ -108,7 +112,8 @@ type BaseAssetSearchOptions = SearchDateOptions &
SearchStatusOptions &
SearchUserIdOptions &
SearchPeopleOptions &
SearchTagOptions;
SearchTagOptions &
SearchAlbumOptions;
export type AssetSearchOptions = BaseAssetSearchOptions & SearchRelationOptions;

View File

@@ -228,6 +228,20 @@ export function hasPeople<O>(qb: SelectQueryBuilder<DB, 'assets', O>, personIds:
);
}
export function inAlbums<O>(qb: SelectQueryBuilder<DB, 'assets', O>, albumIds: string[]) {
return qb.innerJoin(
(eb) =>
eb
.selectFrom('albums_assets_assets')
.select('assetsId')
.where('albumsId', '=', anyUuid(albumIds!))
.groupBy('assetsId')
.having((eb) => eb.fn.count('albumsId').distinct(), '=', albumIds.length)
.as('has_album'),
(join) => join.onRef('has_album.assetsId', '=', 'assets.id'),
);
}
export function hasTags<O>(qb: SelectQueryBuilder<DB, 'assets', O>, tagIds: string[]) {
return qb.innerJoin(
(eb) =>
@@ -293,6 +307,7 @@ export function searchAssetBuilder(kysely: Kysely<DB>, options: AssetSearchBuild
.selectFrom('assets')
.selectAll('assets')
.where('assets.visibility', '=', visibility)
.$if(!!options.albumIds && options.albumIds.length > 0, (qb) => inAlbums(qb, options.albumIds!))
.$if(!!options.tagIds && options.tagIds.length > 0, (qb) => hasTags(qb, options.tagIds!))
.$if(!!options.personIds && options.personIds.length > 0, (qb) => hasPeople(qb, options.personIds!))
.$if(!!options.createdBefore, (qb) => qb.where('assets.createdAt', '<=', options.createdBefore!))
@@ -369,7 +384,7 @@ export function searchAssetBuilder(kysely: Kysely<DB>, options: AssetSearchBuild
.$if(options.isMotion !== undefined, (qb) =>
qb.where('assets.livePhotoVideoId', options.isMotion ? 'is not' : 'is', null),
)
.$if(!!options.isNotInAlbum, (qb) =>
.$if(!!options.isNotInAlbum && (!options.albumIds || options.albumIds.length == 0), (qb) =>
qb.where((eb) =>
eb.not(eb.exists((eb) => eb.selectFrom('albums_assets_assets').whereRef('assetsId', '=', 'assets.id'))),
),