feat: 支持批量生图

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-04-27 01:40:46 +08:00
parent 9a715dede8
commit 7f59b555c6
22 changed files with 1731 additions and 394 deletions
+79
View File
@@ -0,0 +1,79 @@
// server/api/images/plaza/[id].get.ts - 广场公开详情接口:返回单个公开批次中可展示的全部公开图片。
import type { IPlazaPostDetail } from "#shared/types/openai";
import {
createApiLogger,
createErrorResponse,
createSuccessResponse,
createUpstreamErrorResponse,
getPlazaPostDetail,
toSafeLogError
} from "~~/server/utils";
/**
* GET /api/images/plaza/:id
*
* 流程:
* 1. 校验路由参数 id 必须是数字。
* 2. 只返回 PUBLIC、批次未删除、图片已归档成功的公开详情。
* 3. 不返回上游响应、图床响应或内部错误详情。
*/
export default defineEventHandler(async (event) => {
const logger = createApiLogger("images.plaza.detail");
logger.info("开始");
try {
const postId = parseRecordId(getRouterParam(event, "id"));
logger.info("查询参数", {
postId: postId.toString()
});
const result = await getPlazaPostDetail(postId);
if (!result) {
logger.warn("公开记录不存在", {
postId: postId.toString()
});
return createErrorResponse(404, "公开记录不存在");
}
logger.done("成功", {
postId: postId.toString(),
imageCount: result.images.length
});
return createSuccessResponse<IPlazaPostDetail>(
result,
"获取广场图片详情成功"
);
} catch (error) {
if (isBadRequestError(error)) {
return createErrorResponse(400, "公开记录 ID 不正确");
}
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);
};
const isBadRequestError = (error: unknown): boolean => {
return (
typeof error === "object" &&
error !== null &&
"statusCode" in error &&
error.statusCode === 400
);
};