-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
183 lines (176 loc) · 5.46 KB
/
server.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
181
182
183
const express = require("express"); //import express library
const path = require("path"); //import path library for joining paths
const mongoose = require("mongoose");
const app = express();
const bodyParser = require("body-parser");
const Users = require("./models/Users"); //schema
const Courses = require("./models/Courses");
const bcrypt = require("bcryptjs");
require("dotenv/config");
app.use(bodyParser.json());
app.get("/", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "homepage.html"));
});
app.get("/team", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "teampage.html"));
});
app.get("/sign_up", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "sign_up.html"));
});
app.get("/view_progress", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "view_progress.html"));
});
app.get("/playground", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "playground.html"));
});
app.get("/learn", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "learn.html"));
});
app.get("/sign_in", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "sign_in.html"));
});
app.get("/learn/:someCourse", function(req, res) {
console.log(req.url);
requiredFile = req.url.split("/")[2] + ".html";
res.sendFile(path.join(__dirname, requiredFile));
});
app.get("/profile", function(req, res) {
console.log(req.url);
res.sendFile(path.join(__dirname, "profile.html"));
});
//Database logic ~ Sign Up
app.post("/sign_up/send_details", async function(req, res) {
console.log(req.url);
const newUser = new Users({
firstName: req.body.firstName,
lastName: req.body.lastName,
username: req.body.username,
password: req.body.password
});
try {
//Hash the password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newUser.password, salt, (err, hash) => {
if (err) throw err;
//set password to hashed
newUser.password = hash;
newUser.save();
})
);
//const savedUser=await user.save()
res.json({ message: "user creation successful" });
} catch (err) {
res.json({ message: err });
}
});
app.get("/sign_up/get_details/:username", async function(req, res) {
try {
const userName = req.params.username;
const existingUser = await Users.find({ username: userName });
res.json(existingUser);
} catch (err) {
res.json({ message: "Unique" });
}
});
//
//Database Logic ~ Sign In
app.post("/sign_in/send_details", async function(req, res) {
//this is reponsible for 1)checking if username exists, then fetching details 2) comparing plaintext password sent from front to the encrypted passweord received from database
//1) Checking if user exists
const username = req.body.username;
const sentPassword = req.body.password;
const foundUser = await Users.findOne({ username: username });
//console.log(foundUser)
if (foundUser) {
//user found. Validate password
const actualPassword = foundUser.password;
const result = bcrypt.compare(sentPassword, actualPassword, function(
err,
result
) {
if (result) {
res.send({ message: "Authentication successful", exists: true });
} else {
res.send({ message: "Incorrect password.", exists: true });
}
});
} else {
res.send({ message: "User does not exist.", exists: false });
}
});
//Database Logic ~ Track Progress
//If user clicks the learn button on a course, then add a record with
//the coursename,total(number of modules) and username if not already in the database
//add 1 to the progress(which is default 1) when user clicks a module
//the user is forced to move sequentially.
app.post("/progress/fetch_progress", async function(req, res) {
const totals = {
"isl-alphabets": 12
};
const foundEnrolled = await Courses.findOne({
username: req.body.username,
coursename: req.body.courseName
});
if (foundEnrolled) {
res.send(foundEnrolled);
} else {
const userName = req.body.username;
const courseName = req.body.courseName;
const total = totals[courseName];
const newEnrollment = new Courses({
coursename: courseName,
username: userName,
total: total
});
try {
newEnrollment.save();
res.json({ message: `${userName} has been enrolled in ${courseName}` });
} catch (err) {
res.json({ message: err });
}
}
});
//Update progress
app.patch("/progress/update_progress",async function(req,res){
const user=req.body.username
const course=req.body.courseName
const data={
username:user,
courseName:course
}
const something=await Courses.findOneAndUpdate({username:user,coursename:course},{$set:{progress:req.body.progress}})
res.json(something)
})
//
app.post("/fetch_user_graph",async (req,res)=>{
const userName=req.body.username
const courseName=req.body.coursename
const foundRecord=await Courses.findOne({
coursename:courseName,
username:userName
})
if(foundRecord!==null){
res.json({progress:foundRecord.progress,total:foundRecord.total})
}
else{
res.json({progress:0,total:12})
}
})
app.use(express.static(__dirname + "/public/")); //public data
const port = 3001;
mongoose.connect(
process.env.DB_CONNECTION, //environment variable
{ useNewUrlParser: true },
function() {
console.log("connected to db...");
}
);
app.listen(port);
console.log(`listening on port ${port}`);