From b44b24299cb6715a24e2573674d4a3d29ce72c16 Mon Sep 17 00:00:00 2001 From: mertalev <101130780+mertalev@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:17:58 -0400 Subject: [PATCH] refactor --- server/src/queries/album.repository.sql | 17 +++++++++++++++++ server/src/repositories/album.repository.ts | 12 ++++++------ server/src/services/album.service.ts | 11 ++--------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/server/src/queries/album.repository.sql b/server/src/queries/album.repository.sql index 36c44414db..5fd3ffcd87 100644 --- a/server/src/queries/album.repository.sql +++ b/server/src/queries/album.repository.sql @@ -407,3 +407,20 @@ from where "album_asset"."albumsId" = $1 and "album_asset"."assetsId" in ($2) + +-- AlbumRepository.getContributorCounts +select + "asset"."ownerId" as "userId", + count(*) as "assetCount" +from + "album_asset" + inner join "asset" on "asset"."id" = "assetsId" +where + "asset"."deletedAt" is null + and "album_asset"."albumsId" = $1 +group by + "asset"."ownerId" +having + count(*) > 0 +order by + "assetCount" desc diff --git a/server/src/repositories/album.repository.ts b/server/src/repositories/album.repository.ts index 80767b99a2..622fa094cc 100644 --- a/server/src/repositories/album.repository.ts +++ b/server/src/repositories/album.repository.ts @@ -385,17 +385,17 @@ export class AlbumRepository { * Excludes deleted assets, orders by count desc. */ @GenerateSql({ params: [DummyValue.UUID] }) - async getContributorCountsForId(id: string): Promise<{ userId: string; assetCount: number }[]> { + async getContributorCounts(id: string) { return this.db .selectFrom('album_asset') - .innerJoin('asset', (join) => - join.onRef('album_asset.assetsId', '=', 'asset.id').on('asset.deletedAt', 'is', null), - ) + .innerJoin('asset', 'asset.id', 'assetsId') + .where('asset.deletedAt', 'is', sql.lit(null)) .where('album_asset.albumsId', '=', id) .select('asset.ownerId as userId') - .select((eb) => sql`${eb.fn.count('asset.id')}::int`.as('assetCount')) + .select((eb) => eb.fn.countAll().as('assetCount')) .groupBy('asset.ownerId') - .orderBy(sql`count(asset.id)`, 'desc') + .having((eb) => eb(eb.fn.countAll(), '>', sql.lit(0))) + .orderBy('assetCount', 'desc') .execute(); } } diff --git a/server/src/services/album.service.ts b/server/src/services/album.service.ts index 30065ec67e..93cfc298ce 100644 --- a/server/src/services/album.service.ts +++ b/server/src/services/album.service.ts @@ -84,21 +84,14 @@ export class AlbumService extends BaseService { const hasSharedLink = (album.sharedLinks?.length ?? 0) > 0; const isShared = hasSharedUsers || hasSharedLink; - // Fetch contributor counts only for shared albums - let contributorCounts: { userId: string; assetCount: number }[] | undefined; - if (isShared) { - const rows = await this.albumRepository.getContributorCountsForId(album.id); - // Hide zeros as per requirements - contributorCounts = rows.filter(({ assetCount }) => assetCount > 0); - } - return { ...mapAlbum(album, withAssets, auth), startDate: albumMetadataForIds?.startDate ?? undefined, endDate: albumMetadataForIds?.endDate ?? undefined, assetCount: albumMetadataForIds?.assetCount ?? 0, lastModifiedAssetTimestamp: albumMetadataForIds?.lastModifiedAssetTimestamp ?? undefined, - ...(contributorCounts && contributorCounts.length > 0 ? { contributorCounts } : {}), + // Fetch contributor counts only for shared albums + contributorCounts: isShared ? await this.albumRepository.getContributorCounts(album.id) : undefined, }; }