Files
aiartstudio/server/api/images/history.get.ts
T
2026-04-26 01:13:38 +08:00

82 lines
2.2 KiB
TypeScript

// 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<IImageHistoryListData>(
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;
};