36 lines
1.2 KiB
JavaScript
36 lines
1.2 KiB
JavaScript
|
import db from '../db.js'
|
||
|
import statuses from '../utils/status.js';
|
||
|
import bcrypt from 'bcrypt';
|
||
|
|
||
|
class UserService {
|
||
|
async create (username, password) {
|
||
|
await db.query("INSERT INTO users (username, password) VALUES ($1, $2)", [username, bcrypt.hashSync(password, 12)]).catch (e => {
|
||
|
if (e.code == 23505) { // already exists
|
||
|
return statuses.duplicate
|
||
|
}
|
||
|
})
|
||
|
return statuses.ok
|
||
|
}
|
||
|
|
||
|
async getByUsername(username) {
|
||
|
let user = (await db.query("SELECT * FROM Users WHERE username = $1", [username])).rows
|
||
|
if (user == undefined) return statuses.not_found
|
||
|
return (user[0]);
|
||
|
}
|
||
|
|
||
|
async getAll() {
|
||
|
return (await db.query("SELECT * FROM Users")).rows;
|
||
|
}
|
||
|
|
||
|
async isInGroup(userId, groupId) {
|
||
|
return (await db.query("SELECT * FROM Users WHERE ID = $1 AND $2 = ANY(groups)", [userId, groupId])).rowCount > 0;
|
||
|
}
|
||
|
|
||
|
async joinGroup(userId, groupId) {
|
||
|
if (await (this.isInGroup(userId, groupId))) return statuses.duplicate;
|
||
|
await db.query("UPDATE Users SET groups = array_append(groups, $1::integer) WHERE ID = $2", [groupId, userId]);
|
||
|
return statuses.ok;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default new UserService();
|