Files
speckle-server/modules/core/services/users.js
T
2020-07-25 21:04:29 +01:00

104 lines
2.8 KiB
JavaScript

'use strict'
const bcrypt = require('bcrypt')
const crs = require('crypto-random-string')
const appRoot = require('app-root-path')
const knex = require(`${appRoot}/db/knex`)
const Users = () => knex('users')
const ServerRoles = () => knex('server_acl')
module.exports = {
/*
Users
*/
async createUser(user) {
let [{ count }] = await ServerRoles().where({ role: 'server:admin' }).count()
user.id = crs({ length: 10 })
if (user.password) {
user.passwordDigest = await bcrypt.hash(user.password, 10)
}
delete user.password
let usr = await Users().select('id').where({ email: user.email }).first()
if (usr) throw new Error('Email taken. Try logging in?')
let res = await Users().returning('id').insert(user)
if (parseInt(count) === 0) {
await ServerRoles().insert({ userId: res[0], role: 'server:admin' })
} else {
await ServerRoles().insert({ userId: res[0], role: 'server:user' })
}
return res[0]
},
async findOrCreateUser({ user, rawProfile }) {
let existingUser = await Users().select('id').where({ email: user.email }).first()
if (existingUser)
return existingUser
user.password = crs({ length: 20 })
user.verified = true // because we trust the external identity provider, no?
return { id: await module.exports.createUser(user) }
},
async getUserById({ userId }) {
let user = await Users().where({ id: userId }).select('*').first()
delete user.passwordDigest
return user
},
// TODO: deprecate
async getUser(id) {
let user = await Users().where({ id: id }).select('*').first()
delete user.passwordDigest
return user
},
async getUserByEmail({ email }) {
let user = await Users().where({ email: email }).select('*').first()
delete user.passwordDigest
return user
},
async getUserRole(id) {
let { role } = await ServerRoles().where({ userId: id }).select('role').first()
return role
},
async updateUser(id, user) {
delete user.id
delete user.passwordDigest
delete user.password
delete user.email
await Users().where({ id: id }).update(user)
},
async findUsers(query) {
query = "%" + query + "%";
let users = await Users()
.where('email', 'like', query)
.orWhere('username', 'like', query)
.orWhere('name', 'like', query)
return users
},
async validatePasssword({ email, password }) {
let { passwordDigest } = await Users().where({ email: email }).select('passwordDigest').first()
return bcrypt.compare(password, passwordDigest)
},
async deleteUser(id) {
throw new Error('not implemented')
}
}