-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusers.js
180 lines (158 loc) · 6.68 KB
/
users.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
* Title: User Handler File
* Description: User Handler to Handle users
* Author: Mohammad Mesbaul Haque
* Github link: https://github.com/mmesba
* Date: 08/03/2022
*/
// Dependencies.
const _data = require('./data');
const helpers = require('./helpers');
// App object or Module scaffolding.
const users = {};
// main functions or objects.
// JSON API handler
users.userHandler = (data, callback)=>{
// Check which method is is requested by user and response according to that
const acceptedMethods = ['get', 'post', 'put', 'delete'];
if(acceptedMethods.indexOf(data.method) > -1){
// Call the corresponding method defined below
users._users[data.method](data, callback);
} else{
callback(405)
}
}
users._users = {};
users._users.post = (data, callback)=>{
// Check that all required fields are filled out
let firstName = typeof(data.payload.firstName) === 'string' && data.payload.firstName.trim().length > 0 ? data.payload.firstName : false;
let lastName = typeof(data.payload.lastName) === 'string' && data.payload.lastName.trim().length > 0 ? data.payload.lastName : false;
let phone = typeof(data.payload.phone) === 'string' && data.payload.phone.trim().length === 11 ? data.payload.phone.trim() : false;
let password = typeof(data.payload.password) === 'string' && data.payload.password.trim().length > 0 ? data.payload.password : false;
let tosAgreement = typeof(data.payload.tosAgreement) === 'boolean' && data.payload.tosAgreement == true ? true : false;
if(firstName && lastName && phone && password && tosAgreement) {
// Make sure the user doesn't already exist
_data.read('users', phone, (err, data)=>{
if (err) {
// Hash the password
let hashedPassword = helpers.hash(password);
if(hashedPassword){
// Create the user object
let userObject = {
'firstName': firstName,
'lastName' : lastName,
'phone' : phone,
'hashedPassword' : hashedPassword,
'tosAgreement' : true
};
// Store the user
_data.create('users', phone, userObject, (err)=>{
if (!err) {
callback(200, {'msg': 'user created successfully'}) ;
} else {
console.log(err);
callback(500, {'Error' : 'Could not create new user'})
}
})
} else{
callback(500, {'error': 'could not hash the user\'s password'})
}
}else{
// User already exist
callback(400, {'Error': 'A user with that phone number already exist'})
}
})
}else{
callback(400, {'error': 'Missing required field'})
}
}
// Get or Read user
users._users.get = (data, callback)=>{
// Check the phone number is valid
let phone = typeof(data.queryStringObject.phone) === 'string' && data.queryStringObject.phone.trim().length === 11 ? data.queryStringObject.phone.trim() : false;
if(phone){
// Lookup the user
_data.read('users', phone, (err, data)=>{
if (!err && data) {
// Remove the hashed password from the user object before returning it to the requester
delete data.hashedPassword;
callback(200, data);
} else {
callback(404, {'Error': 'Not found'})
}
})
}else{
callback(400, {'Error': 'Missing require field'})
}
}
// users put
users._users.put = (data, callback)=>{
// Check for the require field
let phone = typeof(data.payload.phone) === 'string' && data.payload.phone.trim().length === 11 ? data.payload.phone.trim() : false;
// Check the optional field
let firstName = typeof(data.payload.firstName) === 'string' && data.payload.firstName.trim().length > 0 ? data.payload.firstName : false;
let lastName = typeof(data.payload.lastName) === 'string' && data.payload.lastName.trim().length > 0 ? data.payload.lastName : false;
let password = typeof(data.payload.password) === 'string' && data.payload.password.trim().length > 0 ? data.payload.password : false;
// Error if the phone is invalid
if(phone){
// Error if nothing is sent to update
if(firstName || lastName || password){
// lookup the user
_data.read('users', phone, (err, userData)=>{
if (!err && userData) {
// Update the fields necessary
if(firstName){
userData.firstName = firstName;
}
if(lastName){
userData.lastName = lastName
}
if(password){
userData.hashedPassword = helpers.hash(password);
}
// Store the new updates
_data.update('users', phone, userData, (err2)=>{
if (!err) {
callback(200, {'msg': 'updated!'})
} else {
console.log(err2);
callback(500, {'error': 'could not update the user'})
}
})
} else {
callback(400, {'error': 'the specified user does not exist'})
}
})
}else{
callback(400, {'error': 'missing fields to update'})
}
} else{
callback(400, {'error': 'Missing required field '})
}
}
// Delete user
users._users.delete = (data, callback)=>{
// Check the phone number is valid
let phone = typeof(data.queryStringObject.phone) === 'string' && data.queryStringObject.phone.trim().length === 11 ? data.queryStringObject.phone.trim() : false;
if(phone){
// Lookup the user
_data.read('users', phone, (err, data)=>{
if (!err && data) {
_data.delete('users', phone, (err)=>{
if (!err) {
callback(200, {'msg': 'deleted user!'})
} else {
callback(500, {'error': 'deleting faild'})
}
})
} else {
callback(400, {'error' : 'could not found user'})
}
})
} else{
callback(400, {'error': 'missing required field'})
}
}
// export the module.
module.exports = users;