-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
136 lines (112 loc) · 3.39 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
if (process.env.NODE_ENV !== "production") {
require("dotenv").config()
}
// Import all necessary packages
const express = require("express");
const bcrypt = require("bcrypt");
const passport = require("passport");
const flash = require("express-flash");
const session = require("express-session");
const MongoDBSession = require("connect-mongodb-session")(session);
const methodOverride = require("method-override");
const mongoose = require("mongoose");
const initializePassport = require("./passport-config");
const app = express();
const userSchema = new mongoose.Schema({
id: String,
name: String,
email: String,
password: String,
});
const users = mongoose.model('users', userSchema);
mongoose.connect(process.env.MONGODB_URL, {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('MongoDB Connected...'))
async function getUserByEmail(email) {
return await users.findOne({ email: email }).catch(err => {
console.error('Error occurred:', err);
});
}
async function getUserById(id) {
return await users.findOne({ id: id });
}
initializePassport(passport, getUserByEmail, getUserById, users);
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views'); // make sure your EJS templates are in a directory named "views" in the same directory as your server.js file
app.use(express.urlencoded({ extended: false }))
app.use(flash())
const store = new MongoDBSession({
uri: process.env.MONGODB_URL,
collection: "sessions",
});
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
store: store,
})
);
app.use(passport.initialize())
app.use(passport.session())
app.use(methodOverride("_method"))
// Configuring the register post functionality
app.post("/login", checkNotAuthenticated, passport.authenticate("local", {
successRedirect: "/",
failureRedirect: "/login",
failureFlash: true
}))
// Configuring the register post functionality
app.post("/register", checkNotAuthenticated, async (req, res) => {
try {
const hashedPassword = await bcrypt.hash(req.body.password, 10)
// Create a new user
const user = new users({
id: Date.now().toString(),
name: req.body.name,
email: req.body.email,
password: hashedPassword
})
// Save the user to the database
await user.save()
console.log(users); // Display newly registered in the console
res.redirect("/login")
} catch (e) {
console.log(e);
res.redirect("/register")
}
})
// Routes
app.get('/', checkAuthenticated, (req, res) => {
res.render("index.ejs", { name: req.user.name })
})
app.get('/login', checkNotAuthenticated, (req, res) => {
res.render("login.ejs")
})
app.get('/register', checkNotAuthenticated, (req, res) => {
res.render("register.ejs")
})
// End Routes
app.delete("/logout", (req, res) => {
req.logout((err) => {
if (err) {
return next(err);
}
res.redirect("/");
});
});
function checkAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next()
}
res.redirect("/login")
}
function checkNotAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return res.redirect("/")
}
next()
}
app.listen(3000, () => console.log("Server is running"));