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.

143 lines
3.7 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}`)
}
}
}