85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import { redirect } from 'next/navigation'
|
|
import { AdminBreadcrumb } from '@/components/admin/admin-breadcrumb'
|
|
import { canAccess, getAdminContext, PERMS } from '@/lib/permissions'
|
|
import { prisma } from '@/lib/prisma'
|
|
import { loadRoom } from '../../_lib/load-room'
|
|
import { FurniClient } from './furni-client'
|
|
|
|
export default async function RoomFurniPage({
|
|
params,
|
|
}: {
|
|
params: Promise<{ id: string; locale: string }>
|
|
}) {
|
|
const { id } = await params
|
|
const { session, permissions } = await getAdminContext()
|
|
if (!canAccess(permissions, PERMS.ROOMS_VIEW, session.user.rank)) redirect('/admin')
|
|
|
|
const room = await loadRoom(id)
|
|
|
|
// Load items in this room. items.item_id → items_base.id
|
|
const items = await prisma.item.findMany({
|
|
where: { roomId: room.id },
|
|
orderBy: { id: 'desc' },
|
|
})
|
|
|
|
// Resolve item bases
|
|
const baseIds = Array.from(new Set(items.map((i) => i.itemId)))
|
|
const bases = baseIds.length
|
|
? await prisma.itemsBase.findMany({
|
|
where: { id: { in: baseIds } },
|
|
select: { id: true, itemName: true, publicName: true, type: true },
|
|
})
|
|
: []
|
|
const baseMap = new Map(bases.map((b) => [b.id, b]))
|
|
|
|
// Resolve owner usernames
|
|
const userIds = Array.from(new Set(items.map((i) => i.userId).filter((u) => u > 0)))
|
|
const users = userIds.length
|
|
? await prisma.user.findMany({
|
|
where: { id: { in: userIds } },
|
|
select: { id: true, username: true },
|
|
})
|
|
: []
|
|
const userMap = new Map(users.map((u) => [u.id, u.username]))
|
|
|
|
const rows = items.map((i) => {
|
|
const base = baseMap.get(i.itemId)
|
|
return {
|
|
id: i.id,
|
|
baseId: i.itemId,
|
|
name: base?.publicName || base?.itemName || `#${i.itemId}`,
|
|
itemName: base?.itemName ?? '',
|
|
type: base?.type ?? '?',
|
|
x: i.x,
|
|
y: i.y,
|
|
z: i.z,
|
|
rot: i.rot,
|
|
wallPos: i.wallPos,
|
|
userId: i.userId,
|
|
ownerUsername: userMap.get(i.userId) ?? null,
|
|
extraData: i.extraData,
|
|
}
|
|
})
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<AdminBreadcrumb
|
|
items={[
|
|
{ label: 'Rooms', href: '/admin/rooms' },
|
|
{ label: room.name, href: `/admin/rooms/show/${room.id}` },
|
|
{ label: 'Furniture' },
|
|
]}
|
|
/>
|
|
<FurniClient
|
|
room={{
|
|
id: room.id,
|
|
name: room.name,
|
|
ownerUsername: room.owner?.username ?? room.owner_name,
|
|
}}
|
|
items={rows}
|
|
canEdit={session.user.rank >= 4}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|