import { NextResponse } from 'next/server'; import { assertChannelRoomAccess } from '@/lib/auth/room-access'; import { addDiceFromDonation, getRoom, notifyRoom, toPublicRoom, } from '@/lib/rooms/store'; export const runtime = 'nodejs'; type Params = { params: Promise<{ roomId: string }> }; export async function POST(request: Request, { params }: Params) { const { roomId } = await params; const room = getRoom(roomId); if (!room) { return NextResponse.json({ error: '방을 찾을 수 없습니다.' }, { status: 404 }); } const access = await assertChannelRoomAccess(room, request); if (!access.ok) return access.response; const body = (await request.json().catch(() => ({}))) as { payAmount?: number; donatorNickname?: string; }; const payAmount = Number(body.payAmount ?? 0); if (!Number.isFinite(payAmount) || payAmount <= 0) { return NextResponse.json({ error: 'payAmount가 필요합니다.' }, { status: 400 }); } if (!room.settings.chzzkEnabled) { return NextResponse.json( { error: '연동 없는 룸에서는 후원 시뮬레이션을 사용할 수 없습니다.' }, { status: 400 }, ); } const result = addDiceFromDonation(roomId, { payAmount, donatorNickname: body.donatorNickname || '테스트후원', donationText: 'simulate', simulated: true, }); if (!result) { return NextResponse.json({ error: '처리 실패' }, { status: 500 }); } notifyRoom(roomId); return NextResponse.json({ room: toPublicRoom(result.room), diceAdded: result.diceAdded, }); }