From d41c6e791d18690a622349def0df0f9339f1fd3a Mon Sep 17 00:00:00 2001 From: Okeke Chinedu Emmanuel Date: Sat, 28 Mar 2026 13:55:15 +0100 Subject: [PATCH 1/6] Add reusable creator list default limit helper --- src/modules/creator/creator.controller.ts | 4 ++-- src/modules/creators/creators.limit.utils.ts | 10 ++++++++++ src/modules/creators/creators.schemas.ts | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 src/modules/creators/creators.limit.utils.ts diff --git a/src/modules/creator/creator.controller.ts b/src/modules/creator/creator.controller.ts index 02f3a22..30951db 100644 --- a/src/modules/creator/creator.controller.ts +++ b/src/modules/creator/creator.controller.ts @@ -12,9 +12,9 @@ import { parseCreatorSortOptions } from './creator.utils'; import { safeIntParam } from '../../utils/query.utils'; import { parsePublicQuery } from '../../utils/public-query-parse.utils'; import { wrapPublicCreatorListResponse } from '../creators/public-creator-list-envelope.utils'; +import { resolveCreatorListLimit } from '../creators/creators.limit.utils'; import { DEFAULT_PAGE, - DEFAULT_PAGE_SIZE, MIN_PAGE_SIZE, MAX_PAGE_SIZE, } from '../../constants/pagination.constants'; @@ -27,7 +27,7 @@ const LegacyCreatorQuerySchema = z.object({ label: 'Page', }), limit: safeIntParam({ - defaultValue: DEFAULT_PAGE_SIZE, + defaultValue: resolveCreatorListLimit(), min: MIN_PAGE_SIZE, max: MAX_PAGE_SIZE, label: 'Limit', diff --git a/src/modules/creators/creators.limit.utils.ts b/src/modules/creators/creators.limit.utils.ts new file mode 100644 index 0000000..2f0861f --- /dev/null +++ b/src/modules/creators/creators.limit.utils.ts @@ -0,0 +1,10 @@ +import { DEFAULT_PAGE_SIZE } from '../../constants/pagination.constants'; + +/** + * Resolve list limit for public creator list endpoints. + * + * Returns the shared default page size when the incoming page size is omitted. + */ +export function resolveCreatorListLimit(pageSize?: number): number { + return pageSize ?? DEFAULT_PAGE_SIZE; +} diff --git a/src/modules/creators/creators.schemas.ts b/src/modules/creators/creators.schemas.ts index 249476e..0c2cb6e 100644 --- a/src/modules/creators/creators.schemas.ts +++ b/src/modules/creators/creators.schemas.ts @@ -4,12 +4,12 @@ import { creatorListSortDirectionQueryParam } from './creators.sort-direction.pa import { withCreatorListQueryStringNormalization } from './creators.query-string.utils'; import { safeIntParam } from '../../utils/query.utils'; import { - DEFAULT_PAGE_SIZE, DEFAULT_OFFSET, MIN_PAGE_SIZE, MAX_PAGE_SIZE, } from '../../constants/pagination.constants'; import { DEFAULT_CREATOR_LIST_SORT } from '../../constants/creator-list-sort.constants'; +import { resolveCreatorListLimit } from './creators.limit.utils'; /** * Validation schema for creator list query parameters. @@ -23,7 +23,7 @@ import { DEFAULT_CREATOR_LIST_SORT } from '../../constants/creator-list-sort.con export const CreatorListQuerySchema = z.object({ // Pagination limit: safeIntParam({ - defaultValue: DEFAULT_PAGE_SIZE, + defaultValue: resolveCreatorListLimit(), min: MIN_PAGE_SIZE, max: MAX_PAGE_SIZE, label: 'Limit', From 0a6d288202e5b11649804bf081078e51dee6a1b4 Mon Sep 17 00:00:00 2001 From: Okeke Chinedu Emmanuel Date: Sat, 28 Mar 2026 14:41:26 +0100 Subject: [PATCH 2/6] Add creator list search term normalizer --- src/modules/creators/creators.schemas.ts | 8 +++++++- .../creators/creators.search-term.utils.ts | 20 +++++++++++++++++++ src/modules/creators/creators.utils.ts | 9 ++++++--- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/modules/creators/creators.search-term.utils.ts diff --git a/src/modules/creators/creators.schemas.ts b/src/modules/creators/creators.schemas.ts index 0c2cb6e..8613e94 100644 --- a/src/modules/creators/creators.schemas.ts +++ b/src/modules/creators/creators.schemas.ts @@ -10,6 +10,7 @@ import { } from '../../constants/pagination.constants'; import { DEFAULT_CREATOR_LIST_SORT } from '../../constants/creator-list-sort.constants'; import { resolveCreatorListLimit } from './creators.limit.utils'; +import { normalizeCreatorListSearchTerm } from './creators.search-term.utils'; /** * Validation schema for creator list query parameters. @@ -51,7 +52,12 @@ export const CreatorListQuerySchema = z.object({ return val === 'true'; }) ), - search: withCreatorListQueryStringNormalization(z.string().optional()), + search: withCreatorListQueryStringNormalization( + z + .string() + .optional() + .transform(val => normalizeCreatorListSearchTerm(val)) + ), }); export type CreatorListQueryType = z.infer; diff --git a/src/modules/creators/creators.search-term.utils.ts b/src/modules/creators/creators.search-term.utils.ts new file mode 100644 index 0000000..0c0f34f --- /dev/null +++ b/src/modules/creators/creators.search-term.utils.ts @@ -0,0 +1,20 @@ +/** + * Normalize free-text creator list search terms before filtering. + * + * Scope is intentionally narrow and reusable: + * - Accepts `string | null | undefined` + * - Trims leading/trailing whitespace + * - Collapses internal whitespace to single spaces + * - Returns `undefined` for empty/whitespace-only values + */ +export function normalizeCreatorListSearchTerm( + term: string | null | undefined +): string | undefined { + if (typeof term !== 'string') { + return undefined; + } + + const normalized = term.trim().replace(/\s+/g, ' '); + return normalized === '' ? undefined : normalized; +} + diff --git a/src/modules/creators/creators.utils.ts b/src/modules/creators/creators.utils.ts index aa65e1a..6b37d57 100644 --- a/src/modules/creators/creators.utils.ts +++ b/src/modules/creators/creators.utils.ts @@ -5,6 +5,7 @@ import { mapCreatorListSort } from './creators.sort'; import { CreatorListResponse } from './creators.serializers'; import { wrapPublicCreatorListResponse } from './public-creator-list-envelope.utils'; import { buildOffsetPaginationMeta } from '../../utils/pagination.utils'; +import { normalizeCreatorListSearchTerm } from './creators.search-term.utils'; type CreatorListWhere = { isVerified?: boolean; @@ -32,10 +33,12 @@ export async function fetchCreatorList( where.isVerified = verified; } - if (search) { + const normalizedSearch = normalizeCreatorListSearchTerm(search); + + if (normalizedSearch) { where.OR = [ - { handle: { contains: search, mode: 'insensitive' } }, - { displayName: { contains: search, mode: 'insensitive' } }, + { handle: { contains: normalizedSearch, mode: 'insensitive' } }, + { displayName: { contains: normalizedSearch, mode: 'insensitive' } }, ]; } From e7eaaf1f7172f32fc851174c8a19b7913f7fde2a Mon Sep 17 00:00:00 2001 From: Okoli Johnpaul Sochimaobi <132228270+Johnpii1@users.noreply.github.com> Date: Sun, 29 Mar 2026 06:57:28 +0100 Subject: [PATCH 3/6] Update creator.controller.ts --- src/modules/creator/creator.controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/creator/creator.controller.ts b/src/modules/creator/creator.controller.ts index ce19c2d..ad5ed45 100644 --- a/src/modules/creator/creator.controller.ts +++ b/src/modules/creator/creator.controller.ts @@ -15,7 +15,6 @@ import { wrapPublicCreatorListResponse } from '../creators/public-creator-list-e import { buildCreatorListRequestContext } from '../creators/creator-list-context.utils'; import { normalizeCreatorListPage } from './creator-list-page.guard'; import { - DEFAULT_PAGE, MIN_PAGE_SIZE, MAX_PAGE_SIZE, } from '../../constants/pagination.constants'; @@ -29,7 +28,7 @@ const LegacyCreatorQuerySchema = z.object({ label: 'Page', }), limit: safeIntParam({ -defaultValue: PUBLIC_PAGE_PAGINATION_DEFAULTS.limit, + defaultValue: PUBLIC_PAGE_PAGINATION_DEFAULTS.limit, min: MIN_PAGE_SIZE, max: MAX_PAGE_SIZE, label: 'Limit', From 36f204f9256019d40c88506b78339033ebd4c41e Mon Sep 17 00:00:00 2001 From: Okoli Johnpaul Sochimaobi <132228270+Johnpii1@users.noreply.github.com> Date: Sun, 29 Mar 2026 07:01:07 +0100 Subject: [PATCH 4/6] Update creators.schemas.ts --- src/modules/creators/creators.schemas.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/creators/creators.schemas.ts b/src/modules/creators/creators.schemas.ts index 90c2b18..e14e4f0 100644 --- a/src/modules/creators/creators.schemas.ts +++ b/src/modules/creators/creators.schemas.ts @@ -1,10 +1,10 @@ +// src/modules/creators/creators.schemas.ts import { z } from 'zod'; import { creatorListSortDirectionQueryParam } from './creators.sort-direction.parse'; import { creatorListIncludeQueryParam } from './creators.include.parse'; import { withCreatorListQueryStringNormalization } from './creators.query-string.utils'; import { safeIntParam } from '../../utils/query.utils'; import { - DEFAULT_OFFSET, MIN_PAGE_SIZE, MAX_PAGE_SIZE, } from '../../constants/pagination.constants'; @@ -66,4 +66,4 @@ export const CreatorListQuerySchema = z.object({ ), }); -export type CreatorListQueryType = z.infer; \ No newline at end of file +export type CreatorListQueryType = z.infer; From 1ccc54d45b79f69012bc4f1470d214049add7a42 Mon Sep 17 00:00:00 2001 From: Okoli Johnpaul Sochimaobi <132228270+Johnpii1@users.noreply.github.com> Date: Sun, 29 Mar 2026 07:03:11 +0100 Subject: [PATCH 5/6] Update creators.schemas.ts From 0215ae3987d12752bdf65e39372217e58eccfd30 Mon Sep 17 00:00:00 2001 From: Okoli Johnpaul Sochimaobi <132228270+Johnpii1@users.noreply.github.com> Date: Sun, 29 Mar 2026 07:07:56 +0100 Subject: [PATCH 6/6] Update creators.schemas.ts