@@ -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
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user