"use server"; import { publicActionError } from "@/lib/action-error"; import { revalidatePath } from "next/cache"; import { respondToAlarm } from "@/lib/alarms/service"; import { deliverAlarmEmails } from "@/lib/alarms/email"; import { limitPublicAction } from "@/lib/rate-limit"; import { hashToken, isPublicToken } from "@/lib/tokens"; export async function respondAlertAction(token: string, approve: boolean) { if (!isPublicToken(token) || typeof approve !== "boolean") return { error: "Ungültiger Rückmeldelink." }; if (!(await limitPublicAction("alarm-response", hashToken(token), 12, 60))) return { error: "Bitte kurz warten und erneut versuchen." }; try { const result = await respondToAlarm(token, approve); // The household response is already committed; transport failure must not undo it. try { await deliverAlarmEmails(result.emailIds); } catch { /* Persistent jobs will retry. */ } revalidatePath("/alert/[token]", "page"); revalidatePath("/dashboard"); revalidatePath("/dashboard/notdienst/alarm"); return { success: true }; } catch (error) { const message = publicActionError(error, ""); if (message) return { error: message }; return { error: "Die Rückmeldung konnte nicht gespeichert werden. Bitte den aktuellen Stand prüfen.", }; } } export async function confirmAlertAction(token: string) { return respondAlertAction(token, true); }