// server/api/images/plaza.get.ts - 广场列表接口:分页返回所有用户已公开且已归档成功的生图作品。 import type { IPlazaPostListData } from "#shared/types/openai"; import { createApiLogger, createSuccessResponse, createUpstreamErrorResponse, listPlazaPosts, toSafeLogError } from "~~/server/utils"; const DEFAULT_PAGE = 1; const DEFAULT_PAGE_SIZE = 20; const MAX_PAGE_SIZE = 50; /** * GET /api/images/plaza * * 流程: * 1. 读取 page/size 查询参数,并限制最大 pageSize。 * 2. 只返回公开、生成成功、未删除、且已有图床归档地址的记录。 * 3. 返回广场展示字段,不返回上游响应、图床响应或内部错误详情。 */ export default defineEventHandler(async (event) => { const logger = createApiLogger("images.plaza.list"); logger.info("开始"); try { 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("查询参数", { page, pageSize }); const result = await listPlazaPosts({ page, pageSize }); logger.done("成功", { page, pageSize, total: result.total, itemCount: result.items.length }); return createSuccessResponse( result, "获取广场图片成功" ); } catch (error) { 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; };