49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { requirePermissionRateLimited } from "@/lib/admin/guard";
|
|
import { PERMS } from "@/lib/permissions";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { logStaffActivity } from "@/lib/services/staff-activity";
|
|
|
|
/** Disband a guild and clean related membership/forum rows. */
|
|
export async function disbandGuild(formData: FormData): Promise<void> {
|
|
const staff = await requirePermissionRateLimited(PERMS.USERS_EDIT);
|
|
const id = Number(formData.get("id"));
|
|
if (!(id > 0)) return;
|
|
|
|
const guild = await prisma.guilds.findUnique({
|
|
where: { id },
|
|
select: { id: true, name: true, userId: true },
|
|
});
|
|
if (!guild) return;
|
|
|
|
await prisma.$transaction(async (tx) => {
|
|
const threads = await tx.guildsForumsThreads.findMany({
|
|
where: { guildId: id },
|
|
select: { id: true },
|
|
});
|
|
const threadIds = threads.map((t) => t.id);
|
|
if (threadIds.length > 0) {
|
|
await tx.guildsForumsComments.deleteMany({
|
|
where: { threadId: { in: threadIds } },
|
|
});
|
|
await tx.guildsForumsThreads.deleteMany({ where: { guildId: id } });
|
|
}
|
|
await tx.guildForumViews.deleteMany({ where: { guildId: id } });
|
|
await tx.guildsMembers.deleteMany({ where: { guildId: id } });
|
|
await tx.rooms.updateMany({ where: { guildId: id }, data: { guildId: 0 } });
|
|
await tx.items.updateMany({ where: { guildId: id }, data: { guildId: 0 } });
|
|
await tx.guilds.delete({ where: { id } });
|
|
});
|
|
|
|
await logStaffActivity({
|
|
staffId: staff.id,
|
|
action: "guild_disband",
|
|
description: `Disbanded guild #${id} (${guild.name}), owner #${guild.userId}`,
|
|
targetType: "guild",
|
|
targetId: id,
|
|
});
|
|
revalidatePath("/admin/guilds");
|
|
}
|