45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
"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<keyof typeof messages>)
|
|
.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");
|
|
}
|