From af25b4ff20e94e65b45b84adebb37d82adcfa66f Mon Sep 17 00:00:00 2001 From: Nathaniel Tampus Date: Sat, 1 Apr 2023 23:15:54 +0800 Subject: [PATCH] update db models --- server/src/controllers/auth.controller.ts | 9 ++- server/src/db/index.ts | 4 +- server/src/db/models/game.model.ts | 77 +++++++++++++---------- server/src/db/models/user.model.ts | 26 ++++++-- 4 files changed, 74 insertions(+), 42 deletions(-) diff --git a/server/src/controllers/auth.controller.ts b/server/src/controllers/auth.controller.ts index 8233017..9292464 100644 --- a/server/src/controllers/auth.controller.ts +++ b/server/src/controllers/auth.controller.ts @@ -107,7 +107,7 @@ export const registerUser = async (req: Request, res: Response) => { return; } - const duplicateUsers = await UserModel.find({ name, email }); + const duplicateUsers = await UserModel.findByNameEmail({ name, email }); if (duplicateUsers && duplicateUsers.length) { const dupl = duplicateUsers[0].name === name ? "Username" : "Email"; res.status(409).json({ message: `${dupl} is already in use.` }); @@ -165,7 +165,10 @@ export const loginUser = async (req: Request, res: Response) => { const nameOrEmail = xss(req.body.name); const password = req.body.password; - const users = await UserModel.find({ name: nameOrEmail, email: nameOrEmail }); + const users = await UserModel.findByNameEmail( + { name: nameOrEmail, email: nameOrEmail }, + true + ); if (!users || !users.length) { res.status(404).json({ message: "Invalid username/email." }); return; @@ -238,7 +241,7 @@ export const updateUser = async (req: Request, res: Response) => { const email = xss(req.body.email || req.session.user.email); - const duplicateUsers = await UserModel.find({ name, email }); + const duplicateUsers = await UserModel.findByNameEmail({ name, email }); if ( duplicateUsers && duplicateUsers.length && diff --git a/server/src/db/index.ts b/server/src/db/index.ts index e814d0e..e3394e7 100644 --- a/server/src/db/index.ts +++ b/server/src/db/index.ts @@ -17,8 +17,8 @@ export const INIT_TABLES = /* sql */ ` end_reason VARCHAR(16), pgn TEXT, white_id INT REFERENCES "user", - white_guest_name VARCHAR(32), + white_name VARCHAR(32), black_id INT REFERENCES "user", - black_guest_name VARCHAR(32) + black_name VARCHAR(32) ); `; diff --git a/server/src/db/models/game.model.ts b/server/src/db/models/game.model.ts index e3d516d..3e2f4c2 100644 --- a/server/src/db/models/game.model.ts +++ b/server/src/db/models/game.model.ts @@ -8,9 +8,8 @@ export const activeGames: Array = []; export const create = async (game: Game) => { try { const res = await db.query( - `INSERT INTO "game"(code, winner, end_reason, pgn, white_id, white_guest_name, black_id, black_guest_name) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *`, + `INSERT INTO "game"(winner, end_reason, pgn, white_id, white_name, black_id, black_name) VALUES($1, $2, $3, $4, $5, $6, $7) RETURNING *`, [ - game.code || null, game.winner || null, game.endReason || null, game.pgn, @@ -22,18 +21,11 @@ export const create = async (game: Game) => { ); return { id: res.rows[0].id, - code: res.rows[0].code, - winner: - res.rows[0].winner_id === res.rows[0].white_id - ? "white" - : res.rows[0].winner_id === res.rows[0].black_id - ? "black" - : "draw", - reason: res.rows[0].reason, + winner: res.rows[0].winner, + endReason: res.rows[0].reason, pgn: res.rows[0].pgn, - host: { id: res.rows[0].host_id }, - white: { id: res.rows[0].white_id, name: res.rows[0].white_guest_name }, - black: { id: res.rows[0].black_id, name: res.rows[0].black_guest_name } + 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; } catch (err: unknown) { console.log(err); @@ -41,23 +33,40 @@ export const create = async (game: Game) => { } }; -export const find = async (where?: string, limit = 1) => { - const query = where - ? `SELECT * FROM "game"` - : { - text: `SELECT * FROM "game" WHERE $1 LIMIT $2`, - values: [where, limit] - }; - +export const findById = async (id: number) => { try { - const res = await db.query(query); + 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; + } catch (err: unknown) { + console.log(err); + return null; + } +}; + +export const findByUserId = async (id: number, limit = 10) => { + if (id == 0) { + return null; + } + try { + const res = await db.query( + `SELECT * FROM "game" WHERE white_id=$1 OR black_id=$1 LIMIT $2`, + [id, limit] + ); return res.rows.map((r) => { return { id: r.id, + winner: r.winner, + endReason: r.end_reason, pgn: r.pgn, - white: { id: r.white_id }, - black: { id: r.black_id }, - winner: r.winner + white: { id: r.white_id, name: r.white_name }, + black: { id: r.black_id, name: r.black_name } } as Game; }); } catch (err: unknown) { @@ -66,15 +75,17 @@ export const find = async (where?: string, limit = 1) => { } }; +// TODO: update fields specifically, "data" string doesnt work export const update = async (id: number, data: string) => { try { const res = await db.query(`UPDATE "game" SET $1 WHERE id = $2 RETURNING *`, [data, 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 }, - black: { id: res.rows[0].black_id }, - winner: res.rows[0].winner + 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; } catch (err: unknown) { console.log(err); @@ -87,10 +98,11 @@ export const remove = async (id: number) => { const res = await db.query(`DELETE FROM "game" WHERE id = $1 RETURNING *`, [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 }, - black: { id: res.rows[0].black_id }, - winner: res.rows[0].winner + 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; } catch (err: unknown) { console.log(err); @@ -100,7 +112,8 @@ export const remove = async (id: number) => { const GameModel = { create, - find, + findById, + findByUserId, update, remove }; diff --git a/server/src/db/models/user.model.ts b/server/src/db/models/user.model.ts index ab85c61..f523127 100644 --- a/server/src/db/models/user.model.ts +++ b/server/src/db/models/user.model.ts @@ -18,7 +18,20 @@ export const create = async (user: User, password: string) => { } }; -export const find = async (user: User, limit?: number) => { +export const findById = async (id: number) => { + if (id === 0) { + return null; + } + try { + const res = await db.query(`SELECT id, name, email FROM "user" WHERE id=$1`, [id]); + return res.rows as Array; + } catch (err: unknown) { + console.log(err); + return null; + } +}; + +export const findByNameEmail = async (user: User, includePassword = false, limit?: number) => { // if user is not specified, get all users if (!user) { try { @@ -34,7 +47,9 @@ export const find = async (user: User, limit?: number) => { try { const res = await db.query( - `SELECT id, name, email, password FROM "user" WHERE name=$1 OR email=$2 LIMIT $3`, + `SELECT id, name, email${ + includePassword ? `, password` : "" + } FROM "user" WHERE name=$1 OR email=$2 LIMIT $3`, [user.name, user.email, limit ?? 1] ); return res.rows as Array; @@ -45,7 +60,7 @@ export const find = async (user: User, limit?: number) => { }; export const update = async (id: number, updatedUser: User & { password?: string }) => { - if (typeof id === "string" || id === 0) { + if (id === 0) { return null; } @@ -66,7 +81,7 @@ export const update = async (id: number, updatedUser: User & { password?: string }; export const remove = async (id: number) => { - if (typeof id === "string" || id === 0) { + if (id === 0) { return null; } @@ -83,7 +98,8 @@ export const remove = async (id: number) => { const UserModel = { create, - find, + findById, + findByNameEmail, update, remove };