// server/api/images/history.get.ts - 生图历史列表接口:分页返回当前用户未软删除的记录。 import type { IImageHistoryListData } from "#shared/types/openai"; const DEFAULT_PAGE = 1; const DEFAULT_PAGE_SIZE = 10; const MAX_PAGE_SIZE = 50; /** * GET /api/images/history * * 流程: * 1. 从 httpOnly cookie 读取当前用户 ID。 * 2. 读取 page/size 查询参数,并限制最大 pageSize,避免一次查太多。 * 3. 只查询当前用户且未软删除的记录,按创建时间倒序返回。 * 4. 列表只返回页面展示所需字段,不返回内部响应或供应商调试数据。 */ export default defineEventHandler(async (event) => { const logger = createApiLogger("images.history.list"); logger.info("开始"); try { const userId = getNewApiUserIdFromCookie(event); 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("查询参数", { userId, page, pageSize }); const result = await listImageGenerationHistory({ userId, page, pageSize }); logger.done("成功", { userId, page, pageSize, total: result.total, itemCount: result.items.length }); return createSuccessResponse( result, "获取生图历史成功" ); } catch (error) { if (isUnauthorizedError(error)) { clearNewApiAuthCookies(event); logger.warn("未登录或登录态失效", { error: toSafeLogError(error) }); return createErrorResponse(401, "未登录"); } 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; };