"use server"; import { redirect } from "next/navigation"; import { createSession, getCurrentUser, requireExpert } from "../../lib/auth"; import { getDb } from "../../lib/db"; import { magBeoordelen } from "../../lib/experts"; import { BONUS_MALUS_OPTIONS } from "../../lib/rikxCalculatie"; function readScore(formData: FormData, key: string): number | null | "ongeldig" { const raw = ((formData.get(key) as string) ?? "").trim(); if (!raw) return null; const n = Number(raw.replace(",", ".")); return Number.isFinite(n) && n >= 1 && n <= 10 ? n : "ongeldig"; } export async function saveBeoordeling(formData: FormData) { const expert = await requireExpert(); const projectId = Number(formData.get("project_id")); // Een admin die meekijkt mag niet namens de expert beoordelen if (expert.impersonator) redirect(`/expert?project=${projectId}&error=meekijken`); if (!projectId || !magBeoordelen(expert.id, projectId)) redirect("/expert"); const duur = readScore(formData, "duur_impact"); const domeinen = readScore(formData, "levensdomeinen"); const basis = readScore(formData, "basissituatie"); if (duur === "ongeldig" || domeinen === "ongeldig" || basis === "ongeldig") { redirect(`/expert?project=${projectId}&error=score`); } const rawAdvies = (formData.get("bonus_malus_advies") as string) ?? ""; const advies = rawAdvies && BONUS_MALUS_OPTIONS.some((o) => o.id === rawAdvies) ? rawAdvies : null; const toelichting = ((formData.get("toelichting") as string) ?? "").trim().slice(0, 10_000) || null; getDb() .prepare( `INSERT INTO expert_beoordelingen (project_id, expert_id, duur_impact, levensdomeinen, basissituatie, bonus_malus_advies, toelichting) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT (project_id, expert_id) DO UPDATE SET duur_impact = excluded.duur_impact, levensdomeinen = excluded.levensdomeinen, basissituatie = excluded.basissituatie, bonus_malus_advies = excluded.bonus_malus_advies, toelichting = excluded.toelichting, updated_at = datetime('now')` ) .run(projectId, expert.id, duur, domeinen, basis, advies, toelichting); redirect(`/expert?project=${projectId}&opgeslagen=1`); } // Einde van "Inloggen als": terug naar de eigen admin-sessie export async function stopImpersonation() { const user = await getCurrentUser(); if (!user?.impersonator) redirect("/login"); await createSession({ userId: user.impersonator.id, email: user.impersonator.email, name: user.impersonator.name }); redirect("/experts"); }