add update game endpoint

This commit is contained in:
2025-06-01 12:47:13 -07:00
parent 62f0636d2d
commit 66ff3eaaea
3 changed files with 48 additions and 11 deletions

View File

@ -17,7 +17,7 @@ export const POST: RequestHandler = async ({ locals }): Promise<Response> => {
const { username, sub } = user.payload;
const game = new Game();
game.addPlayer(sub, username);
game.addPlayer({ id: sub, username, isReady: false });
const newListing = createNewListing(game);

View File

@ -1,9 +1,16 @@
import type { GameData } from "$lib/GameData";
import { isGameData, type GameData } from "$lib/GameData";
import { isListing } from "$lib/Listing";
import { readListingById, ServerCollections } from "$lib/server/mongo";
import { getParam, ResourceId } from "$lib/server/requestTools";
import { Game } from "$lib/server/Game";
import { updateListing } from "$lib/server/modifyListing";
import {
readListingById,
ServerCollections,
writeUpdatedListing,
} from "$lib/server/mongo";
import { getBody, getParam, ResourceId } from "$lib/server/requestTools";
import {
badRequestResponse,
conflictResponse,
notFoundResponse,
singleResponse,
} from "$lib/server/responseBodies";
@ -24,3 +31,40 @@ export const GET: RequestHandler = async ({ params }): Promise<Response> => {
return singleResponse(game);
};
export const PUT: RequestHandler = async ({ request, params }): Promise<Response> => {
const id = getParam(params, ResourceId.Game);
if (!id) {
return badRequestResponse("missing gameid parameter");
}
const gameListing = await readListingById(
ServerCollections.Games,
id,
isListing<GameData>,
);
if (!gameListing) {
return notFoundResponse();
}
const game = Game.from(gameListing.data);
const body = await getBody(request, isGameData);
if (!body) {
return badRequestResponse("missing game data in body");
}
if (!game.isStarted) {
if (body.isStarted) {
game.start();
}
} else if (game.isStarted !== body.isStarted) {
return conflictResponse();
}
await writeUpdatedListing(ServerCollections.Games, updateListing(gameListing, game));
return singleResponse(gameListing);
};

View File

@ -47,13 +47,6 @@ export const PUT: RequestHandler = async ({ params, request }): Promise<Response
const game = Game.from(listing.data);
if (game.setPlayerReady(player) === null) return notFoundResponse();
// TODO: there's a potential race condition here where some player is unreadying as this
// function is running. This should do some kind of check in MongoDB to make sure
// all players are ready if it's starting the game. For now: good enough.
if (game.players.every(({ isReady }) => isReady)) {
game.start();
}
await writeUpdatedListing(ServerCollections.Games, updateListing(listing, game));
return singleResponse(game);