diff --git a/src/launcher/launcher.service.ts b/src/launcher/launcher.service.ts index a1c07b7..c3b1e6b 100644 --- a/src/launcher/launcher.service.ts +++ b/src/launcher/launcher.service.ts @@ -428,18 +428,34 @@ export class LauncherService { } listBuildJobs(query: ListLauncherBuildJobsQuery = {}) { + const paged = Boolean(query.page || query.limit || query.target || query.since); const page = toPositiveInt(query.page, 1); const limit = Math.min(toPositiveInt(query.limit, 30), 100); const since = query.since ? new Date(query.since) : null; + const where = { + ...(query.target ? { target: query.target } : {}), + ...(since && Number.isFinite(since.getTime()) ? { createdAt: { gte: since } } : {}), + }; - return this.prisma.launcherBuildJob.findMany({ - where: { - ...(query.target ? { target: query.target } : {}), - ...(since && Number.isFinite(since.getTime()) ? { createdAt: { gte: since } } : {}), - }, - orderBy: { createdAt: 'desc' }, - skip: (page - 1) * limit, - take: limit, + if (!paged) { + return this.prisma.launcherBuildJob.findMany({ + orderBy: { createdAt: 'desc' }, + take: 30, + }); + } + + return this.prisma.$transaction(async (tx) => { + const [jobs, total] = await Promise.all([ + tx.launcherBuildJob.findMany({ + where, + orderBy: { createdAt: 'desc' }, + skip: (page - 1) * limit, + take: limit, + }), + tx.launcherBuildJob.count({ where }), + ]); + + return { jobs, total, page, limit }; }); }