import bcrypt from "bcrypt" import { User } from "@db_models" export default async ({ username, password, hash }, user) => { if (typeof user === "undefined") { let isEmail = username.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/) let query = isEmail ? { email: username } : { username: username } user = await User.findOne(query).select("+password") } if (!user) { throw new OperationError(401, "User not found") } if (typeof hash !== "undefined") { if (user.password !== hash) { throw new OperationError(401, "Invalid credentials") } } else { if (!bcrypt.compareSync(password, user.password)) { throw new OperationError(401, "Invalid credentials") } } return user }