diff --git a/server/service/media/index.ts b/server/service/media/index.ts index 0cfe854..a93d066 100644 --- a/server/service/media/index.ts +++ b/server/service/media/index.ts @@ -386,3 +386,71 @@ export async function purgeAllDeletableOrphansGlobally(limit: number): Promise { + const [{ total: totalRaw }] = await dbGlobal + .select({ total: count() }) + .from(mediaAssets) + .where(eq(mediaAssets.userId, userId)); + + const total = typeof totalRaw === "bigint" ? Number(totalRaw) : Number(totalRaw); + + const offset = (page - 1) * pageSize; + const rows = await dbGlobal + .select({ + id: mediaAssets.id, + storageKey: mediaAssets.storageKey, + mime: mediaAssets.mime, + sizeBytes: mediaAssets.sizeBytes, + createdAt: mediaAssets.createdAt, + }) + .from(mediaAssets) + .where(eq(mediaAssets.userId, userId)) + .orderBy(desc(mediaAssets.createdAt)) + .limit(pageSize) + .offset(offset); + + if (rows.length === 0) { + return { items: [], total }; + } + + const ids = rows.map((r) => r.id); + const refAgg = await dbGlobal + .select({ + assetId: mediaRefs.assetId, + refCount: count(), + }) + .from(mediaRefs) + .where(inArray(mediaRefs.assetId, ids)) + .groupBy(mediaRefs.assetId); + + const refMap = new Map(); + for (const r of refAgg) { + const c = r.refCount; + refMap.set(r.assetId, typeof c === "bigint" ? Number(c) : Number(c)); + } + + const items: UserMediaAssetListRow[] = rows.map((row) => ({ + id: row.id, + storageKey: row.storageKey, + mime: row.mime, + sizeBytes: row.sizeBytes, + createdAt: row.createdAt, + refCount: refMap.get(row.id) ?? 0, + })); + + return { items, total }; +}