Skip to content

Commit f2ffaf8

Browse files
committed
♻️ Refactored and optimized code
1 parent 87434c9 commit f2ffaf8

File tree

4 files changed

+152
-152
lines changed

4 files changed

+152
-152
lines changed

routes/v1/auth/auth.js

+118-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,126 @@
11
const express = require("express");
22
const authRouter = express.Router();
3+
require('querystring');
4+
const mongoose = require('mongoose');
5+
require('./../../../database/model/users');
6+
const db = mongoose.connection;
7+
const Users = mongoose.model('Users');
8+
const passport = require('passport');
9+
const LocalStrategy = require('passport-local').Strategy;
10+
const flash = require('connect-flash');
11+
const authenticationMiddleware = require('./../../../middleware/authenticationMiddleware');
12+
const bcrypt = require('bcryptjs');
313

4-
/* GET home page. */
5-
authRouter.get("/", async function (req, res, next) {
14+
authRouter.use(passport.initialize());
15+
authRouter.use(passport.session());
16+
authRouter.use(flash());
17+
18+
//Passport middleware for Authentication
19+
passport.use(new LocalStrategy(
20+
function (username, password, done) {
21+
Users.findOne({username: username}, function (err, user) {
22+
if (err) {
23+
return done(err);
24+
}
25+
if (!user) {
26+
return done(null, false, {message: 'username-incorrect'});
27+
}
28+
if (!bcrypt.compareSync(password, user.password)) {
29+
return done(null, false, {message: 'password-incorrect'});
30+
}
31+
return done(null, user);
32+
});
33+
}
34+
));
35+
36+
passport.serializeUser(function (user, done) {
37+
done(null, user);
38+
});
39+
40+
passport.deserializeUser(function (user, done) {
41+
done(null, user);
42+
});
43+
44+
authRouter.post('/login',
45+
passport.authenticate('local', {
46+
successFlash: 'Successful login, welcome!',
47+
failureFlash: true,
48+
successRedirect: 'success-url',
49+
failureRedirect: 'login-failed',
50+
})
51+
);
52+
53+
authRouter.post('/register', async (req, res) => {
54+
let usernameCheck = req.query.usernameCheck;
55+
let {name, username, password} = req.body;
56+
57+
/**
58+
* Username availability check
59+
* ToDo: Create a middleware for this section
60+
*/
61+
if (usernameCheck) {
62+
if (username === '') return res.json({
63+
error: true,
64+
message: 'Username can\'t be empty!'
65+
});
66+
67+
return Users.findOne({username: username}, function (err, user) {
68+
if (err) return res.json({
69+
error: true
70+
});
71+
72+
return res.json({
73+
usernameAlreadyInUsage: (!!user),
74+
});
75+
}
76+
);
77+
}
78+
79+
if (!name || !username || !password) return res.json({
80+
success: false,
81+
message: 'All fields are required!'
82+
});
83+
84+
await Users.findOne({username: username}, async function (err, user) {
85+
if (err) return res.json({success: false, error: true});
86+
if (user) return res.json({success: false, message: 'Username already exist!'});
87+
88+
const salt = bcrypt.genSaltSync(10);
89+
const newUser = new Users({
90+
name: name,
91+
username: username,
92+
password: bcrypt.hashSync(password, salt)
93+
});
94+
95+
await newUser.save(function (err) {
96+
if (err) return console.error(err);
97+
});
98+
99+
return res.json({
100+
success: true,
101+
message: 'User is successfully registered!'
102+
});
103+
});
104+
});
105+
106+
authRouter.get('/success-url', authenticationMiddleware(), (req, res) => {
107+
return res.json({
108+
success: true,
109+
username: req.session.passport.user.username,
110+
message: req.flash('success')[0]
111+
});
112+
});
113+
114+
authRouter.get('/login-failed', (req, res) => {
6115
res.json({
7-
'success': true,
8-
'message': 'Express.JS & Socket.IO test API route'
116+
success: false,
117+
message: req.flash('error')[0]
9118
});
10119
});
11120

121+
authRouter.get('/logout', function (req, res) {
122+
req.logout();
123+
res.redirect('/login');
124+
});
125+
12126
module.exports = authRouter;

routes/v1/init.js

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ const init = express.Router();
33
const path = require('path');
44
const authRoute = require('./auth/auth')
55

6+
init.get("/", async function (req, res, next) {
7+
res.json({
8+
'version': 1.0,
9+
'name': 'Express.js & Socket.io API boilerplate'
10+
});
11+
});
12+
13+
14+
/**
15+
* Configure here all routes
16+
*/
617
init.use('/auth/', authRoute)
718

819
module.exports = init

seed.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
const mongoose = require('mongoose');
2-
require('./database/model/users');
2+
const srvConfig = require('./config');
33
const db = mongoose.connection;
4+
const {CONNECTION_TYPE, DB_HOST, DB_USERNAME, DB_PASSWORD, DB_PORT, DB_NAME, DB_QUERY_PARAMS} = srvConfig;
5+
const dbAuthString = (DB_USERNAME && DB_PASSWORD) ? `${srvConfig.DB_USERNAME}:${srvConfig.DB_PASSWORD}@` : '';
6+
require('./database/model/users');
47
const Users = mongoose.model('Users');
5-
const srvConfig = require('./config');
68

7-
mongoose.connect(`mongodb+srv://${srvConfig.DB_USERNAME}:${srvConfig.DB_PASSWORD}@${srvConfig.DB_HOST}/${srvConfig.DB_NAME}${srvConfig.DB_QUERY_PARAMS}`, {
9+
mongoose.connect(`${CONNECTION_TYPE}://${dbAuthString}${DB_HOST}:${DB_PORT}/${DB_NAME}${DB_QUERY_PARAMS}`, {
810
useNewUrlParser: true,
911
useUnifiedTopology: true
1012
}).then(() => {
1113
return seedUsers();
1214
}).catch(err => {
1315
console.log(err);
1416
}).then(() => {
17+
console.log('Database successfully seeded!')
1518
db.close();
1619
});
1720

@@ -21,12 +24,12 @@ async function seedUsers() {
2124
{
2225
"name": "John Doe",
2326
"username": "john",
24-
"password": "password123"
27+
"password": "$2a$10$KPtehsbArEr3XlIbNOOHOu7/N4s6ha31ZZ2jDngQ.jvFToDs5mNdO" //password123
2528
},
2629
{
2730
"name": "Jane Roe",
2831
"username": "jane",
29-
"password": "securePassword1"
32+
"password": "$2a$10$M8R.EalzDPC.ZNz4K.SqMO87KQp0Paq3Qv9xyTG6LHJobNyViWFHi" //securepassword1
3033
},
3134
])
3235
}

server.js

+15-143
Original file line numberDiff line numberDiff line change
@@ -1,166 +1,35 @@
11
'use strict';
22
const express = require('express');
3+
const app = express();
34
const http = require('http');
45
const session = require('express-session');
56
const bodyParser = require('body-parser');
67
const cookieParser = require('cookie-parser');
7-
const querystring = require('querystring');
88
const srvConfig = require('./config');
9-
109
const mongoose = require('mongoose');
11-
require('./database/model/users');
12-
const db = mongoose.connection;
13-
const Users = mongoose.model('Users');
14-
15-
const app = express();
16-
const passport = require('passport');
17-
const LocalStrategy = require('passport-local').Strategy;
18-
const flash = require('connect-flash');
19-
20-
const authenticationMiddleware = require('./middleware/authenticationMiddleware');
21-
const bcrypt = require('bcryptjs');
10+
const {CONNECTION_TYPE, DB_HOST, DB_USERNAME, DB_PASSWORD, DB_PORT, DB_NAME, DB_QUERY_PARAMS} = srvConfig;
11+
const dbAuthString = (DB_USERNAME && DB_PASSWORD) ? `${srvConfig.DB_USERNAME}:${srvConfig.DB_PASSWORD}@` : '';
12+
let httpServer;
2213

23-
//Install middlewear
14+
/**
15+
* Configure middleware
16+
*/
2417
app.use(cookieParser());
2518
app.use(bodyParser.json());
2619
app.use(session({
2720
saveUninitialized: true,
2821
secret: srvConfig.SESSION_SECRET,
2922
resave: true
3023
}));
31-
app.use(passport.initialize());
32-
app.use(passport.session());
33-
app.use(flash());
3424

3525
/**
3626
* Include all API Routes
3727
*/
3828
app.use('/api', require('./routes/api'));
3929

40-
41-
//ToDo: Refactor this to own route
42-
//Passport middleware for Authentication
43-
passport.use(new LocalStrategy(
44-
function (username, password, done) {
45-
Users.findOne({username: username}, function (err, user) {
46-
if (err) {
47-
return done(err);
48-
}
49-
if (!user) {
50-
return done(null, false, {message: 'username-incorrect'});
51-
}
52-
if (!bcrypt.compareSync(password, user.password)) {
53-
return done(null, false, {message: 'password-incorrect'});
54-
}
55-
return done(null, user);
56-
});
57-
}
58-
));
59-
passport.serializeUser(function (user, done) {
60-
done(null, user);
61-
62-
});
63-
passport.deserializeUser(function (user, done) {
64-
done(null, user);
65-
66-
});
67-
68-
69-
app.post('/login',
70-
passport.authenticate('local', {
71-
successFlash: 'Welcome!',
72-
failureFlash: true,
73-
successRedirect: '/dashboard',
74-
failureRedirect: '/login',
75-
})
76-
);
77-
78-
app.get('/login', (req, res) => {
79-
res.json({
80-
success: false,
81-
logout: true,
82-
errorMsg: req.flash('error')
83-
});
84-
});
85-
86-
app.post('/register', async (req, res) => {
87-
88-
//If usernameCheck
89-
let usernameCheck = req.query.usernameCheck;
90-
if (usernameCheck) {
91-
let username = req.body.username;
92-
93-
if (username !== '') {
94-
await Users.findOne({username: username}, function (err, user) {
95-
if (err) {
96-
return res.json({
97-
success: false,
98-
error: true
99-
});
100-
}
101-
if (!user) {
102-
return res.json({
103-
success: true,
104-
});
105-
} else {
106-
return res.json({
107-
success: false,
108-
});
109-
}
110-
})
111-
}
112-
}
113-
114-
let name = req.body.name;
115-
let username = req.body.username;
116-
let password = req.body.password;
117-
118-
if (name && username && password) {
119-
120-
await Users.findOne({username: username}, async function (err, user) {
121-
if (err) {
122-
return res.json({
123-
success: false,
124-
error: true
125-
});
126-
}
127-
if (!user) {
128-
const salt = bcrypt.genSaltSync(10);
129-
const user = new Users({
130-
name: name,
131-
username: username,
132-
password: bcrypt.hashSync(password, salt)
133-
});
134-
135-
user.save(function (err, fluffy) {
136-
if (err) return console.error(err);
137-
});
138-
return res.json({
139-
success: true,
140-
});
141-
} else {
142-
return res.json({
143-
success: false,
144-
});
145-
}
146-
});
147-
}
148-
});
149-
150-
app.get('/logout', function (req, res) {
151-
req.logout();
152-
res.redirect('/login');
153-
});
154-
155-
app.get('/dashboard', authenticationMiddleware(), (req, res) => {
156-
return res.json({
157-
success: true,
158-
username: req.session.passport.user.username,
159-
successMsg: req.flash('success')
160-
});
161-
});
162-
163-
let httpServer;
30+
/**
31+
* Configure http(s)Server
32+
*/
16433
if (srvConfig.HTTPS_ENABLED) {
16534
const privateKey = fs.readFileSync(srvConfig.PRIVATE_KEY_PATH, 'utf8');
16635
const certificate = fs.readFileSync(srvConfig.CERTIFICATE_PATH, 'utf8');
@@ -173,8 +42,11 @@ if (srvConfig.HTTPS_ENABLED) {
17342
httpServer = http.createServer({}, app);
17443
}
17544

45+
/**
46+
* Start http server & connect to MongoDB
47+
*/
17648
httpServer.listen(srvConfig.SERVER_PORT, () => {
177-
mongoose.connect(`mongodb+srv://${srvConfig.DB_USERNAME}:${srvConfig.DB_PASSWORD}@${srvConfig.DB_HOST}/${srvConfig.DB_NAME}${srvConfig.DB_QUERY_PARAMS}`, {
49+
mongoose.connect(`${CONNECTION_TYPE}://${dbAuthString}${DB_HOST}:${DB_PORT}/${DB_NAME}${DB_QUERY_PARAMS}`, {
17850
useNewUrlParser: true,
17951
useUnifiedTopology: true
18052
}, () => {
@@ -183,7 +55,7 @@ httpServer.listen(srvConfig.SERVER_PORT, () => {
18355
});
18456

18557
/**
186-
* Socket.IO section
58+
* Socket.io section
18759
*/
18860
const io = require('socket.io')(httpServer);
18961
io.on('connection', function (socket) {

0 commit comments

Comments
 (0)