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