diff --git a/server/src/controllers/games.controller.ts b/server/src/controllers/games.controller.ts index ed41a83..22438c2 100644 --- a/server/src/controllers/games.controller.ts +++ b/server/src/controllers/games.controller.ts @@ -1,11 +1,35 @@ import type { Request, Response } from "express"; -import { activeGames } from "../db/models/game.model.js"; +import GameModel, { activeGames } from "../db/models/game.model.js"; import type { Game, User } from "@chessu/types"; import { nanoid } from "nanoid"; -export const getActivePublicGames = async (req: Request, res: Response) => { +export const getGames = async (req: Request, res: Response) => { try { - res.status(200).json(activeGames.filter((g) => !g.unlisted && !g.winner)); + if (!req.query.id && !req.query.userid) { + // get all active games + res.status(200).json(activeGames.filter((g) => !g.unlisted && !g.winner)); + return; + } + + if (req.query.id) { + // get finished game by id + const game = await GameModel.findById(parseInt(req.query.id as string)); + if (!game) { + res.status(404).end(); + } else { + res.status(200).json(game); + } + } else if (req.query.userid) { + // get finished games by user id + const games = await GameModel.findByUserId(parseInt(req.query.userid as string)); + if (!games) { + res.status(404).end(); + } else { + res.status(200).json(games); + } + } else { + res.status(400).end(); + } } catch (err: unknown) { console.log(err); res.status(500).end(); diff --git a/server/src/db/models/game.model.ts b/server/src/db/models/game.model.ts index 3e2f4c2..d233cf8 100644 --- a/server/src/db/models/game.model.ts +++ b/server/src/db/models/game.model.ts @@ -36,14 +36,16 @@ export const create = async (game: Game) => { export const findById = async (id: number) => { try { const res = await db.query(`SELECT * FROM "game" WHERE id=$1`, [id]); - return { - id: res.rows[0].id, - winner: res.rows[0].winner, - endReason: res.rows[0].end_reason, - pgn: res.rows[0].pgn, - white: { id: res.rows[0].white_id, name: res.rows[0].white_name }, - black: { id: res.rows[0].black_id, name: res.rows[0].black_name } - } as Game; + if (res.rowCount) { + return { + id: res.rows[0].id, + winner: res.rows[0].winner, + endReason: res.rows[0].end_reason, + pgn: res.rows[0].pgn, + white: { id: res.rows[0].white_id, name: res.rows[0].white_name }, + black: { id: res.rows[0].black_id, name: res.rows[0].black_name } + } as Game; + } else return null; } catch (err: unknown) { console.log(err); return null; diff --git a/server/src/routes/games.route.ts b/server/src/routes/games.route.ts index 699a6d2..a64a789 100644 --- a/server/src/routes/games.route.ts +++ b/server/src/routes/games.route.ts @@ -3,7 +3,7 @@ import * as controller from "../controllers/games.controller.js"; const router = Router(); -router.route("/").get(controller.getActivePublicGames).post(controller.createGame); +router.route("/").get(controller.getGames).post(controller.createGame); router.route("/:code").get(controller.getActiveGame);