· 6 years ago · Nov 09, 2019, 03:34 PM
1
2'use strict'
3
4const bcrypt = require('bcrypt-promise')
5// const fs = require('fs-extra')
6const mime = require('mime-types')
7const sqlite = require('sqlite-async')
8const saltRounds = 10
9
10module.exports = class User {
11
12 constructor(dbName = ':memory:') {
13 return (async() => {
14 this.db = await sqlite.open(dbName)
15 // we need this table to store the user accounts
16 const sql = 'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, user TEXT,FirstName VARCHAR(20) NOT NULL, LastName VARCHAR(20) NOT NULL, Gender VARCHAR(6) NOT NULL, Address VARCHAR(50) NOT NULL, Post_code VARCHAR(7) NOT NULL, Birth_date DATE NOT NULL, Phone_number INT(20) NOT NULL, Email VARCHAR(40) NOT NULL, pass TEXT,RPassword VARCHAR(20) NOT NULL, Picture VARCHAR(25));'
17 await this.db.run(sql)
18 return this
19 })()
20 }
21
22 async register(user, pass) {
23 try {
24 if(user.length === 0) throw new Error('missing username')
25 if(pass.length === 0) throw new Error('missing password')
26 let sql = `SELECT COUNT(id) as records FROM users WHERE user="${user}";`
27 const data = await this.db.get(sql)
28 if(data.records !== 0) throw new Error(`username "${user}" already in use`)
29 pass = await bcrypt.hash(pass, saltRounds)
30 sql = `INSERT INTO users(user, FirstName, LastName, Gender, Address, Post_code, Birth_date , Phone_number, Email, pass, RPassword, Picture) VALUES("${user}", "${FirstName}","${LastName}","${Gender}","${Address}","${Post_code}","${Birth_date}","${Phone_number}","${Email}","${pass}","${RPassword}","${Picture}")`
31 await this.db.run(sql)
32 return true
33 } catch(err) {
34 throw err
35 }
36 }
37 async uploadPicture(path, mimeType) {
38 const extension = mime.extension(mimeType)
39 console.log(`path: ${path}`)
40 console.log(`extension: ${extension}`)
41 //await fs.copy(path, `public/avatars/${username}.${fileExtension}`)
42 }
43
44 async login(username, password) {
45 try {
46 let sql = `SELECT count(id) AS count FROM users WHERE user="${username}";`
47 const records = await this.db.get(sql)
48 if(!records.count) throw new Error(`username "${username}" not found`)
49 sql = `SELECT pass FROM users WHERE user = "${username}";`
50 const record = await this.db.get(sql)
51 const valid = await bcrypt.compare(password, record.pass)
52 if(valid === false) throw new Error(`invalid password for account "${username}"`)
53 return true
54 } catch(err) {
55 throw err
56 }
57 }
58
59}