55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
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,
|
|
});
|
|
}
|