From 2b462748659bfd9763555d74d43baf18a6af0217 Mon Sep 17 00:00:00 2001 From: chyoo Date: Tue, 7 Jul 2026 09:25:03 +0900 Subject: [PATCH] support paged launcher history queries --- src/launcher/launcher.service.ts | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) 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 }; }); }