Wrap /api/pdf handler in try/catch for JSON error contract
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+22
-21
@@ -35,28 +35,28 @@ async function resolveUserId(req: NextRequest): Promise<string | null> {
|
||||
}
|
||||
|
||||
export async function GET(req: NextRequest) {
|
||||
const userId = await resolveUserId(req);
|
||||
if (!userId) return jsonError(401, "Нужен API-ключ или вход в аккаунт школы");
|
||||
|
||||
if (!(await hasPaidAccess(userId))) {
|
||||
return jsonError(403, "Инструмент доступен студентам платных курсов школы");
|
||||
}
|
||||
|
||||
const parsed = querySchema.safeParse(Object.fromEntries(req.nextUrl.searchParams));
|
||||
if (!parsed.success) return jsonError(422, "Проверьте параметры: url, format (A4|Letter), theme (light|dark)");
|
||||
|
||||
if ((await getBurstUsage(userId)) >= BURST_LIMIT) {
|
||||
return jsonError(429, "Слишком часто: подождите минуту");
|
||||
}
|
||||
const limit = getMonthlyLimit();
|
||||
const used = await getMonthlyUsage(userId);
|
||||
if (used >= limit) {
|
||||
return jsonError(429, `Лимит ${limit} PDF в месяц исчерпан`, {
|
||||
"X-Uses-Count": String(used), "X-Max-Uses": String(limit),
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const userId = await resolveUserId(req);
|
||||
if (!userId) return jsonError(401, "Нужен API-ключ или вход в аккаунт школы");
|
||||
|
||||
if (!(await hasPaidAccess(userId))) {
|
||||
return jsonError(403, "Инструмент доступен студентам платных курсов школы");
|
||||
}
|
||||
|
||||
const parsed = querySchema.safeParse(Object.fromEntries(req.nextUrl.searchParams));
|
||||
if (!parsed.success) return jsonError(422, "Проверьте параметры: url, format (A4|Letter), theme (light|dark)");
|
||||
|
||||
if ((await getBurstUsage(userId)) >= BURST_LIMIT) {
|
||||
return jsonError(429, "Слишком часто: подождите минуту", { "X-Max-Uses": String(getMonthlyLimit()) });
|
||||
}
|
||||
const limit = getMonthlyLimit();
|
||||
const used = await getMonthlyUsage(userId);
|
||||
if (used >= limit) {
|
||||
return jsonError(429, `Лимит ${limit} PDF в месяц исчерпан`, {
|
||||
"X-Uses-Count": String(used), "X-Max-Uses": String(limit),
|
||||
});
|
||||
}
|
||||
|
||||
const { pdf, title } = await generateCleanPdf(parsed.data);
|
||||
await prisma.toolUsage.create({ data: { userId, tool: PDF_TOOL_ID } });
|
||||
|
||||
@@ -75,6 +75,7 @@ export async function GET(req: NextRequest) {
|
||||
return jsonError(422, e.message);
|
||||
}
|
||||
if (e instanceof RenderError) {
|
||||
console.error("[clean-pdf] render", e);
|
||||
return jsonError(504, "Не получилось отрендерить страницу, попробуйте позже");
|
||||
}
|
||||
console.error("[clean-pdf]", e);
|
||||
|
||||
Reference in New Issue
Block a user