apps/recallassess/recallassess-api/src/api/admin/report/utils/report-valuelist-query.util.ts
Shared query parsing for report searchable-select (valuelist) HTTP endpoints.
Aligns with module list behavior: keyword, page, limit (same defaults/cap as core Pagination query parsing).
Properties |
| keyword |
keyword:
|
Type : string
|
| Optional |
| limit |
limit:
|
Type : number
|
| page |
page:
|
Type : number
|
| skip |
skip:
|
Type : number
|
export interface ReportValuelistListQuery {
keyword?: string;
page: number;
limit: number;
skip: number;
}
function pickFirst(v: string | string[] | undefined): string | undefined {
if (v === undefined) {
return undefined;
}
return Array.isArray(v) ? v[0] : v;
}
/**
* Parses `keyword`, `page`, and `limit` from a request query object.
* - `keyword`: trimmed; empty/whitespace → undefined (no filter).
* - `page`: default 1, minimum 1.
* - `limit`: default 50, clamped to 1..5000 (same max as core Pagination decorator).
*/
export function parseReportValuelistListQuery(
query: Record<string, string | string[] | undefined>,
): ReportValuelistListQuery {
const rawKeyword = pickFirst(query["keyword"]);
const keyword =
typeof rawKeyword === "string" && rawKeyword.trim().length > 0 ? rawKeyword.trim() : undefined;
let page = Number.parseInt(pickFirst(query["page"]) ?? "1", 10);
if (!Number.isFinite(page) || page < 1) {
page = 1;
}
let limit = Number.parseInt(pickFirst(query["limit"]) ?? "50", 10);
if (!Number.isFinite(limit)) {
limit = 50;
}
if (limit > 5000) {
limit = 5000;
}
if (limit < 1) {
limit = 1;
}
const skip = (page - 1) * limit;
return { keyword, page, limit, skip };
}