update db models

This commit is contained in:
Nathaniel Tampus
2023-04-01 23:15:54 +08:00
parent 97b750fec4
commit af25b4ff20
4 changed files with 74 additions and 42 deletions

View File

@@ -107,7 +107,7 @@ export const registerUser = async (req: Request, res: Response) => {
return; return;
} }
const duplicateUsers = await UserModel.find({ name, email }); const duplicateUsers = await UserModel.findByNameEmail({ name, email });
if (duplicateUsers && duplicateUsers.length) { if (duplicateUsers && duplicateUsers.length) {
const dupl = duplicateUsers[0].name === name ? "Username" : "Email"; const dupl = duplicateUsers[0].name === name ? "Username" : "Email";
res.status(409).json({ message: `${dupl} is already in use.` }); 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 nameOrEmail = xss(req.body.name);
const password = req.body.password; 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) { if (!users || !users.length) {
res.status(404).json({ message: "Invalid username/email." }); res.status(404).json({ message: "Invalid username/email." });
return; return;
@@ -238,7 +241,7 @@ export const updateUser = async (req: Request, res: Response) => {
const email = xss(req.body.email || req.session.user.email); 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 ( if (
duplicateUsers && duplicateUsers &&
duplicateUsers.length && duplicateUsers.length &&

View File

@@ -17,8 +17,8 @@ export const INIT_TABLES = /* sql */ `
end_reason VARCHAR(16), end_reason VARCHAR(16),
pgn TEXT, pgn TEXT,
white_id INT REFERENCES "user", white_id INT REFERENCES "user",
white_guest_name VARCHAR(32), white_name VARCHAR(32),
black_id INT REFERENCES "user", black_id INT REFERENCES "user",
black_guest_name VARCHAR(32) black_name VARCHAR(32)
); );
`; `;

View File

@@ -8,9 +8,8 @@ export const activeGames: Array<Game> = [];
export const create = async (game: Game) => { export const create = async (game: Game) => {
try { try {
const res = await db.query( 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.winner || null,
game.endReason || null, game.endReason || null,
game.pgn, game.pgn,
@@ -22,18 +21,11 @@ export const create = async (game: Game) => {
); );
return { return {
id: res.rows[0].id, id: res.rows[0].id,
code: res.rows[0].code, winner: res.rows[0].winner,
winner: endReason: res.rows[0].reason,
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,
pgn: res.rows[0].pgn, pgn: res.rows[0].pgn,
host: { id: res.rows[0].host_id }, white: { id: res.rows[0].white_id, name: res.rows[0].white_name },
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_name }
black: { id: res.rows[0].black_id, name: res.rows[0].black_guest_name }
} as Game; } as Game;
} catch (err: unknown) { } catch (err: unknown) {
console.log(err); console.log(err);
@@ -41,23 +33,40 @@ export const create = async (game: Game) => {
} }
}; };
export const find = async (where?: string, limit = 1) => { export const findById = async (id: number) => {
const query = where
? `SELECT * FROM "game"`
: {
text: `SELECT * FROM "game" WHERE $1 LIMIT $2`,
values: [where, limit]
};
try { 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 res.rows.map((r) => {
return { return {
id: r.id, id: r.id,
winner: r.winner,
endReason: r.end_reason,
pgn: r.pgn, pgn: r.pgn,
white: { id: r.white_id }, white: { id: r.white_id, name: r.white_name },
black: { id: r.black_id }, black: { id: r.black_id, name: r.black_name }
winner: r.winner
} as Game; } as Game;
}); });
} catch (err: unknown) { } 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) => { export const update = async (id: number, data: string) => {
try { try {
const res = await db.query(`UPDATE "game" SET $1 WHERE id = $2 RETURNING *`, [data, id]); const res = await db.query(`UPDATE "game" SET $1 WHERE id = $2 RETURNING *`, [data, id]);
return { return {
id: res.rows[0].id, id: res.rows[0].id,
winner: res.rows[0].winner,
endReason: res.rows[0].end_reason,
pgn: res.rows[0].pgn, pgn: res.rows[0].pgn,
white: { id: res.rows[0].white_id }, white: { id: res.rows[0].white_id, name: res.rows[0].white_name },
black: { id: res.rows[0].black_id }, black: { id: res.rows[0].black_id, name: res.rows[0].black_name }
winner: res.rows[0].winner
} as Game; } as Game;
} catch (err: unknown) { } catch (err: unknown) {
console.log(err); 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]); const res = await db.query(`DELETE FROM "game" WHERE id = $1 RETURNING *`, [id]);
return { return {
id: res.rows[0].id, id: res.rows[0].id,
winner: res.rows[0].winner,
endReason: res.rows[0].end_reason,
pgn: res.rows[0].pgn, pgn: res.rows[0].pgn,
white: { id: res.rows[0].white_id }, white: { id: res.rows[0].white_id, name: res.rows[0].white_name },
black: { id: res.rows[0].black_id }, black: { id: res.rows[0].black_id, name: res.rows[0].black_name }
winner: res.rows[0].winner
} as Game; } as Game;
} catch (err: unknown) { } catch (err: unknown) {
console.log(err); console.log(err);
@@ -100,7 +112,8 @@ export const remove = async (id: number) => {
const GameModel = { const GameModel = {
create, create,
find, findById,
findByUserId,
update, update,
remove remove
}; };

View File

@@ -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<User>;
} 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 is not specified, get all users
if (!user) { if (!user) {
try { try {
@@ -34,7 +47,9 @@ export const find = async (user: User, limit?: number) => {
try { try {
const res = await db.query( 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] [user.name, user.email, limit ?? 1]
); );
return res.rows as Array<User & { password?: string }>; return res.rows as Array<User & { password?: string }>;
@@ -45,7 +60,7 @@ export const find = async (user: User, limit?: number) => {
}; };
export const update = async (id: number, updatedUser: User & { password?: string }) => { export const update = async (id: number, updatedUser: User & { password?: string }) => {
if (typeof id === "string" || id === 0) { if (id === 0) {
return null; return null;
} }
@@ -66,7 +81,7 @@ export const update = async (id: number, updatedUser: User & { password?: string
}; };
export const remove = async (id: number) => { export const remove = async (id: number) => {
if (typeof id === "string" || id === 0) { if (id === 0) {
return null; return null;
} }
@@ -83,7 +98,8 @@ export const remove = async (id: number) => {
const UserModel = { const UserModel = {
create, create,
find, findById,
findByNameEmail,
update, update,
remove remove
}; };