- Add 11 missing server action files: badges, bulk-users, catalog, catalog-bc, catalog-items, import-badges, import-furni, multi-account-detect, permissions, rooms, soundtracks - Add missing admin navigation links: tickets, sounds, translations, import, radio sub-pages - Add translation keys for all new navigation items
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { requireStaff } from "@/lib/admin/guard";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { logStaffActivity } from "@/lib/services/staff-activity";
|
|
|
|
export async function saveRank({ id, fields }: { id: number; fields: Record<string, string> }) {
|
|
const staff = await requireStaff();
|
|
const setClauses = Object.entries(fields)
|
|
.map(([key]) => `\`${key}\` = ?`)
|
|
.join(", ");
|
|
const values = Object.values(fields);
|
|
await prisma.$executeRawUnsafe(
|
|
`UPDATE permissions SET ${setClauses} WHERE id = ?`,
|
|
...values,
|
|
id,
|
|
);
|
|
await logStaffActivity({
|
|
staffId: staff.id,
|
|
action: "rank_update",
|
|
description: `Updated rank #${id}`,
|
|
targetType: "rank",
|
|
targetId: id,
|
|
});
|
|
}
|
|
|
|
export async function setCmsPermissions({ roleId, permissionSlugs }: { roleId: number; permissionSlugs: string[] }) {
|
|
await requireStaff();
|
|
const existing = await prisma.websiteHousekeepingPermissions.findMany({
|
|
where: { minRank: roleId },
|
|
select: { permission: true },
|
|
});
|
|
const existingSlugs = new Set(existing.map((p) => p.permission));
|
|
const toAdd = permissionSlugs.filter((s) => !existingSlugs.has(s));
|
|
const toRemove = existing.filter((p) => !permissionSlugs.includes(p.permission));
|
|
|
|
for (const slug of toAdd) {
|
|
await prisma.websiteHousekeepingPermissions.create({
|
|
data: { permission: slug, minRank: roleId, description: null },
|
|
});
|
|
}
|
|
for (const p of toRemove) {
|
|
await prisma.websiteHousekeepingPermissions.deleteMany({
|
|
where: { permission: p.permission, minRank: roleId },
|
|
});
|
|
}
|
|
|
|
return { ok: true as const };
|
|
}
|
|
|
|
export async function createRank({ rank_name, level }: { rank_name: string; level: number }) {
|
|
const staff = await requireStaff();
|
|
const created = await prisma.websiteTeams.create({
|
|
data: {
|
|
rankName: rank_name,
|
|
hiddenRank: false,
|
|
badge: null,
|
|
jobDescription: null,
|
|
staffColor: "#ffffff",
|
|
staffBackground: "#000000",
|
|
},
|
|
});
|
|
return { ok: true as const, data: { id: Number(created.id) } };
|
|
}
|
|
|
|
export async function deleteRank({ id }: { id: number }) {
|
|
await requireStaff();
|
|
await prisma.websiteTeams.delete({ where: { id: BigInt(id) } });
|
|
return { ok: true as const };
|
|
}
|