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

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}`);
}
}
}