58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import type { RuntimeMode } from "../shared/api";
|
|
|
|
import { createApiError, jsonResponse } from "./helpers";
|
|
|
|
const MAX_PAGE_SIZE = 200;
|
|
|
|
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("Invalid page parameter", 400), { mode, status: 400 });
|
|
}
|
|
}
|
|
|
|
if (pageSizeParam !== null) {
|
|
pageSize = Number(pageSizeParam);
|
|
if (!Number.isInteger(pageSize) || pageSize <= 0) {
|
|
return jsonResponse(createApiError("Invalid pageSize parameter", 400), { mode, status: 400 });
|
|
}
|
|
if (pageSize > MAX_PAGE_SIZE) {
|
|
return jsonResponse(createApiError(`pageSize must not exceed ${MAX_PAGE_SIZE}`, 400), { mode, status: 400 });
|
|
}
|
|
}
|
|
|
|
return { page, pageSize };
|
|
}
|
|
|
|
export function validateTargetId(idStr: string, mode: RuntimeMode): Response | { id: number } {
|
|
const id = Number(idStr);
|
|
if (!Number.isInteger(id) || id <= 0) {
|
|
return jsonResponse(createApiError("Invalid target ID", 400), { mode, status: 400 });
|
|
}
|
|
return { id };
|
|
}
|
|
|
|
export function validateTimeRange(
|
|
from: null | string,
|
|
to: null | string,
|
|
mode: RuntimeMode,
|
|
): Response | { from: string; to: string } {
|
|
if (!from || !to) {
|
|
return jsonResponse(createApiError("from and to parameters are required", 400), { mode, status: 400 });
|
|
}
|
|
|
|
if (isNaN(new Date(from).getTime()) || isNaN(new Date(to).getTime())) {
|
|
return jsonResponse(createApiError("Invalid from or to parameter format", 400), { mode, status: 400 });
|
|
}
|
|
|
|
return { from, to };
|
|
}
|