"use server"; import { revalidatePath } from "next/cache"; import type { Prisma } from "@/generated/prisma/client"; import { requirePermission } from "@/lib/admin/guard"; import { PERMS } from "@/lib/permissions"; import { prisma } from "@/lib/prisma"; import { rcon } from "@/lib/services/rcon"; import { logStaffActivity } from "@/lib/services/staff-activity"; export async function updateRoomItem(payload: Record) { const staff = await requirePermission(PERMS.ROOMS_EDIT); const { roomId, itemId, ...data } = payload as { roomId: number; itemId: number; [key: string]: unknown; }; await prisma.items.update({ where: { id: itemId }, data: data as Prisma.ItemsUpdateInput, }); await logStaffActivity({ staffId: staff.id, action: "room_item_update", description: `Updated item #${itemId} in room #${roomId}`, targetType: "room_item", targetId: itemId, }); revalidatePath(`/admin/rooms/${roomId}/furni`); } export async function bulkDeleteRoomItems({ roomId, itemIds, }: { roomId: number; itemIds: number[]; }) { const staff = await requirePermission(PERMS.ROOMS_EDIT); await prisma.items.deleteMany({ where: { id: { in: itemIds }, roomId } }); await logStaffActivity({ staffId: staff.id, action: "room_items_bulk_delete", description: `Deleted ${itemIds.length} item(s) from room #${roomId}`, targetType: "room_item", }); revalidatePath(`/admin/rooms/${roomId}/furni`); } export async function deleteRoomItem({ roomId, itemId, }: { roomId: number; itemId: number; }) { const staff = await requirePermission(PERMS.ROOMS_EDIT); await prisma.items.delete({ where: { id: itemId } }); await logStaffActivity({ staffId: staff.id, action: "room_item_delete", description: `Deleted item #${itemId} from room #${roomId}`, targetType: "room_item", targetId: itemId, }); revalidatePath(`/admin/rooms/${roomId}/furni`); } export async function roomRconAction({ roomId, action, }: { roomId: number; action: string; }) { await requirePermission(PERMS.ROOMS_EDIT); if (action === "reload") { await rcon.send("reloadroom", { room_id: roomId }); } else if (action === "kick") { await rcon.send("kickall", { room_id: roomId }); } else if (action === "lock") { await rcon.send("updateroom", { room_id: roomId, state: "locked" }); } else if (action === "unlock") { await rcon.send("updateroom", { room_id: roomId, state: "open" }); } } export async function deleteRoom({ id }: { id: number }) { const staff = await requirePermission(PERMS.ROOMS_DELETE); await prisma.rooms.delete({ where: { id } }); await logStaffActivity({ staffId: staff.id, action: "room_delete", description: `Deleted room #${id}`, targetType: "room", targetId: id, }); revalidatePath("/admin/rooms"); } export async function updateRoom({ id, ...data }: { id: number; name?: string; description?: string; state?: string; usersMax?: number; }) { const staff = await requirePermission(PERMS.ROOMS_EDIT); await prisma.rooms.update({ where: { id }, data: data as Prisma.RoomsUpdateInput, }); await logStaffActivity({ staffId: staff.id, action: "room_update", description: `Updated room #${id}`, targetType: "room", targetId: id, }); revalidatePath(`/admin/rooms/${id}`); }