diff --git a/packages/@n8n/api-types/src/dto/insights/__tests__/list-workflow-query.dto.test.ts b/packages/@n8n/api-types/src/dto/insights/__tests__/list-workflow-query.dto.test.ts index 70455a56ce..c47d81156f 100644 --- a/packages/@n8n/api-types/src/dto/insights/__tests__/list-workflow-query.dto.test.ts +++ b/packages/@n8n/api-types/src/dto/insights/__tests__/list-workflow-query.dto.test.ts @@ -44,6 +44,19 @@ describe('ListInsightsWorkflowQueryDto', () => { sortBy: 'total:desc', }, }, + { + name: 'limit take to 100', + request: { + skip: '0', + take: '200', + sortBy: 'total:asc', + }, + parsedResult: { + skip: 0, + take: 100, + sortBy: 'total:asc', + }, + }, ])('should validate $name', ({ request, parsedResult }) => { const result = ListInsightsWorkflowQueryDto.safeParse(request); expect(result.success).toBe(true); diff --git a/packages/@n8n/api-types/src/dto/insights/list-workflow-query.dto.ts b/packages/@n8n/api-types/src/dto/insights/list-workflow-query.dto.ts index 7e7c944ff3..29ae5d79ae 100644 --- a/packages/@n8n/api-types/src/dto/insights/list-workflow-query.dto.ts +++ b/packages/@n8n/api-types/src/dto/insights/list-workflow-query.dto.ts @@ -2,7 +2,9 @@ import { z } from 'zod'; import { Z } from 'zod-class'; import { InsightsDateFilterDto } from './date-filter.dto'; -import { paginationSchema } from '../pagination/pagination.dto'; +import { createTakeValidator, paginationSchema } from '../pagination/pagination.dto'; + +export const MAX_ITEMS_PER_PAGE = 100; const VALID_SORT_OPTIONS = [ 'total:asc', @@ -31,6 +33,7 @@ const sortByValidator = z export class ListInsightsWorkflowQueryDto extends Z.class({ ...paginationSchema, + take: createTakeValidator(MAX_ITEMS_PER_PAGE), dateRange: InsightsDateFilterDto.shape.dateRange, sortBy: sortByValidator, }) {} diff --git a/packages/@n8n/api-types/src/dto/pagination/__tests__/pagination.dto.test.ts b/packages/@n8n/api-types/src/dto/pagination/__tests__/pagination.dto.test.ts index 3a32b00a12..18081ac854 100644 --- a/packages/@n8n/api-types/src/dto/pagination/__tests__/pagination.dto.test.ts +++ b/packages/@n8n/api-types/src/dto/pagination/__tests__/pagination.dto.test.ts @@ -1,4 +1,4 @@ -import { PaginationDto, MAX_ITEMS_PER_PAGE } from '../pagination.dto'; +import { PaginationDto, MAX_ITEMS_PER_PAGE, createTakeValidator } from '../pagination.dto'; describe('PaginationDto', () => { describe('valid inputs', () => { @@ -133,4 +133,17 @@ describe('PaginationDto', () => { } }); }); + + describe('createTakeValidator', () => { + test('should create a take validator with custom maxItems', () => { + const customMaxItems = 100; + const customTakeValidator = createTakeValidator(customMaxItems); + const result = customTakeValidator.safeParse('150'); + + expect(result.success).toBe(true); + if (result.success) { + expect(result.data).toBe(customMaxItems); + } + }); + }); }); diff --git a/packages/@n8n/api-types/src/dto/pagination/pagination.dto.ts b/packages/@n8n/api-types/src/dto/pagination/pagination.dto.ts index d4c8ffae33..0c2ce7ab69 100644 --- a/packages/@n8n/api-types/src/dto/pagination/pagination.dto.ts +++ b/packages/@n8n/api-types/src/dto/pagination/pagination.dto.ts @@ -14,21 +14,22 @@ const skipValidator = z message: 'Param `skip` must be a non-negative integer', }); -const takeValidator = z - .string() - .optional() - .transform((val) => (val ? parseInt(val, 10) : 10)) - .refine((val) => !isNaN(val) && Number.isInteger(val), { - message: 'Param `take` must be a valid integer', - }) - .refine((val) => val >= 0, { - message: 'Param `take` must be a non-negative integer', - }) - .transform((val) => Math.min(val, MAX_ITEMS_PER_PAGE)); +export const createTakeValidator = (maxItems: number) => + z + .string() + .optional() + .transform((val) => (val ? parseInt(val, 10) : 10)) + .refine((val) => !isNaN(val) && Number.isInteger(val), { + message: 'Param `take` must be a valid integer', + }) + .refine((val) => val >= 0, { + message: 'Param `take` must be a non-negative integer', + }) + .transform((val) => Math.min(val, maxItems)); export const paginationSchema = { skip: skipValidator, - take: takeValidator, + take: createTakeValidator(MAX_ITEMS_PER_PAGE), }; export class PaginationDto extends Z.class(paginationSchema) {}