"use server"; import { randomUUID } from "node:crypto"; import { appSettings, events } from "@minecraft-account-manager/database"; import { getClientIp } from "@minecraft-account-manager/network"; import { eq } from "drizzle-orm"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; import { parseAdmissionMessages } from "@/lib/admission-settings"; import { requireAdminSession } from "@/lib/auth/require-admin"; import { db } from "@/lib/database"; export async function saveAdmissionSettings(formData: FormData) { const admin = await requireAdminSession(); const messages = parseAdmissionMessages(formData); if (!messages) redirect("/admin/settings?error=invalid-message"); const requestHeaders = await headers(); const ipAddress = getClientIp(requestHeaders, process.env.TRUST_PROXY === "true"); await db.transaction(async (tx) => { const [previous] = await tx.select().from(appSettings).where(eq(appSettings.id, "default")).limit(1); const changedFields = (Object.keys(messages) as Array) .filter((field) => previous?.[field] !== messages[field]); await tx.insert(appSettings) .values({ id: "default", ...messages }) .onConflictDoUpdate({ target: appSettings.id, set: { ...messages, updatedAt: new Date() }, }); if (changedFields.length) { await tx.insert(events).values({ id: randomUUID(), source: "/web/admin", type: "games.minecraft.account-manager.settings.admission-messages-updated", subject: "settings/default", time: new Date(), data: { changedFields, adminEmail: admin.email, adminName: admin.name }, ipAddress: ipAddress ?? null, }); } }); redirect("/admin/settings?saved=1"); }