import type { RequestHandler } from './$types'; import { json, error } from '@sveltejs/kit'; import { z } from 'zod'; import { getDb } from '$lib/server/db'; import { addDomain, listDomains, setDomainFavicon } from '$lib/server/domains/repository'; import { ensureFavicons, fetchAndStoreFavicon } from '$lib/server/domains/favicons'; const CreateSchema = z.object({ domain: z.string().min(3).max(253), display_name: z.string().max(100).nullable().optional(), added_by_profile_id: z.number().int().positive().nullable().optional() }); const IMAGE_DIR = process.env.IMAGE_DIR ?? './data/images'; export const GET: RequestHandler = async () => { const db = getDb(); // Favicons lazy nachziehen — beim zweiten Aufruf gibt es nichts mehr zu tun. await ensureFavicons(db, IMAGE_DIR); return json(listDomains(db)); }; export const POST: RequestHandler = async ({ request }) => { const body = await request.json().catch(() => null); const parsed = CreateSchema.safeParse(body); if (!parsed.success) error(400, { message: 'Invalid body' }); try { const db = getDb(); const d = addDomain( db, parsed.data.domain, parsed.data.display_name ?? null, parsed.data.added_by_profile_id ?? null ); // Favicon direkt nach dem Insert mitziehen, damit die Antwort schon das // Icon enthält — der POST ist eh ein interaktiver Admin-Vorgang. const favicon = await fetchAndStoreFavicon(d.domain, IMAGE_DIR); if (favicon) { setDomainFavicon(db, d.id, favicon); d.favicon_path = favicon; } return json(d, { status: 201 }); } catch (e) { error(409, { message: (e as Error).message }); } };