// server/api/images/history/[id].delete.ts - 生图历史删除接口:软删除当前用户的单条记录。 import { clearNewApiAuthCookies, createApiLogger, createErrorResponse, createSuccessResponse, createUpstreamErrorResponse, getNewApiUserIdFromCookie, isUnauthorizedError, softDeleteImageGeneration, toSafeLogError } from "~~/server/utils"; /** * DELETE /api/images/history/:id * * 流程: * 1. 从 httpOnly cookie 读取当前用户 ID。 * 2. 校验路由参数 id 必须是数字。 * 3. 只软删除当前用户且未删除的记录,避免越权删除其他用户历史。 * 4. 找不到记录时返回 404,数据库中保留原始记录和 deletedAt。 */ export default defineEventHandler(async (event) => { const logger = createApiLogger("images.history.delete"); logger.info("开始"); try { const userId = getNewApiUserIdFromCookie(event); const recordId = parseRecordId(getRouterParam(event, "id")); logger.info("删除参数", { userId, recordId: recordId.toString() }); const deleted = await softDeleteImageGeneration(userId, recordId); if (!deleted) { logger.warn("记录不存在", { userId, recordId: recordId.toString() }); return createErrorResponse(404, "生图记录不存在"); } logger.done("成功", { userId, recordId: recordId.toString() }); return createSuccessResponse(null, "删除生图记录成功"); } 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); };