· 6 years ago · Nov 09, 2019, 07:00 PM
1module.exports = class User {
2
3 constructor(dbName = ':memory:') {
4 return (async() => {
5 this.db = await sqlite.open(dbName)
6 // we need this table to store the user accounts
7 let sql = 'CREATE TABLE IF NOT EXISTS Card_details(Card_id INTEGER PRIMARY KEY AUTOINCREMENT, cardType VARCHAR(15) NOT NULL, cardNumber VARCHAR(20) NOT NULL, expiryMonth VARCHAR(20) NOT NULL, expiryYear INT(4) NOT NULL, threeNumberOnBack INT(3) NOT NULL, CustomerID INT(5) REFERENCES users(Cust_id) NOT NULL)'
8 this.db.run(sql)
9 sql = 'CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY AUTOINCREMENT, user VARCHAR(20),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 VARCHAR(20),RPassword VARCHAR(20) NOT NULL, Picture VARCHAR(25))'
10 this.db.run(sql)
11 sql = 'CREATE TABLE IF NOT EXISTS MovieDisplayRoom(DisplayRoom INTEGER PRIMARY KEY AUTOINCREMENT, NumberOfSeats VARCHAR(3) NOT NULL)'
12 this.db.run(sql)
13 sql = 'CREATE TABLE IF NOT EXISTS Movies(Movie VARCHAR(30) Primary Key NOT NULL, Poster VARCHAR(30) NOT NULL, Details VARCHAR(200) NOT NULL)'
14 this.db.run(sql)
15 sql = 'CREATE TABLE IF NOT EXISTS PaymentReference(ReferenceNumber INTEGER PRIMARY KEY AUTOINCREMENT, TicketID INT(5) REFERENCES Tickets(Ticket_id) NOT NULL, CustomerID INT(5) REFERENCES users(Cust_id) NOT NULL, CardID INT(10) REFERENCES Card_details(card_id) NOT NULL)'
16 this.db.run(sql)
17 sql = 'CREATE TABLE IF NOT EXISTS Showing_schedule(ShowNumber VARCHAR(8) PRIMARY KEY NOT NULL,Date DATE NOT NULL, Time VARCHAR(7) NOT NULL, movie VARCHAR(30) REFERENCES Movies(Movie) NOT NULL, roomnumber INT(2) REFERENCES MovieDisplayRoom(DisplayRoom))'
18 this.db.run(sql)
19 sql = 'CREATE TABLE IF NOT EXISTS Tickets(Ticket_id INTEGER PRIMARY KEY AUTOINCREMENT, Quantity_of_tickets INT(15) NOT NULL, Shownumber VARCHAR(8) REFERENCES Showing_schedule(ShowNumber) NOT NULL)'
20 this.db.run(sql)
21 return this
22 })()
23 }
24
25 async register(user, pass) {
26 try {
27 if(user.length === 0) throw new Error('missing username')
28 if(pass.length === 0) throw new Error('missing password')
29 let sql = `SELECT COUNT(id) as records FROM users WHERE user="${user}";`
30 const data = await this.db.get(sql)
31 if(data.records !== 0) throw new Error(`username "${user}" already in use`)
32 pass = await bcrypt.hash(pass, saltRounds)
33 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}")`
34 await this.db.run(sql)
35 return true
36 } catch(err) {
37 throw err
38 }
39 }