Skip to content

Commit fb08d43

Browse files
author
ddnguyen
committed
Add controllers, update routes, middleware, change circle ci, update test
1 parent fa11d72 commit fb08d43

File tree

21 files changed

+660
-118
lines changed

21 files changed

+660
-118
lines changed

index.js

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import helmet from 'helmet';
55
import morgan from 'morgan';
66
import { join } from 'path';
77
import rfs from 'rotating-file-stream';
8-
import session from 'express-session';
9-
import errorHandler from 'errorhandler';
108
import dotenv from 'dotenv';
119
import logger from './src/logger/logger';
1210
import connectDatabase from './src/configs/db.config';
@@ -16,6 +14,7 @@ dotenv.config();
1614

1715
// configure isProduction variable
1816
const isProduction = process.env.NODE_ENV === 'production';
17+
const port = process.env.PORT || 3000;
1918

2019
// defining the Express app
2120
const app = express();
@@ -38,19 +37,12 @@ const accessLogStream = rfs('access.log', {
3837
// adding morgan to log HTTP requests
3938
app.use(morgan('combined', { stream: accessLogStream }));
4039

41-
// configure session
42-
app.use(session({
43-
secret: 'vedgno',
44-
cookie: { maxAge: 60000 },
45-
resave: false,
46-
saveUninitialized: false,
47-
}));
48-
4940
// connect to mongo
5041
connectDatabase();
5142

5243
if (!isProduction) {
53-
app.use(errorHandler());
44+
// eslint-disable-next-line global-require
45+
app.use(require('errorhandler')());
5446
}
5547

5648
app.get('/', (req, res) => {
@@ -92,8 +84,8 @@ app.use((err, req, res) => {
9284
});
9385

9486
// starting the server
95-
app.listen(3001, () => {
96-
logger.info('listening on port 3001');
87+
app.listen(port, () => {
88+
logger.info(`listening on port ${port}`);
9789
});
9890

9991
// Export our app for testing purposes

package-lock.json

Lines changed: 28 additions & 63 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
"errorhandler": "^1.5.1",
1313
"express": "^4.17.1",
1414
"express-jwt": "^5.3.1",
15-
"express-session": "^1.17.0",
1615
"helmet": "^3.21.1",
1716
"jsonwebtoken": "^8.5.1",
18-
"mongoose": "^5.7.5",
17+
"mongoose": "^5.7.13",
1918
"morgan": "^1.9.1",
2019
"rotating-file-stream": "^1.4.4",
20+
"sinon-test": "^2.4.1",
2121
"validator": "^12.0.0"
2222
},
2323
"devDependencies": {
@@ -46,10 +46,10 @@
4646
"scripts": {
4747
"start": "node index.js",
4848
"start-local": "nodemon --exec babel-node ./index.js",
49-
"prod": "node dist/api.bundle.js",
49+
"prod": "node dist/api.bundle.js env NODE_ENV=production",
5050
"build": "webpack",
51-
"test": "nyc --reporter=text mocha --require @babel/register ./src/tests/**/*.test.js --exit",
52-
"test-debug": "nyc --reporter=text mocha --require @babel/register ./src/tests/**/*.test.js --exit --inspect-brk",
51+
"test": "nyc --reporter=text mocha --require @babel/register ./src/tests/**/**/*.test.js --exit",
52+
"test-debug": "nyc --reporter=text mocha --require @babel/register ./src/tests/**/**/*.test.js --exit --inspect-brk",
5353
"coverage": "nyc report --reporter=text-lcov | coveralls",
5454
"eslint:win": "eslint.cmd ./",
5555
"eslint-fix:win": "eslint.cmd ./ --fix",

src/configs/db.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ const connectDatabase = () => {
88
mongoose
99
.connect(`mongodb://${process.env.MONGO_HOST}:${process.env.MONGO_PORT}/${process.env.MONGO_DB}`, {
1010
useNewUrlParser: true,
11+
useUnifiedTopology: true,
12+
useCreateIndex: true,
13+
useFindAndModify: false,
1114
})
1215
.then(() => {
1316
logger.info('Successfully connected to the database');

src/controllers/auth.controller.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import AuthService from '../services/auth.service';
2+
3+
const AuthController = {};
4+
5+
AuthController.login = async (req, res) => {
6+
try {
7+
const { email, password } = req.body;
8+
const userData = await AuthService.login({
9+
email,
10+
password,
11+
});
12+
return res.status(200).json({ status: 200, data: userData, message: 'Succesfully logged in' });
13+
} catch (error) {
14+
return res.status(400).json({ status: 400, message: error.message });
15+
}
16+
};
17+
18+
AuthController.register = async (req, res) => {
19+
try {
20+
const { email, fullName, password } = req.body;
21+
const userData = await AuthService.register({
22+
email,
23+
fullName,
24+
password,
25+
});
26+
return res.status(200).json({ status: 200, data: userData, message: 'Succesfully registered' });
27+
} catch (error) {
28+
return res.status(400).json({ status: 400, message: error.message });
29+
}
30+
};
31+
32+
AuthController.getCurrent = async (req, res) => res
33+
.status(200)
34+
.json({ status: 200, data: { email: req.user.email, fullName: req.user.fullName } });
35+
36+
AuthController.logout = async (req, res) => {
37+
try {
38+
AuthService.logout({
39+
user: req.user,
40+
foundToken: req.token,
41+
});
42+
res.send();
43+
} catch (error) {
44+
res.status(500).send(error);
45+
}
46+
};
47+
48+
AuthController.logoutAll = async (req, res) => {
49+
try {
50+
AuthService.logoutAll({
51+
user: req.user,
52+
});
53+
res.send();
54+
} catch (error) {
55+
res.status(500).send(error);
56+
}
57+
};
58+
59+
export default AuthController;

src/middlewares/auth.middleware.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import jwt from 'jsonwebtoken';
2+
import UserModel from '../models/user.model';
3+
import logger from '../logger/logger';
4+
5+
/* istanbul ignore next */
6+
const auth = async (req, res, next) => {
7+
const token = req.header('Authorization').replace('Bearer ', '');
8+
const data = jwt.verify(token, process.env.JWT_KEY);
9+
logger.info(`Verified token: ${token}`);
10+
try {
11+
// eslint-disable-next-line no-underscore-dangle
12+
const user = await UserModel.findOne({ _id: data._id, 'tokens.token': token });
13+
if (!user) {
14+
throw new Error();
15+
}
16+
req.user = user;
17+
req.token = token;
18+
next();
19+
} catch (error) {
20+
res.status(401).send({ error: 'Not authorized to access this resource' });
21+
}
22+
};
23+
24+
export default auth;

src/models/user.model.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
/* eslint-disable no-use-before-define */
2+
/* eslint-disable no-underscore-dangle */
13
import mongoose from 'mongoose';
24
import bcrypt from 'bcryptjs';
35
import jwt from 'jsonwebtoken';
@@ -56,18 +58,25 @@ UserSchema.pre('save', async function hashPassword(next) {
5658
UserSchema.methods.generateAuthToken = async function generateAuthToken() {
5759
// Generate an auth token for the user
5860
const user = this;
59-
// eslint-disable-next-line no-underscore-dangle
6061
const token = jwt.sign({ _id: user._id }, process.env.JWT_KEY);
61-
user.tokens = user.tokens.concat({ token });
62-
await user.save();
62+
await UserModel.findByIdAndUpdate(user._id, { $set: { tokens: user.tokens.concat({ token }) } });
6363
return token;
6464
};
6565

66+
// This hook is already tested, just cannot create an individual tests for it
67+
/* istanbul ignore next */
68+
UserSchema.statics.removeAllTokens = async function removeAllTokens(userId) {
69+
try {
70+
await UserModel.findByIdAndUpdate(userId, { $set: { tokens: [] } });
71+
} catch (error) {
72+
throw new Error('Removing tokens failed!');
73+
}
74+
};
75+
6676
// This hook is already tested, just cannot create an individual tests for it
6777
/* istanbul ignore next */
6878
UserSchema.statics.findByCredentials = async function findByCredentials(email, password) {
6979
// Search for a user by email and password.
70-
// eslint-disable-next-line no-use-before-define
7180
const user = await UserModel.findOne({ email });
7281
if (!user) {
7382
throw new Error('Login failed! Check authentication credentials');

0 commit comments

Comments
 (0)