// server/api/images/history/[id].get.ts - 生图历史详情接口:返回当前用户单条记录的展示字段与归档状态。 import type { IImageHistoryDetail } from "#shared/types/openai"; /** * GET /api/images/history/:id * * 流程: * 1. 从 httpOnly cookie 读取当前用户 ID。 * 2. 校验路由参数 id 必须是数字,并转成 BigInt 查询。 * 3. 只允许读取当前用户、未软删除的记录。 * 4. 详情接口继续隐藏内部响应,只返回页面展示和归档状态所需字段。 */ export default defineEventHandler(async (event) => { const logger = createApiLogger("images.history.detail"); logger.info("开始"); try { const userId = getNewApiUserIdFromCookie(event); const recordId = parseRecordId(getRouterParam(event, "id")); logger.info("查询参数", { userId, recordId: recordId.toString() }); const result = await getImageGenerationDetail(userId, recordId); if (!result) { logger.warn("记录不存在", { userId, recordId: recordId.toString() }); return createErrorResponse(404, "生图记录不存在"); } logger.done("成功", { userId, recordId: recordId.toString(), status: result.status, hasHostedImageUrl: Boolean(result.hostedImageUrl) }); 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, "获取生图详情失败"); } }); /** 校验并解析路由里的生图记录 ID */ const parseRecordId = (value: string | undefined): bigint => { if (!value || !/^\d+$/.test(value)) { throw createError({ statusCode: 400, statusMessage: "生图记录 ID 不正确" }); } return BigInt(value); };