import { createError } from "h3"; function parsePositiveInt(raw: string | undefined, fallback: number, label: string): number { if (raw === undefined || raw === "") { return fallback; } const n = Number(raw); if (!Number.isInteger(n) || n < 1) { throw createError({ statusCode: 400, statusMessage: `${label} 须为正整数` }); } return n; } const ALLOWED_PAGE_SIZES = new Set([10, 20, 50]); const MAX_SEARCH_LEN = 200; export function parseMeMediaAssetsQuery(q: { page?: string; pageSize?: string; search?: string }): { page: number; pageSize: number; search: string | null; } { const page = parsePositiveInt(q.page, 1, "page"); const pageSizeRaw = parsePositiveInt(q.pageSize, 20, "pageSize"); if (!ALLOWED_PAGE_SIZES.has(pageSizeRaw)) { throw createError({ statusCode: 400, statusMessage: "pageSize 须为 10、20 或 50" }); } let search: string | null = null; if (typeof q.search === "string") { const s = q.search.trim(); if (s.length > MAX_SEARCH_LEN) { throw createError({ statusCode: 400, statusMessage: `search 最多 ${MAX_SEARCH_LEN} 个字符` }); } search = s.length ? s : null; } return { page, pageSize: pageSizeRaw, search }; }