2 changed files with 48 additions and 0 deletions
@ -0,0 +1,22 @@ |
|||
import { describe, expect, test } from "bun:test"; |
|||
import { parseMeMediaAssetsQuery } from "./me-media-assets-query"; |
|||
|
|||
describe("parseMeMediaAssetsQuery", () => { |
|||
test("defaults: {} -> { page: 1, pageSize: 20 }", () => { |
|||
expect(parseMeMediaAssetsQuery({})).toEqual({ page: 1, pageSize: 20 }); |
|||
}); |
|||
|
|||
test("pageSize 10 and 50 are accepted", () => { |
|||
expect(parseMeMediaAssetsQuery({ pageSize: "10" })).toEqual({ page: 1, pageSize: 10 }); |
|||
expect(parseMeMediaAssetsQuery({ pageSize: "50" })).toEqual({ page: 1, pageSize: 50 }); |
|||
}); |
|||
|
|||
test("pageSize 15 throws with statusCode 400", () => { |
|||
try { |
|||
parseMeMediaAssetsQuery({ pageSize: "15" }); |
|||
expect.unreachable(); |
|||
} catch (e: unknown) { |
|||
expect(e).toMatchObject({ statusCode: 400 }); |
|||
} |
|||
}); |
|||
}); |
|||
@ -0,0 +1,26 @@ |
|||
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]); |
|||
|
|||
export function parseMeMediaAssetsQuery(q: { page?: string; pageSize?: string }): { |
|||
page: number; |
|||
pageSize: number; |
|||
} { |
|||
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" }); |
|||
} |
|||
return { page, pageSize: pageSizeRaw }; |
|||
} |
|||
Loading…
Reference in new issue