-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
142 lines (127 loc) · 3.44 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
const express = require('express')
const {open} = require('sqlite')
const sqlite3 = require('sqlite3')
const path = require('path')
const bcrypt = require('bcrypt')
const databasePath = path.join(__dirname, 'userData.db')
const app = express()
app.use(express.json())
let database = null
const initializeDbAndServer = async () => {
try {
database = await open({
filename: databasePath,
driver: sqlite3.Database,
})
app.listen(3000, () => console.log('Server Running at http://local:3000/'))
} catch (error) {
console.log(`DB Error: ${error.message}`)
process.exit(1)
}
}
initializeDbAndServer()
const validatePassword = password => {
return password.length > 4
}
app.post('/register', async (request, response) => {
const {username, name, password, gender, location} = request.body
const hashedPassword = await bcrypt.hash(password, 10)
const selectUserQuery = `
SELECT
*
FROM
user
WHERE
username = '${username}';`
const databaseUser = await database.get(selectUserQuery)
if (databaseUser === undefined) {
const createUserQuery = `
INSERT INTO
user (username, name, password, gender, location)
VALUES
(
'${username}',
'${name}',
'${hashedPassword}',
'${gender}',
'${location}'
);`
if (validatePassword(password)) {
await database.run(createUserQuery)
response.send('User created successfully')
} else {
response.status(400)
response.send('Password is too short')
}
} else {
response.status(400)
response.send('User already exists')
}
})
app.post('/login', async (request, response) => {
const {username, password} = request.body
const selectUserQuery = `
SELECT
*
FROM
user
WHERE
username = '${username}';`
const databaseUser = await database.get(selectUserQuery)
if (databaseUser === undefined) {
response.status(400)
response.send('Invalid user')
} else {
const isPasswordMatched = await bcrypt.compare(
password,
databaseUser.password,
)
if (isPasswordMatched === true) {
response.send('Login success!')
} else {
response.status(400)
response.send('Invalid password')
}
}
})
app.put('/change-password', async (request, response) => {
const {username, oldPassword, newPassword} = request.body
const selectUserQuery = `
SELECT
*
FROM
user
WHERE
username = '${username}';`
const databaseUser = await database.get(selectUserQuery)
if (databaseUser === undefined) {
response.status(400)
response.send('Invalid user')
} else {
const isPasswordMatched = await bcrypt.compare(
oldPassword,
databaseUser.password,
)
if (isPasswordMatched === true) {
if (validatePassword(newPassword)) {
const hashedPassword = await bcrypt.hash(newPassword, 10)
const updatePasswordQuery = `
UPDATE
user
SET
password = '${hashedPassword}'
WHERE
username = '${username}';`
const user = await database.run(updatePasswordQuery)
response.send('Password updated')
} else {
response.status(400)
response.send('Password is too short')
}
} else {
response.status(400)
response.send('Invalid current password')
}
}
})
module.exports = app