diff --git a/src/routes/api/games/+server.ts b/src/routes/api/games/+server.ts index d8a1edf..fcaee5e 100644 --- a/src/routes/api/games/+server.ts +++ b/src/routes/api/games/+server.ts @@ -17,7 +17,7 @@ export const POST: RequestHandler = async ({ locals }): Promise => { const { username, sub } = user.payload; const game = new Game(); - game.addPlayer(sub, username); + game.addPlayer({ id: sub, username, isReady: false }); const newListing = createNewListing(game); diff --git a/src/routes/api/games/[gameid]/+server.ts b/src/routes/api/games/[gameid]/+server.ts index d7f2611..9ec955c 100644 --- a/src/routes/api/games/[gameid]/+server.ts +++ b/src/routes/api/games/[gameid]/+server.ts @@ -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 => { return singleResponse(game); }; + +export const PUT: RequestHandler = async ({ request, params }): Promise => { + const id = getParam(params, ResourceId.Game); + + if (!id) { + return badRequestResponse("missing gameid parameter"); + } + + const gameListing = await readListingById( + ServerCollections.Games, + id, + isListing, + ); + + 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); +}; diff --git a/src/routes/api/games/[gameid]/players/[playerid]/+server.ts b/src/routes/api/games/[gameid]/players/[playerid]/+server.ts index 67a7b18..6866576 100644 --- a/src/routes/api/games/[gameid]/players/[playerid]/+server.ts +++ b/src/routes/api/games/[gameid]/players/[playerid]/+server.ts @@ -47,13 +47,6 @@ export const PUT: RequestHandler = async ({ params, request }): Promise isReady)) { - game.start(); - } - await writeUpdatedListing(ServerCollections.Games, updateListing(listing, game)); return singleResponse(game);