move to public repo
This commit is contained in:
3
server/src/db/index.ts
Normal file
3
server/src/db/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import { Pool } from "pg";
|
||||
|
||||
export const db = new Pool();
|
||||
16
server/src/db/init.sql
Normal file
16
server/src/db/init.sql
Normal file
@@ -0,0 +1,16 @@
|
||||
-- users
|
||||
CREATE TABLE "user" (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(128) UNIQUE NOT NULL,
|
||||
email VARCHAR(128),
|
||||
password TEXT
|
||||
);
|
||||
|
||||
-- games
|
||||
CREATE TABLE "game" (
|
||||
id SERIAL PRIMARY KEY,
|
||||
pgn TEXT,
|
||||
white_id INT REFERENCES "user",
|
||||
black_id INT REFERENCES "user",
|
||||
winner CHAR(5)
|
||||
);
|
||||
89
server/src/db/models/game.model.ts
Normal file
89
server/src/db/models/game.model.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import { db } from "..";
|
||||
import { Game } from "@types";
|
||||
|
||||
export const activeGames: Array<Game> = [];
|
||||
|
||||
// todo: join user and game relationship
|
||||
|
||||
const create = async (game: Game) => {
|
||||
try {
|
||||
const res = await db.query(
|
||||
`INSERT INTO "game"(pgn, white_id, black_id, winner) VALUES($1, $2, $3, $4) RETURNING *`,
|
||||
[game.pgn || null, game.white?.id || null, game.black?.id || null, game.winner || null]
|
||||
);
|
||||
return {
|
||||
id: res.rows[0].id,
|
||||
pgn: res.rows[0].pgn,
|
||||
white: { id: res.rows[0].white_id },
|
||||
black: { id: res.rows[0].black_id },
|
||||
winner: res.rows[0].winner
|
||||
} as Game;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const find = async (where?: string, limit = 1) => {
|
||||
const query = where
|
||||
? `SELECT * FROM "game"`
|
||||
: {
|
||||
text: `SELECT * FROM "game" WHERE $1 LIMIT $2`,
|
||||
values: [where, limit]
|
||||
};
|
||||
|
||||
try {
|
||||
const res = await db.query(query);
|
||||
return res.rows.map((r) => {
|
||||
return {
|
||||
id: r.id,
|
||||
pgn: r.pgn,
|
||||
white: { id: r.white_id },
|
||||
black: { id: r.black_id },
|
||||
winner: r.winner
|
||||
} as Game;
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
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,
|
||||
pgn: res.rows[0].pgn,
|
||||
white: { id: res.rows[0].white_id },
|
||||
black: { id: res.rows[0].black_id },
|
||||
winner: res.rows[0].winner
|
||||
} as Game;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (id: number) => {
|
||||
try {
|
||||
const res = await db.query(`DELETE FROM "game" WHERE id = $1 RETURNING *`, [id]);
|
||||
return {
|
||||
id: res.rows[0].id,
|
||||
pgn: res.rows[0].pgn,
|
||||
white: { id: res.rows[0].white_id },
|
||||
black: { id: res.rows[0].black_id },
|
||||
winner: res.rows[0].winner
|
||||
} as Game;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export const GameModel = {
|
||||
create,
|
||||
find,
|
||||
update,
|
||||
remove
|
||||
};
|
||||
87
server/src/db/models/user.model.ts
Normal file
87
server/src/db/models/user.model.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { db } from "..";
|
||||
import type { User } from "@types";
|
||||
|
||||
const create = async (user: User, password: string) => {
|
||||
if (user.name === "Guest" || user.email === undefined) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await db.query(
|
||||
`INSERT INTO "user"(name, email, password) VALUES($1, $2, $3) RETURNING id, name, email`,
|
||||
[user.name, user.email ?? null, password]
|
||||
);
|
||||
return res.rows[0] as User;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const find = async (where?: string, limit = 1) => {
|
||||
// if user is not specified, get all users
|
||||
if (!where) {
|
||||
try {
|
||||
const res = await db.query(`SELECT id, name, email FROM "user"`);
|
||||
return res.rows as Array<User>;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
/* const res = await db.query(
|
||||
`SELECT id, name, email FROM "user" WHERE ${typeof user.id === "number" ? "id" : typeof user.name === "string" ? "name" : "email" } = $1 LIMIT $2`,
|
||||
[typeof user.id === "number" ? user.id : typeof user.name === "string" ? user.name : user.email, limit]
|
||||
); */
|
||||
const res = await db.query(`SELECT id, name, email FROM "user" WHERE $1 LIMIT $2`, [
|
||||
where,
|
||||
limit
|
||||
]);
|
||||
return res.rows as Array<User>;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (id: number, data: string) => {
|
||||
if (typeof id === "string" || id === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await db.query(`UPDATE "user" SET $1 WHERE id = $2 RETURNING id, name, email`, [
|
||||
data,
|
||||
id
|
||||
]);
|
||||
return res.rows[0] as User;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (id: number) => {
|
||||
if (typeof id === "string" || id === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await db.query(`DELETE FROM "user" WHERE id = $1 RETURNING id, name, email`, [
|
||||
id
|
||||
]);
|
||||
return res.rows[0] as User;
|
||||
} catch (err: unknown) {
|
||||
console.log(err);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
export const UserModel = {
|
||||
create,
|
||||
find,
|
||||
update,
|
||||
remove
|
||||
};
|
||||
Reference in New Issue
Block a user