refactor: 统一管理页面布局 — FilterToolbar + usePageSearchParams + parseListParams

This commit is contained in:
2026-06-04 17:25:36 +08:00
parent 61b479e2be
commit 6f547560d1
40 changed files with 1805 additions and 628 deletions

View File

@@ -4,24 +4,26 @@ import type { RuntimeMode } from "../../../shared/api";
import type { Logger } from "../../logger";
import { listModels } from "../../db/models";
import { jsonResponse } from "../../helpers";
import { validatePagination } from "../../middleware";
import { jsonResponse, parseListParams } from "../../helpers";
const ALLOWED_SORT_BY = ["createdAt", "name"];
export function handleListModels(req: Request, db: Database, mode: RuntimeMode, _logger: Logger): Response {
const url = new URL(req.url);
const pageParam = url.searchParams.get("page");
const pageSizeParam = url.searchParams.get("pageSize");
const keyword = url.searchParams.get("keyword");
const providerId = url.searchParams.get("providerId");
const capabilities = url.searchParams.get("capabilities");
const pagination = validatePagination(pageParam, pageSizeParam, mode);
if (pagination instanceof Response) return pagination;
const parsed = parseListParams(url, mode, { allowedSortBy: ALLOWED_SORT_BY });
if (parsed instanceof Response) return parsed;
const result = listModels(db, {
keyword: keyword ?? undefined,
page: pagination.page,
pageSize: pagination.pageSize,
capabilities: capabilities ?? undefined,
keyword: parsed.keyword,
page: parsed.page,
pageSize: parsed.pageSize,
providerId: providerId ?? undefined,
sortBy: parsed.sortBy,
sortOrder: parsed.sortOrder,
});
return jsonResponse(result, { mode });

View File

@@ -4,27 +4,27 @@ import type { RuntimeMode } from "../../../shared/api";
import type { Logger } from "../../logger";
import { listProjects } from "../../db/projects";
import { createApiError, jsonResponse } from "../../helpers";
import { validatePagination } from "../../middleware";
import { createApiError, jsonResponse, parseListParams } from "../../helpers";
const ALLOWED_SORT_BY = ["createdAt", "name", "updatedAt"];
export function handleListProjects(req: Request, db: Database, mode: RuntimeMode, _logger: Logger): Response {
const url = new URL(req.url);
const pageParam = url.searchParams.get("page");
const pageSizeParam = url.searchParams.get("pageSize");
const keyword = url.searchParams.get("keyword");
const statusParam = url.searchParams.get("status");
const pagination = validatePagination(pageParam, pageSizeParam, mode);
if (pagination instanceof Response) return pagination;
if (statusParam && statusParam !== "active" && statusParam !== "archived") {
return jsonResponse(createApiError("Invalid status parameter", 400), { mode, status: 400 });
}
const parsed = parseListParams(url, mode, { allowedSortBy: ALLOWED_SORT_BY });
if (parsed instanceof Response) return parsed;
const result = listProjects(db, {
keyword: keyword ?? undefined,
page: pagination.page,
pageSize: pagination.pageSize,
keyword: parsed.keyword,
page: parsed.page,
pageSize: parsed.pageSize,
sortBy: parsed.sortBy,
sortOrder: parsed.sortOrder,
status: (statusParam as "active" | "archived") ?? undefined,
});

View File

@@ -4,22 +4,24 @@ import type { RuntimeMode } from "../../../shared/api";
import type { Logger } from "../../logger";
import { listProviders } from "../../db/providers";
import { jsonResponse } from "../../helpers";
import { validatePagination } from "../../middleware";
import { jsonResponse, parseListParams } from "../../helpers";
const ALLOWED_SORT_BY = ["createdAt", "name"];
export function handleListProviders(req: Request, db: Database, mode: RuntimeMode, _logger: Logger): Response {
const url = new URL(req.url);
const pageParam = url.searchParams.get("page");
const pageSizeParam = url.searchParams.get("pageSize");
const keyword = url.searchParams.get("keyword");
const typeParam = url.searchParams.get("type");
const pagination = validatePagination(pageParam, pageSizeParam, mode);
if (pagination instanceof Response) return pagination;
const parsed = parseListParams(url, mode, { allowedSortBy: ALLOWED_SORT_BY });
if (parsed instanceof Response) return parsed;
const result = listProviders(db, {
keyword: keyword ?? undefined,
page: pagination.page,
pageSize: pagination.pageSize,
keyword: parsed.keyword,
page: parsed.page,
pageSize: parsed.pageSize,
sortBy: parsed.sortBy,
sortOrder: parsed.sortOrder,
type: typeParam ?? undefined,
});
return jsonResponse(result, { mode });