"use server"; import { eq } from "drizzle-orm"; import { revalidatePath } from "next/cache"; import { db } from "@/db"; import { brigades } from "@/db/schema"; import { requireWehrAdmin } from "@/lib/auth/guards"; import { brigadeProfileSchema } from "@/lib/validation/brigade"; import { geocodeAddress } from "@/lib/geo/nominatim"; import { writeAudit } from "@/lib/audit"; export type ProfileActionResult = | { ok: true; geocodeWarnung: boolean } | { ok: false; error: string }; /** * Aktualisiert das Profil der EIGENEN Wehr (Default-deny: Guard zuerst). * `brigadeId` kommt IMMER aus der Session. Geocoding inline via `geocodeAddress` * (lat/lng selbst geschrieben; kein zweiter Geo-Pfad). Audit * `brigade.profile_update`. Nicht geokodierbar => Speichern trotzdem, Warnung * an den Aufrufer (Querschnittsstandard 4/6). */ export async function updateBrigadeProfile( input: unknown, ): Promise { const s = await requireWehrAdmin(); const parsed = brigadeProfileSchema.safeParse(input); if (!parsed.success) { return { ok: false, error: parsed.error.issues[0]?.message ?? "Ungültige Eingabe.", }; } const d = parsed.data; const query = `${d.strasse}, ${d.plz} ${d.ort}, Österreich`; const geo = await geocodeAddress(query); const geocodeWarnung = geo.status !== "ok"; await db .update(brigades) .set({ strasse: d.strasse, plz: d.plz, ort: d.ort, telefon: d.telefon ?? null, email: d.email ?? null, wehrfuehrer: d.wehrfuehrer ?? null, funkrufnameSchema: d.funkrufnameSchema ?? null, geocodeQuery: query, geocodedAt: new Date(), ...(geo.status === "ok" ? { lat: geo.coords.lat, lng: geo.coords.lng, geocodeStatus: "ok" } : { geocodeStatus: geo.status }), }) .where(eq(brigades.id, s.user.brigadeId)); await writeAudit( s.user.id, "brigade.profile_update", "brigade", s.user.brigadeId, { geocodeWarnung }, ); revalidatePath("/verwaltung/profil"); return { ok: true, geocodeWarnung }; }