import type { RuntimeMode } from "../../shared/api"; import { createApiError, jsonResponse } from "../helpers"; const MAX_PAGE_SIZE = 200; export function validateIdParam(idStr: string, mode: RuntimeMode): Response | { id: string } { if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(idStr)) { return jsonResponse(createApiError("无效的 ID 参数", 400), { mode, status: 400 }); } return { id: idStr }; } export function validatePagination( pageParam: null | string, pageSizeParam: null | string, mode: RuntimeMode, ): Response | { page: number; pageSize: number } { let page = 1; let pageSize = 20; if (pageParam !== null) { page = Number(pageParam); if (!Number.isInteger(page) || page <= 0) { return jsonResponse(createApiError("无效的 page 参数", 400), { mode, status: 400 }); } } if (pageSizeParam !== null) { pageSize = Number(pageSizeParam); if (!Number.isInteger(pageSize) || pageSize <= 0) { return jsonResponse(createApiError("无效的 pageSize 参数", 400), { mode, status: 400 }); } if (pageSize > MAX_PAGE_SIZE) { return jsonResponse(createApiError(`pageSize 不能超过 ${MAX_PAGE_SIZE}`, 400), { mode, status: 400 }); } } return { page, pageSize }; } export function validateTimeRange( from: null | string, to: null | string, mode: RuntimeMode, ): Response | { from: string; to: string } { if (!from || !to) { return jsonResponse(createApiError("from 和 to 参数为必填项", 400), { mode, status: 400 }); } const fromDate = new Date(from); const toDate = new Date(to); if (isNaN(fromDate.getTime()) || isNaN(toDate.getTime())) { return jsonResponse(createApiError("无效的 from 或 to 参数格式", 400), { mode, status: 400 }); } if (fromDate.getTime() > toDate.getTime()) { return jsonResponse(createApiError("from 必须早于 to", 400), { mode, status: 400 }); } return { from: fromDate.toISOString(), to: toDate.toISOString() }; }