Skip to content

Commit

Permalink
feature(login): integrate feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
victor-abz committed Dec 19, 2019
1 parent c15fdb3 commit 8be6cbd
Show file tree
Hide file tree
Showing 18 changed files with 109 additions and 131 deletions.
23 changes: 10 additions & 13 deletions .env-sample
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
# N.B: When writting the below credentials ommit the curl braces.

DbUrl=postgres://{POSTGRES_USER}:{your-user-password}@{HOST}:{PORT}/{DB}
PostgresUser={your-user-name}
PostgresPassword={your-user-password}
PostgresDb={database}

# Coverall settings
RepoToken=repo token_for_coveralls
# Database settings
DB_URL=postgres://{postgres-user}:{user-password}@{host}:{port}/{database}
POSTGRES_USER={postgres-user}
POSTGRES_PASSWORD={user-password}
POSTGRES_DB={database}
REPO_TOKEN={token}

# bcrypt settings
SaltRounds=6
SALT_ROUNDS={salt-rounds}

# jwt settings
SecretKey=secrete-man
TokenExpireTime=24h
SECRET_KEY={your-secret}
TOKEN_EXPIRE_TIME={time}

# for swagger
BaseUrl=localhost:3000
BASE_URL={host-and-port}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"dev": "nodemon --exec babel-node src/server.js",
"coverage": "nyc report --reporter=text-lcov | coveralls",
"pretest": "npm run migrate:drop && npm run migrate:up",
"test": "export NODE_ENV=test && nyc --reporter=html --reporter=text mocha --require @babel/register src/tests/**/*.js --timeout 100000 --exit",
"test": "export NODE_ENV=test && nyc --reporter=html --reporter=text mocha --require @babel/register src/tests/**/*.test.js --timeout 100000 --exit",
"migrate:up": "npx sequelize-cli db:migrate"
},
"repository": {
Expand Down
6 changes: 4 additions & 2 deletions src/app.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@

import express from 'express';
import auth from './routes/auth.route';
import protect from './routes/index';
import morgan from 'morgan';
import auth from './routes/auth/auth.route';
import protect from './routes/protected.route';

const app = express();
app.use(morgan('dev'));

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
Expand Down
6 changes: 3 additions & 3 deletions src/config/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import { config } from 'dotenv';
config();

export const development = {
url: process.env.DbUrl,
url: process.env.DB_URL,
dialect: 'postgres',
logging: false
};
export const test = {
url: process.env.DbUrl,
url: process.env.DB_URL,
dialect: 'postgres',
logging: false
};
export const production = {
url: process.env.DbUrl,
url: process.env.DB_URL,
dialect: 'postgres',
logging: false
};
20 changes: 10 additions & 10 deletions src/controllers/login.controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Response from '../services/response';
import UserHandler from '../services/login.service';
import ResponseService from '../services/response.service';
import UserService from '../services/user.service';
import BcryptService from '../services/bcrypt.service';
import AuthHandler from '../services/jwt.service';
import JwtService from '../services/jwt.service';

/**
*
Expand All @@ -18,11 +18,11 @@ class loginHandler {
* @returns {token} @memberof loginHandler
*/
static async login(req, res) {
const user = await UserHandler.getByEmail(req.body);
const user = await UserService.findByEmail(req.body.email.trim());
const verifyPassword = BcryptService.verifyPassword(req.body.password, user.password);
if (!verifyPassword) {
Response.setError(401, 'Authentication failed. Wrong Email or Password.');
return Response.send(res);
ResponseService.setError(401, 'Authentication failed. Wrong Email or Password.');
return ResponseService.send(res);
}

const payload = {
Expand All @@ -31,10 +31,10 @@ class loginHandler {
firstName: user.firstName,
lastName: user.lastName
};
const token = AuthHandler.generateToken(payload);
await UserHandler.updateToken(user, token);
Response.setSuccess(200, 'Successfully logged in.. redirecting', token);
Response.send(res);
const token = JwtService.generateToken(payload);
await UserService.updateToken(user, token);
ResponseService.setSuccess(200, 'Successfully logged in.. redirecting', token);
ResponseService.send(res);
}
}

Expand Down
18 changes: 9 additions & 9 deletions src/controllers/signup.controller.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import SignupService from '../services/signup.service';
import UserService from '../services/user.service';
import BcryptService from '../services/bcrypt.service';
import Response from '../services/response';
import ResponseService from '../services/response.service';

/**
* @exports
Expand All @@ -12,31 +12,31 @@ class UsersController {
* @static
* @description POST /api/v1/signUp
* @param {object} req request object
* @param {object} res response object
* @param {object} res ResponseService object
* @memberof UsersController
* @returns {object} data
*/
static async signUp(req, res) {
const userExist = await SignupService.findByEmail(req.body.email.trim());
const userExist = await UserService.findByEmail(req.body.email.trim());
if (!userExist) {
const userInput = {
firstName: req.body.firstName.trim(),
lastName: req.body.lastName.trim(),
email: req.body.email.trim(),
password: BcryptService.hashPassword(req.body.password.trim())
};
const createdUser = await SignupService.addUser(userInput);
const createdUser = await UserService.addUser(userInput);
const {
id, firstName, lastName, email, role, isVerified
} = createdUser;
const data = {
id, firstName, lastName, email, role, isVerified
};
Response.setSuccess(201, 'User created successfully', data);
return Response.send(res);
ResponseService.setSuccess(201, 'User created successfully', data);
return ResponseService.send(res);
}
Response.setError(409, `${req.body.email.trim()} already exist`);
return Response.send(res);
ResponseService.setError(409, `${req.body.email.trim()} already exist`);
return ResponseService.send(res);
}
}

