// Copyright (C) 2019 ModZero // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import { users as sql } from "@kredens/db/sql"; import argon2 from "argon2"; import { Maybe, None, Some } from "monet"; import { IDatabase, IMain } from "pg-promise"; import { User } from "@kredens/db/models"; export class UserRepository { private db: IDatabase; constructor(db: IDatabase, pgp: IMain) { this.db = db; } public async login(email: string, password: string): Promise> { const { id, encryptedPassword } = await this.db .oneOrNone(sql.login, [email]) .then(user => ({ encryptedPassword: user.encrypted_password, id: +user.id })); if (id === null) { return None(); } return (await argon2.verify(encryptedPassword, password)) ? Some(id) : None(); } public async create(email: string, password: string): Promise { const encryptedPassword = await argon2.hash(password); return this.db .one(sql.create, [email, encryptedPassword]) .then((user: { id: number }) => +user.id); } public async details(id: number): Promise> { return this.db .oneOrNone(sql.details, [id]) .then((user: { email: string }) => user !== null ? Some({ ...user, id }) : None() ); } }