Skip to content

Commit 55f68d2

Browse files
committed
perf(webapp): clamp list-endpoint page size to 100
Several list endpoints accepted an unbounded page size. Clamp perPage / per_page / pageSize to 100 on the schedules, queues, versions, engine-report, and llm-models endpoints, matching the existing cap on the runs and sessions endpoints. Oversized requests now return up to 100 items and keep paginating instead of pulling an unbounded page.
1 parent 722e240 commit 55f68d2

7 files changed

Lines changed: 38 additions & 6 deletions
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
area: webapp
3+
type: improvement
4+
---
5+
6+
List API endpoints now clamp the page size to a maximum of 100. Requests asking for a larger page size return up to 100 items and keep paginating, rather than pulling an unbounded page.

apps/webapp/app/routes/admin.api.v1.environments.$environmentId.engine.report.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ const ParamsSchema = z.object({
1313
const SearchParamsSchema = z.object({
1414
verbose: z.string().default("0"),
1515
page: z.coerce.number().optional(),
16-
per_page: z.coerce.number().optional(),
16+
per_page: z.coerce
17+
.number()
18+
.int()
19+
.positive()
20+
.transform((n) => Math.min(n, 100))
21+
.optional(),
1722
});
1823

1924
export async function loader({ request, params }: LoaderFunctionArgs) {

apps/webapp/app/routes/admin.api.v1.llm-models.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ export async function loader({ request }: LoaderFunctionArgs) {
99

1010
const url = new URL(request.url);
1111
const page = parseInt(url.searchParams.get("page") ?? "1");
12-
const pageSize = parseInt(url.searchParams.get("pageSize") ?? "50");
12+
const pageSize = Math.max(
13+
1,
14+
Math.min(parseInt(url.searchParams.get("pageSize") ?? "50") || 50, 100)
15+
);
1316

1417
const [models, total] = await Promise.all([
1518
prisma.llmModel.findMany({

apps/webapp/app/routes/api.v1.queues.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import { ServiceValidationError } from "~/v3/services/baseService.server";
1212

1313
const SearchParamsSchema = z.object({
1414
page: z.coerce.number().int().positive().optional(),
15-
perPage: z.coerce.number().int().positive().optional(),
15+
perPage: z.coerce
16+
.number()
17+
.int()
18+
.positive()
19+
.transform((n) => Math.min(n, 100))
20+
.optional(),
1621
});
1722

1823
export const loader = createLoaderApiRoute(

apps/webapp/app/routes/api.v1.schedules.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import { UpsertTaskScheduleService } from "~/v3/services/upsertTaskSchedule.serv
1212

1313
const SearchParamsSchema = z.object({
1414
page: z.coerce.number().int().positive().optional(),
15-
perPage: z.coerce.number().int().positive().optional(),
15+
perPage: z.coerce
16+
.number()
17+
.int()
18+
.positive()
19+
.transform((n) => Math.min(n, 100))
20+
.optional(),
1621
});
1722

1823
export async function action({ request }: ActionFunctionArgs) {

apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.queues.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import { EnvironmentParamSchema } from "~/utils/pathBuilder";
99
const SearchParamsSchema = z.object({
1010
query: z.string().optional(),
1111
page: z.coerce.number().min(1).default(1),
12-
per_page: z.coerce.number().min(1).default(20),
12+
per_page: z.coerce
13+
.number()
14+
.min(1)
15+
.transform((n) => Math.min(n, 100))
16+
.default(20),
1317
type: z.enum(["task", "custom"]).optional(),
1418
});
1519

apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.versions.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import { EnvironmentParamSchema } from "~/utils/pathBuilder";
88

99
const SearchParamsSchema = z.object({
1010
query: z.string().optional(),
11-
per_page: z.coerce.number().min(1).default(25),
11+
per_page: z.coerce
12+
.number()
13+
.min(1)
14+
.transform((n) => Math.min(n, 100))
15+
.default(25),
1216
});
1317

1418
export async function loader({ request, params }: LoaderFunctionArgs) {

0 commit comments

Comments
 (0)