feat(api): assemble full GameSession with shuffled answer options
Extend the game flow from raw term rows to a complete GameSession matching the shared schema: - Add getDistractors model query: fetches N same-POS, same-difficulty, same-target-language terms excluding a given termId. Returns bare strings since distractors only need their display text. - Fix getGameTerms select clause to use the neutral field names (sourceText, targetText, sourceGloss) that the type already declared. - Rename gameService entry point to createGameSession; signature now takes a GameRequest and returns a GameSession. - Per question: fetch 3 distractors, combine with the correct answer, shuffle (Fisher-Yates), assign optionIds 0-3 by post-shuffle index, and assemble into a GameQuestion with a fresh UUID. - Wrap the questions in a GameSession with its own UUID. - Run per-question distractor fetches in parallel via Promise.all. Known gap: the correct option is not yet remembered server-side, so /game/answer cannot evaluate submissions. SessionStore lands next.
This commit is contained in:
parent
0cf6a852b2
commit
f53ac618bb
4 changed files with 95 additions and 20 deletions
|
|
@ -1,6 +1,6 @@
|
|||
import type { Request, Response } from "express";
|
||||
import { GameRequestSchema } from "@glossa/shared";
|
||||
import { prepareGameQuestions } from "../services/gameService.js";
|
||||
import { createGameSession } from "../services/gameService.js";
|
||||
|
||||
export const createGame = async (req: Request, res: Response) => {
|
||||
const gameSettings = GameRequestSchema.safeParse(req.body);
|
||||
|
|
@ -11,7 +11,7 @@ export const createGame = async (req: Request, res: Response) => {
|
|||
return;
|
||||
}
|
||||
|
||||
const gameQuestions = await prepareGameQuestions(gameSettings.data);
|
||||
const gameQuestions = await createGameSession(gameSettings.data);
|
||||
|
||||
res.json({ success: true, data: gameQuestions });
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue