From 10e97db78a25c83f1bda46abaae6ad45cff712f1 Mon Sep 17 00:00:00 2001 From: Thomas Hallock Date: Mon, 17 Nov 2025 10:24:00 -0600 Subject: [PATCH] feat: add single-page worksheet preview API endpoint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add new API route for fetching individual worksheet pages on-demand: - Route: POST /api/create/worksheets/preview/[pageNumber] - Uses existing generateSinglePage() function - Returns { page, totalPages } for the requested page - Validates page number parameter This endpoint enables on-demand page loading for large worksheets. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../worksheets/preview/[pageNumber]/route.ts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 apps/web/src/app/api/create/worksheets/preview/[pageNumber]/route.ts diff --git a/apps/web/src/app/api/create/worksheets/preview/[pageNumber]/route.ts b/apps/web/src/app/api/create/worksheets/preview/[pageNumber]/route.ts new file mode 100644 index 00000000..108c2ef7 --- /dev/null +++ b/apps/web/src/app/api/create/worksheets/preview/[pageNumber]/route.ts @@ -0,0 +1,52 @@ +// API route for generating a single worksheet page (SVG) + +import { type NextRequest, NextResponse } from 'next/server' +import { generateSinglePage } from '@/app/create/worksheets/generatePreview' +import type { WorksheetFormState } from '@/app/create/worksheets/types' + +export const dynamic = 'force-dynamic' + +export async function POST( + request: NextRequest, + { params }: { params: { pageNumber: string } } +) { + try { + const body: WorksheetFormState = await request.json() + const pageNumber = parseInt(params.pageNumber, 10) + + if (isNaN(pageNumber) || pageNumber < 0) { + return NextResponse.json({ error: 'Invalid page number' }, { status: 400 }) + } + + // Generate only the requested page + const result = generateSinglePage(body, pageNumber) + + if (!result.success) { + return NextResponse.json( + { + error: result.error, + details: result.details, + }, + { status: result.error?.includes('Invalid page number') ? 404 : 400 } + ) + } + + // Return the page and total count + return NextResponse.json({ + page: result.page, + totalPages: result.totalPages, + }) + } catch (error) { + console.error('Error generating page preview:', error) + + const errorMessage = error instanceof Error ? error.message : String(error) + + return NextResponse.json( + { + error: 'Failed to generate page preview', + message: errorMessage, + }, + { status: 500 } + ) + } +}