Reapply "Add missing admin action files and navigation links"

This reverts commit 4d515bc400.
This commit is contained in:
Simo committed 2026-07-11 20:52:56 +02:00
1 parent 96ed768f14
commit 5b4228261a
338 files changed
+28143 -5948

No files matched your search

+71
View File
@@ -0,0 +1,71 @@
"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 };
}