You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.3 KiB
TypeScript
142 lines
3.3 KiB
TypeScript
import client from "../database";
|
|
import bcrypt from "bcrypt";
|
|
|
|
const { BCRYPT_PASSWORD, SALT_ROUNDS } = process.env;
|
|
const pepper = BCRYPT_PASSWORD;
|
|
const saltRounds = SALT_ROUNDS;
|
|
|
|
export type User = {
|
|
id?: number;
|
|
firstname?: string;
|
|
lastname?: string;
|
|
username: string;
|
|
password: string;
|
|
};
|
|
|
|
export class UserStore {
|
|
async index(): Promise<User[]> {
|
|
try {
|
|
const conn = await client.connect();
|
|
const sql = "SELECT * FROM users";
|
|
|
|
const result = await conn.query(sql);
|
|
const users = result.rows;
|
|
|
|
conn.release();
|
|
|
|
return users;
|
|
} catch (err) {
|
|
throw new Error(`Cannot get any users ${err}`);
|
|
}
|
|
}
|
|
|
|
async read(id: number): Promise<User> {
|
|
try {
|
|
const conn = await client.connect();
|
|
const sql = "SELECT * FROM users WHERE id=($1)";
|
|
|
|
const result = await conn.query(sql, [id]);
|
|
const user = result.rows[0];
|
|
|
|
conn.release();
|
|
|
|
return user;
|
|
} catch (err) {
|
|
throw new Error(`Could not find user ${id}. Error: ${err}`);
|
|
}
|
|
}
|
|
|
|
async create(u: User): Promise<User> {
|
|
try {
|
|
const conn = await client.connect();
|
|
const sql =
|
|
"INSERT INTO users (firstname, lastname, username, password) VALUES ($1, $2, $3, $4) RETURNING *";
|
|
const hash = bcrypt.hashSync(
|
|
u.password + pepper,
|
|
parseInt(saltRounds as string, 10)
|
|
);
|
|
|
|
const result = await conn.query(sql, [
|
|
u.firstname,
|
|
u.lastname,
|
|
u.username,
|
|
hash,
|
|
]);
|
|
const user = result.rows[0];
|
|
|
|
conn.release();
|
|
|
|
return user;
|
|
} catch (err) {
|
|
throw new Error(`Could not add a new user ${u.firstname}. Error: ${err}`);
|
|
}
|
|
}
|
|
|
|
async update(u: User): Promise<User> {
|
|
try {
|
|
const conn = await client.connect();
|
|
const sql =
|
|
"UPDATE users SET firstname=$1, lastName=$2, username=$3, password=$4 WHERE id=$5 RETURNING *";
|
|
const hash = bcrypt.hashSync(
|
|
u.password + pepper,
|
|
parseInt(saltRounds as string, 10)
|
|
);
|
|
|
|
const result = await conn.query(sql, [
|
|
u.firstname,
|
|
u.lastname,
|
|
u.username,
|
|
hash,
|
|
u.id,
|
|
]);
|
|
const user = result.rows[0];
|
|
|
|
conn.release();
|
|
|
|
return user;
|
|
} catch (err) {
|
|
throw new Error(`Could not update user ${u.firstname}. Error: ${err}`);
|
|
}
|
|
}
|
|
|
|
async delete(id: Number): Promise<User> {
|
|
try {
|
|
const conn = await client.connect();
|
|
const sql = "DELETE FROM users WHERE id=($1)";
|
|
|
|
const result = await conn.query(sql, [id]);
|
|
const user = result.rows[0];
|
|
|
|
conn.release();
|
|
|
|
return user;
|
|
} catch (err) {
|
|
throw new Error(`Could not delete user ${id}. Error: ${err}`);
|
|
}
|
|
}
|
|
|
|
async authenticate(username: string, password: string): Promise<User | null> {
|
|
try {
|
|
const conn = await client.connect();
|
|
//const sql = 'SELECT password FROM users WHERE username=($1)'
|
|
const sql = "SELECT * FROM users WHERE username=($1)";
|
|
|
|
const result = await conn.query(sql, [username]);
|
|
|
|
if (result.rows.length) {
|
|
const user = result.rows[0];
|
|
|
|
if (bcrypt.compareSync(password + pepper, user.password)) {
|
|
return user;
|
|
}
|
|
}
|
|
|
|
conn.release();
|
|
|
|
return null;
|
|
} catch (err) {
|
|
throw new Error(`Could not find user ${username}. Error: ${err}`);
|
|
}
|
|
}
|
|
}
|