Expand Down
36 changes: 18 additions & 18 deletions src/middlewares/login.middleware.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import Response from '../services/response';
import UserService from '../services/login.service';
import AuthHandler from '../services/jwt.service';
import ResponseService from '../services/response.service';
import UserService from '../services/user.service';
import JwtService from '../services/jwt.service';

const authValidation = {
const loginMiddleware = {
userExist: async (req, res, next) => {
const user = await UserService.getByEmail(req.body);
const user = await UserService.findByEmail(req.body.email.trim());
if (!user) {
Response.setError(401, 'You don\'t have an account. Please create an account');
return Response.send(res);
ResponseService.setError(401, 'You don\'t have an account. Please create an account');
return ResponseService.send(res);
}
next();
},
isAccountActive: async (req, res, next) => {
const user = await UserService.getByEmail(req.body);
const user = await UserService.findByEmail(req.body.email.trim());
if (!user.isVerified) {
Response.setError(400, 'You have not activated your account. Please activate your account first');
return Response.send(res);
ResponseService.setError(400, 'You have not activated your account. Please activate your account first');
return ResponseService.send(res);
}
next();
},
Expand All @@ -28,25 +28,25 @@ const authValidation = {
// Remove Bearer from string
token = token.slice(7, token.length);
}
const { name } = AuthHandler.verifyToken(token);
const { name } = JwtService.verifyToken(token);
if (name === 'JsonWebTokenError') {
Response.setError(401, 'Unauthorized access. Invalid token');
return Response.send(res);
ResponseService.setError(401, 'Unauthorized access. Invalid token');
return ResponseService.send(res);
}
// Check if User has signed out and we blocked the token
const user = await UserService.findByToken({ token });
if (!user) {
Response.setError(401, 'Unauthorized access. Invalid token for this user');
return Response.send(res);
ResponseService.setError(401, 'Unauthorized access. Invalid token for this user');
return ResponseService.send(res);
}
req.userData = user.dataValues;
next();
} else {
Response.setError(401, 'No Token supplied');
return Response.send(res);
ResponseService.setError(401, 'No Token supplied');
return ResponseService.send(res);
}
}
};


export default authValidation;
export default loginMiddleware;
14 changes: 14 additions & 0 deletions src/routes/auth/auth.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import express from 'express';
import UsersController from '../../controllers/signup.controller';
import loginHandler from '../../controllers/login.controller';
import loginMiddleware from '../../middlewares/login.middleware';
import { signupValidator, loginValidator } from '../../validations/auth.validation';

const { userExist, isAccountActive } = loginMiddleware;

const router = express.Router();

router.post('/signup', signupValidator, UsersController.signUp); // API route for user to signup
router.post('/login', loginValidator, userExist, isAccountActive, loginHandler.login); // API route for user to login

export default router;
14 changes: 0 additions & 14 deletions src/routes/auth.route.js → src/routes/auth/docs.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
import express from 'express';
import UsersController from '../controllers/signup.controller';
import loginHandler from '../controllers/login.controller';
import authValidation from '../middlewares/login.middleware';
import { signupValidator, loginValidator } from '../validations/auth.validation';

const { userExist, isAccountActive } = authValidation;

const router = express.Router();

router.post('/signup', signupValidator, UsersController.signUp); // API route for user to signup
router.post('/login', loginValidator, userExist, isAccountActive, loginHandler.login); // API route for user to login
/**
* @swagger
* definitions:
Expand Down Expand Up @@ -116,5 +104,3 @@ router.post('/login', loginValidator, userExist, isAccountActive, loginHandler.l
* '401':
* description: Incorrect credentials.
*/

export default router;
4 changes: 2 additions & 2 deletions src/routes/index.js → src/routes/protected.route.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import express from 'express';
import authValidation from '../middlewares/login.middleware';
import loginMiddleware from '../middlewares/login.middleware';

const { isloggedIn } = authValidation;
const { isloggedIn } = loginMiddleware;

const app = express.Router();
app.get('/protected', isloggedIn, (req, res) => {
Expand Down
2 changes: 1 addition & 1 deletion src/services/bcrypt.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class BcryptService {
* @returns {object} hash
*/
static hashPassword(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(Number(process.env.SaltRounds)));
return bcrypt.hashSync(password, bcrypt.genSaltSync(Number(process.env.SALT_ROUNDS)));
}

/**
Expand Down
10 changes: 5 additions & 5 deletions src/services/jwt.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import jwt from 'jsonwebtoken';
* Verify token
* @class AuthHandler
*/
class AuthHandler {
class JwtService {
/**
*
*
Expand All @@ -14,8 +14,8 @@ class AuthHandler {
*/
static generateToken(data) {
const token = jwt.sign(
data, process.env.SecretKey,
{ expiresIn: process.env.TokenExpireTime }
data, process.env.SECRET_KEY,
{ expiresIn: process.env.TOKEN_EXPIRE_TIME }
);
return token;
}
Expand All @@ -26,7 +26,7 @@ class AuthHandler {
*/
static verifyToken(token) {
return jwt.verify(
token, process.env.SecretKey,
token, process.env.SECRET_KEY,
(err, decoded) => {
if (err) {
return err;
Expand All @@ -36,4 +36,4 @@ class AuthHandler {
);
}
}
export default AuthHandler;
export default JwtService;
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @export
* @class Response
*/
export default class Response {
export default class ResponseService {
/**
*
* @param {statusCode} statusCode
Expand Down
33 changes: 0 additions & 33 deletions src/services/signup.service.js

This file was deleted.

Loading

0 comments on commit 8be6cbd

Please sign in to comment.