40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* GET /api/games/highscore?gameName=<snake|tetris|memory|tictactoe>
|
|
*
|
|
* Liefert den Personal-Best-Score des aktuellen Users für ein bestimmtes Spiel.
|
|
* Wird bei SOS-Spielstart gefetcht, damit Lyra dem User seinen PB nennen kann
|
|
* ("Dein bester Score ist X — ich glaub an dich").
|
|
*
|
|
* Response:
|
|
* { score: number, hasRecord: boolean, updatedAt: string | null }
|
|
*
|
|
* Wenn kein Eintrag existiert: score=0, hasRecord=false. Lyra-Hint behandelt
|
|
* dann den Erst-Spielen-Fall ("Probier's, lass uns deinen ersten Score setzen!").
|
|
*/
|
|
import { usePrisma } from "../../utils/prisma";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = await requireUser(event);
|
|
const query = getQuery(event);
|
|
const gameName = String(query.gameName ?? "").trim();
|
|
|
|
if (!gameName) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: "gameName query param required",
|
|
});
|
|
}
|
|
|
|
const db = usePrisma();
|
|
const hs = await db.gameHighScore.findUnique({
|
|
where: { userId_gameName: { userId: user.id, gameName } },
|
|
select: { score: true, updatedAt: true },
|
|
});
|
|
|
|
return {
|
|
score: hs?.score ?? 0,
|
|
hasRecord: !!hs,
|
|
updatedAt: hs?.updatedAt?.toISOString() ?? null,
|
|
};
|
|
});
|