Files
OCS_service/server/api/records.get.ts
T
2026-05-23 13:45:58 +08:00

47 lines
1.6 KiB
TypeScript

// server/api/records.get.ts - 用户问答记录接口,供 Nuxt Dashboard 表格展示
import { getQuery, setResponseStatus } from "h3";
import { createApiLogger } from "~~/server/utils/logging";
import { apiErr, apiOk } from "~~/server/utils/response";
import { getQaRecords } from "~~/server/utils/runtimeState";
/**
* 用户问答记录接口(分页,最新在前)
*
* 安全边界:
* - 必须携带有效 session cookie(由 api-auth middleware 统一鉴权)
* - 只返回当前登录用户自己的记录,用 userId 严格隔离
* - 不包含 OpenAI 响应体、API Key 或内部错误
*/
export default defineEventHandler(async (event) => {
const logger = createApiLogger(event, "api.records");
const query = getQuery(event);
const rawPage = Number.parseInt(query.page?.toString() || "1", 10);
const rawSize = Number.parseInt(query.size?.toString() || "10", 10);
// size 只允许 10 / 50 / 100;传入其他值(含超出上限)一律退回 10
const ALLOWED_SIZES = new Set([10, 50, 100]);
const size = ALLOWED_SIZES.has(rawSize) ? rawSize : 10;
const page = Number.isFinite(rawPage) ? Math.max(rawPage, 1) : 1;
try {
const { records, total } = await getQaRecords(event.context.auth!.user.id, {
page,
size
});
logger.info("finish_success", {
page,
size,
total,
count: records.length
});
return apiOk({ records, page, size, total });
} catch (err) {
logger.error("db_error", { err: String(err) });
setResponseStatus(event, 500);
return apiErr(500, "服务器内部错误");
}
});