Files
Epicnabbo-Catalogus-Updated…/src/actions/admin-radio-extra.ts
T

120 lines
3.5 KiB
TypeScript

"use server";
import { revalidatePath } from "next/cache";
import { executeLegacyHotelMutation } from "@/features/housekeeping/domains/hotel/services/mutations";
import { requirePermission } from "@/lib/admin/guard";
import { PERMS } from "@/lib/permissions";
import { siteSettings } from "@/lib/services/site-settings";
function text(formData: FormData, key: string): string {
return String(formData.get(key) ?? "")
.normalize("NFC")
.trim();
}
function enabled(formData: FormData, key: string): boolean {
return ["1", "true", "on"].includes(text(formData, key).toLowerCase());
}
async function actor() {
return requirePermission(PERMS.RADIO_EDIT);
}
export async function saveRadioSetting(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(staff, "radio.settings.save-one", {
key: text(formData, "key"),
value: String(formData.get("value") ?? ""),
comment: text(formData, "comment") || undefined,
});
siteSettings.reload();
revalidatePath("/admin/radio/settings");
}
export async function saveRadioSettings(formData: FormData): Promise<void> {
const staff = await actor();
const entries = text(formData, "__keys")
.split(",")
.map((key) => key.trim())
.filter(Boolean)
.map((key) => ({ key, value: String(formData.get(key) ?? "") }));
await executeLegacyHotelMutation(staff, "radio.settings.save-many", {
entries,
});
siteSettings.reload();
revalidatePath("/admin/radio/settings");
}
function bannerInput(formData: FormData) {
return {
imagePath: text(formData, "imagePath"),
title: text(formData, "title") || undefined,
description: text(formData, "description") || undefined,
sortOrder: Number(text(formData, "sortOrder") || 0),
isActive: enabled(formData, "isActive"),
};
}
export async function createRadioBanner(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(
staff,
"radio.banner.create",
bannerInput(formData),
);
revalidatePath("/admin/radio/banners");
}
export async function updateRadioBanner(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(staff, "radio.banner.update", {
id: text(formData, "id"),
...bannerInput(formData),
});
revalidatePath("/admin/radio/banners");
}
export async function deleteRadioBanner(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(staff, "radio.banner.delete", {
id: text(formData, "id"),
});
revalidatePath("/admin/radio/banners");
}
function rankInput(formData: FormData) {
return {
name: text(formData, "name"),
description: text(formData, "description") || undefined,
badgeCode: text(formData, "badgeCode") || undefined,
isActive: enabled(formData, "isActive"),
};
}
export async function createRadioRank(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(
staff,
"radio.rank.create",
rankInput(formData),
);
revalidatePath("/admin/radio/ranks");
}
export async function updateRadioRank(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(staff, "radio.rank.update", {
id: text(formData, "id"),
...rankInput(formData),
});
revalidatePath("/admin/radio/ranks");
}
export async function deleteRadioRank(formData: FormData): Promise<void> {
const staff = await actor();
await executeLegacyHotelMutation(staff, "radio.rank.delete", {
id: text(formData, "id"),
});
revalidatePath("/admin/radio/ranks");
}