103 lines
3.7 KiB
TypeScript
103 lines
3.7 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { getRandomQuestion } from '@/lib/scibowl-api';
|
|
import { z, ZodError } from 'zod';
|
|
import { getRoom, buzz, startGame, loadQuestion, startTossupTimer, startBonusTimer, markTossupCorrect, markTossupWrong, markBonusCorrect, markBonusWrong, moveOn, endGame } from '@/lib/rooms';
|
|
|
|
const gameActionSchema = z.object({
|
|
action: z.enum(['start', 'load_question', 'start_timer', 'buzz', 'tossup_correct', 'tossup_wrong', 'bonus_start_timer', 'bonus_correct', 'bonus_wrong', 'move_on', 'end']),
|
|
moderatorId: z.string().optional(),
|
|
playerId: z.string().optional(),
|
|
});
|
|
|
|
export async function POST(
|
|
req: Request,
|
|
{ params }: { params: Promise<{ code: string }> }
|
|
) {
|
|
try {
|
|
const { code } = await params;
|
|
const body = await req.json();
|
|
const { action, moderatorId, playerId } = gameActionSchema.parse(body);
|
|
|
|
let success = false;
|
|
|
|
switch (action) {
|
|
case 'start':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = startGame(code, moderatorId);
|
|
break;
|
|
|
|
case 'load_question':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
const question = await getRandomQuestion();
|
|
success = loadQuestion(code, moderatorId, question);
|
|
break;
|
|
|
|
case 'start_timer':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = startTossupTimer(code, moderatorId);
|
|
break;
|
|
|
|
case 'buzz':
|
|
if (!playerId) return NextResponse.json({ error: 'Missing playerId' }, { status: 400 });
|
|
success = buzz(code, playerId);
|
|
break;
|
|
|
|
case 'tossup_correct':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = markTossupCorrect(code, moderatorId);
|
|
break;
|
|
|
|
case 'tossup_wrong':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = markTossupWrong(code, moderatorId);
|
|
break;
|
|
|
|
case 'bonus_start_timer':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = startBonusTimer(code, moderatorId);
|
|
break;
|
|
|
|
case 'bonus_correct':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = markBonusCorrect(code, moderatorId);
|
|
break;
|
|
|
|
case 'bonus_wrong':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = markBonusWrong(code, moderatorId);
|
|
break;
|
|
|
|
case 'move_on':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = moveOn(code, moderatorId);
|
|
break;
|
|
|
|
case 'end':
|
|
if (!moderatorId) return NextResponse.json({ error: 'Missing moderatorId' }, { status: 400 });
|
|
success = endGame(code, moderatorId);
|
|
break;
|
|
}
|
|
|
|
if (!success) {
|
|
return NextResponse.json({ error: 'Action failed' }, { status: 400 });
|
|
}
|
|
|
|
const room = getRoom(code);
|
|
return NextResponse.json({
|
|
success: true,
|
|
gameState: room?.gameState
|
|
});
|
|
|
|
} catch (error: unknown) {
|
|
console.error('Game action error:', error);
|
|
|
|
if (error instanceof ZodError) {
|
|
return NextResponse.json(
|
|
{ error: error.errors[0].message },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
return NextResponse.json({ error: 'Invalid request' }, { status: 400 });
|
|
}
|
|
} |