From 8b1b8d73b1b9f5a7941a1e00d5cc5c4030baa536 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sun, 19 Apr 2026 10:54:54 +0800 Subject: [PATCH] feat(media): add me media assets query parser and tests Made-with: Cursor --- server/utils/me-media-assets-query.test.ts | 22 ++++++++++++++++++++++ server/utils/me-media-assets-query.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 server/utils/me-media-assets-query.test.ts create mode 100644 server/utils/me-media-assets-query.ts diff --git a/server/utils/me-media-assets-query.test.ts b/server/utils/me-media-assets-query.test.ts new file mode 100644 index 0000000..8515e3c --- /dev/null +++ b/server/utils/me-media-assets-query.test.ts @@ -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 }); + } + }); +}); diff --git a/server/utils/me-media-assets-query.ts b/server/utils/me-media-assets-query.ts new file mode 100644 index 0000000..16b166d --- /dev/null +++ b/server/utils/me-media-assets-query.ts @@ -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 }; +}