Skip to content

Commit a6a3094

Browse files
author
wayne-th
committed
modify
1 parent 86118d3 commit a6a3094

20 files changed

+1106
-184
lines changed

config/express.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ var config = require('./config'),
44
compress = require('compression'),
55
bodyParser = require('body-parser'),
66
methodOverride = require('method-override')
7-
passport = require('passport');
7+
passport = require('passport'),
8+
helmet = require('helmet'),
9+
cors = require('cors'),
10+
ApiRoutes = require('./routes');
811

912
module.exports = function () {
1013
var app = express();
@@ -29,9 +32,13 @@ module.exports = function () {
2932

3033
app.use(passport.initialize());
3134
app.use(passport.session());
35+
app.use(helmet());
36+
app.use(cors());
3237

33-
require('../app/routes/index.routes.js') (app);
34-
require('../app/routes/users.routes.js') (app);
38+
app.use('/api', ApiRoutes);
39+
40+
// require('../app/routes/index.routes.js') (app);
41+
// require('../app/routes/users.routes.js') (app);
3542

3643
app.use(express.static('./public'));
3744

config/mongoose.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,24 @@ var config = require('./config'),
22
mongoose = require('mongoose');
33

44
module.exports = function() {
5-
var db = mongoose.connect(config.db);
5+
// Remove the warning with Promise
6+
mongoose.Promise = global.Promise;
7+
8+
// If debug run the mongoose debug options
9+
mongoose.set('debug', process.env.MONGOOSE_DEBUG);
10+
11+
// Connect the db with the url provide
12+
try {
13+
var db = mongoose.connect(config.db);
14+
} catch (err) {
15+
var db = mongoose.createConnection(config.db);
16+
}
17+
18+
mongoose.connection
19+
.once('open', () => console.log('MongoDB Running'))
20+
.on('error', e => {
21+
throw e;
22+
});
623

724
require('../models/user.models');
825

config/passport.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ module.exports = function() {
1717
});
1818

1919
require('./strategies/local.js')();
20+
require('./strategies/jwt.js')();
2021
}

config/strategies/jwt.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
var passport = require('passport'),
2+
User = require('mongoose').model('User');
3+
4+
import { Strategy as JWTStrategy, ExtractJwt } from 'passport-jwt';
5+
6+
7+
/**
8+
* JWT Strategy Auth
9+
*/
10+
const jwtOpts = {
11+
// Telling Passport to check authorization headers for JWT
12+
jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('JWT'),
13+
// Telling Passport where to find the secret
14+
secretOrKey: constants.JWT_SECRET,
15+
};
16+
17+
module.exports = function() {
18+
passport.use(new JWTStrategy(jwtOpts, function(payload, done){
19+
User.findById(payload._id , function(err, user) {
20+
if (err) {
21+
return done(err, false);
22+
}
23+
24+
if (!user) {
25+
return done(null, false);
26+
}
27+
28+
return done(null, user);
29+
});
30+
}));
31+
};

config/strategies/local.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var passport = require('passport'),
33
User = require('mongoose').model('User');
44

55
module.exports = function() {
6-
passport.use(new LocalStrategy(function(username, password, done){
6+
passport.use(new LocalStrategy({ usernameField: 'email' }, function(username, password, done){
77
User.findOne({
88
username: username
99
}, function(err, user) {

controllers/auth.controller.js

Lines changed: 104 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,109 @@
1-
var User = require('mongoose').model('User'),
2-
passport = require('passport');
1+
import User from '../models/user.model';
32

4-
var getErrorMessage = function(err) {
5-
var message = '';
6-
7-
if (err.code) {
8-
switch (err.code) {
9-
case 11000:
10-
case 11001:
11-
message = 'Username already exists';
12-
break;
13-
default:
14-
message = 'Something went wrong';
15-
}
16-
} else {
17-
for (var errName in err.errors) {
18-
if (err.erros[errName].message)
19-
message = err.erros[errName].message;
20-
}
21-
}
22-
23-
return message;
3+
import HTTPStatus from 'http-status';
4+
import Joi from 'joi';
5+
6+
export const validation = {
7+
login: {
8+
body: {
9+
email: Joi.string()
10+
.email()
11+
.required(),
12+
password: Joi.string()
13+
.regex(/^[a-zA-Z0-9]{3,30}$/)
14+
.required(),
15+
},
16+
},
17+
create: {
18+
body: {
19+
email: Joi.string()
20+
.email()
21+
.required(),
22+
password: Joi.string()
23+
.min(6)
24+
.regex(/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/)
25+
.required(),
26+
username: Joi.string()
27+
.min(3)
28+
.max(20)
29+
.required(),
30+
},
31+
},
2432
};
2533

26-
exports.signup = function(req, res, next) {
27-
if (!req.user) {
28-
var user = new User(req.body);
29-
var message = null;
34+
35+
/**
36+
* @api {post} /users/login Login a user
37+
* @apiDescription Login a user
38+
* @apiName loginUser
39+
* @apiGroup User
40+
*
41+
* @apiParam (Body) {String} email User email.
42+
* @apiParam (Body) {String} password User password.
43+
*
44+
* @apiSuccess {Number} status Status of the Request.
45+
* @apiSuccess {String} _id User _id.
46+
* @apiSuccess {String} token Authentication token.
47+
*
48+
* @apiSuccessExample Success-Response:
49+
*
50+
* HTTP/1.1 200 OK
51+
*
52+
* {
53+
* _id: '123',
54+
* token: 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OTBhMWI3ODAzMDI3N2NiNjQxM2JhZGUiLCJpYXQiOjE0OTM4MzQ2MTZ9.RSlMF6RRwAALZQRdfKrOZWnuHBk-mQNnRcCLJsc8zio',
55+
* }
56+
*
57+
* @apiErrorExample {json} Error
58+
* HTTP/1.1 400 Bad Request
59+
*
60+
* {
61+
* email: 'email is required'
62+
* }
63+
*/
64+
65+
export async function login(req, res, next) {
66+
res.status(HTTPStatus.OK).json(req.user.toAuthJSON());
67+
68+
return next();
69+
}
3070

31-
user.save(function(err) {
32-
if (err) {
33-
var message = getErrorMessage(err);
34-
res.json(message);
35-
}
36-
})
71+
/**
72+
* @api {post} /users/signup Create a user
73+
* @apiDescription Create a user
74+
* @apiName createUser
75+
* @apiGroup User
76+
*
77+
* @apiParam (Body) {String} email User email.
78+
* @apiParam (Body) {String} password User password.
79+
* @apiParam (Body) {String} username User username.
80+
*
81+
* @apiSuccess {Number} status Status of the Request.
82+
* @apiSuccess {String} _id User _id.
83+
* @apiSuccess {String} token Authentication token.
84+
*
85+
* @apiSuccessExample Success-Response:
86+
*
87+
* HTTP/1.1 200 OK
88+
*
89+
* {
90+
* _id: '123',
91+
* token: 'JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OTBhMWI3ODAzMDI3N2NiNjQxM2JhZGUiLCJpYXQiOjE0OTM4MzQ2MTZ9.RSlMF6RRwAALZQRdfKrOZWnuHBk-mQNnRcCLJsc8zio',
92+
* }
93+
*
94+
* @apiErrorExample {json} Error
95+
* HTTP/1.1 400 Bad Request
96+
*
97+
* {
98+
* email: 'email is required'
99+
* }
100+
*/
101+
export async function create(req, res, next) {
102+
try {
103+
const user = await User.create(req.body);
104+
return res.status(HTTPStatus.CREATED).json(user.toAuthJSON());
105+
} catch (e) {
106+
e.status = HTTPStatus.BAD_REQUEST;
107+
return next(e);
37108
}
38-
}
109+
}

controllers/index.controller.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)