"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 }) { 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 }; }