'use server' import { revalidatePath } from 'next/cache' import { z } from 'zod' import { db } from '@/lib/db' import { requireUser } from '@/lib/auth/current' import { de } from '@/lib/i18n/de' export type ActionResult = { ok: true } | { ok: false; error: string } const saveSchema = z.object({ name: z.string().min(1).max(60), query: z.string().max(500), }) /** Eine gespeicherte Ansicht ist ein Lesezeichen auf eine Suchadresse. */ export async function saveViewAction(input: unknown): Promise { const user = await requireUser() const parsed = saveSchema.safeParse(input) if (!parsed.success) return { ok: false, error: de.actionErrors.default! } const anzahl = await db.savedView.count({ where: { userId: user.id } }) if (anzahl >= 30) return { ok: false, error: de.actionErrors['too-many-views']! } await db.savedView.create({ data: { userId: user.id, name: parsed.data.name.trim(), query: parsed.data.query, sortOrder: anzahl, }, }) revalidatePath('/suche') return { ok: true } } const idSchema = z.object({ id: z.string().min(1) }) export async function deleteViewAction(input: unknown): Promise { const user = await requireUser() const parsed = idSchema.safeParse(input) if (!parsed.success) return { ok: false, error: de.actionErrors.default! } // Nur die eigenen: die Kennung allein reicht nicht als Berechtigung. await db.savedView.deleteMany({ where: { id: parsed.data.id, userId: user.id } }) revalidatePath('/suche') return { ok: true } }