-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
131 lines (106 loc) · 3.92 KB
/
server.js
File metadata and controls
131 lines (106 loc) · 3.92 KB
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
const express = require('express');
const app = express()
const { pool } = require("./dbConfig"); //imports the pool object from the dbConfig.js file.
const bcrypt = require('bcrypt'); //imports the bcrypt module from the Node.js package manager
const session = require("express-session");
const flash = require("express-flash");
const passport = require('passport');
const initializePassport = require("./passportConfig");
initializePassport(passport);
const PORT = process.env.PORT || 4000;
app.set("view engine", "ejs"); //middleware
app.use(express.urlencoded({extended : false})); //parses incoming requests with URL-encoded payloads.
app.use(session({
secret:'secret', //to specify the secret that is used to encrypt the session data.
resave: false, //to specify whether the session data should be saved every time the user makes a request.
saveUninitialized:false // to specify whether the session data should be saved even if it has not been modified.
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.get('/', (req,res) => {
res.render("index");
});
app.get('/users/register', checkAuthenticated, (req,res)=>{
res.render("register");
});
app.get('/users/login', checkAuthenticated, (req,res)=>{
res.render("login");
});
app.get('/users/dashboard', checkNotAuthenticated, (req,res)=>{
res.render("dashboard", { user: req.user.name});
});
app.get('/users/logout', (req, res)=>{
req.logOut;
req.flash("success_msg", "You have been successfully logged out.");
res.redirect("/users/login");
});
app.post('/users/register', async (req,res)=> {
let { name, email, password, password2 } = req.body;
console.log({
name, email, password, password2
});
let errors = [];
if(!name || !email || !password || !password2){
errors.push({message: "Please enter all fields"});
}
if(password.length < 6){
errors.push({message: "Password should be atleast six characters."});
}
if(password != password2){
errors.push({message: "Passwords do not match."});
}
if(errors.length > 0){
res.render("register", { errors });
}else{
//form validation has been passed.
let hashedPassword = await bcrypt.hash(password,10);
console.log(hashedPassword);
pool.query(
//query a database for users whose email address matches the value of the email variable.
`SELECT * FROM users WHERE email = $1`, [email], (err, results)=>{
if (err){
throw err;
}
console.log(results.rows);
if(results.rows.length > 0){
errors.push({message:"Email already registered."});
res.render("register", { errors });
}else{
pool.query(
`INSERT INTO users (name, email, password) VALUES ($1, $2, $3) RETURNING id , password`, [name, email, hashedPassword], (err, results)=>{
if(err){
throw err
}
console.log(results.rows);
req.flash('success_msg', "You are now registered. Please Login.");
res.redirect('/users/login');
}
);
}
}
)
}
});
app.post('/users/login',passport.authenticate('local', {
successRedirect:'/users/dashboard',
failureRedirect: '/users/login',
failureFlash: true
}));
//if authenticated, gives access to the dashboard.
function checkAuthenticated(req,res,next){
if(req.isAuthenticated()){
return res.redirect("/users/dashboard")
}
next(); //used to pass control to the next middleware in a middleware chain.
}
//if not authenticated,redirect to the login page. Restricts forced browsing.
function checkNotAuthenticated(req,res,next){
if(req.isAuthenticated()){
return next();
}
res.redirect('/users/login');
}
app.listen(PORT, ()=>{
console.log(`Server running on port ${PORT}`);
});