From 0e5eb84097fb6fa9f3fa06584f6f7d6dfd23d2cd Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 4 Apr 2026 22:34:26 +0500 Subject: [PATCH] feat: add SvelteKit proxy route for admin dedup-chapters endpoint --- .../admin/dedup-chapters/[slug]/+server.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ui/src/routes/api/admin/dedup-chapters/[slug]/+server.ts diff --git a/ui/src/routes/api/admin/dedup-chapters/[slug]/+server.ts b/ui/src/routes/api/admin/dedup-chapters/[slug]/+server.ts new file mode 100644 index 0000000..96bfe5e --- /dev/null +++ b/ui/src/routes/api/admin/dedup-chapters/[slug]/+server.ts @@ -0,0 +1,33 @@ +/** + * POST /api/admin/dedup-chapters/[slug] + * + * Admin-only proxy to the Go backend's dedup endpoint. + * Removes duplicate chapters_idx records for a book, keeping the latest + * record per chapter number. Returns { slug, deleted }. + */ + +import { json, error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { log } from '$lib/server/logger'; +import { backendFetch } from '$lib/server/scraper'; + +export const POST: RequestHandler = async ({ params, locals }) => { + if (!locals.user || locals.user.role !== 'admin') { + throw error(403, 'Forbidden'); + } + + const { slug } = params; + + let res: Response; + try { + res = await backendFetch(`/api/admin/dedup-chapters/${encodeURIComponent(slug)}`, { + method: 'POST' + }); + } catch (e) { + log.error('admin/dedup-chapters', 'backend proxy error', { slug, err: String(e) }); + throw error(502, 'Could not reach backend'); + } + + const data = await res.json().catch(() => ({})); + return json(data, { status: res.status }); +};