// server/api/images/presets.get.ts - 预设提示词列表接口:分页返回已启用的生图预设。 import type { IPromptPresetListData } from "#shared/types/openai"; import { createApiLogger, createSuccessResponse, createUpstreamErrorResponse, listPromptPresets, toSafeLogError } from "~~/server/utils"; const DEFAULT_PAGE = 1; const DEFAULT_PAGE_SIZE = 20; const MAX_PAGE_SIZE = 50; /** * GET /api/images/presets * * 流程: * 1. 读取 page/size 查询参数,并限制最大 pageSize。 * 2. 只返回已启用的预设提示词,按导入顺序展示。 * 3. 返回前端展示和填充输入所需字段,不包含内部排查信息。 */ export default defineEventHandler(async (event) => { const logger = createApiLogger("images.presets.list"); logger.info("开始"); try { const query = getQuery(event); const page = normalizePositiveInt(query.page, DEFAULT_PAGE); const pageSize = Math.min( normalizePositiveInt(query.size, DEFAULT_PAGE_SIZE), MAX_PAGE_SIZE ); logger.info("查询参数", { page, pageSize }); const result = await listPromptPresets({ page, pageSize }); logger.done("成功", { page, pageSize, total: result.total, itemCount: result.items.length }); return createSuccessResponse( result, "获取预设提示词成功" ); } catch (error) { logger.error("失败", { error: toSafeLogError(error) }); return createUpstreamErrorResponse(error, "获取预设提示词失败"); } }); /** 将 query 参数归一化为正整数,非法值回退到默认值 */ const normalizePositiveInt = ( value: unknown, fallbackValue: number ): number => { const rawValue = Array.isArray(value) ? value[0] : value; const numberValue = Number.parseInt(String(rawValue ?? ""), 10); return Number.isInteger(numberValue) && numberValue > 0 ? numberValue : fallbackValue; };