Skip to content

Commit

Permalink
Merge pull request #16 from andela/ft-signin-signup-#166240818
Browse files Browse the repository at this point in the history
#166240818 send the token to the user
  • Loading branch information
MemunaHaruna committed Jun 12, 2019
2 parents a532caa + 258b909 commit db9436e
Show file tree
Hide file tree
Showing 22 changed files with 386 additions and 161 deletions.
3 changes: 2 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ PORT=theServerListeningPort
DEV_DB_URL=TheDevDatabaseConnectionUrl__Format:postgres://user:pass@host:5432/development_dbname
TEST_DB_URL=TheTestDatabaseConnectionUrl__Format:postgres://user:pass@host:5432/test_dbname
DB_URL=TheStaggingDatabaseConnectionUrl__Format:postgres://user:pass@host:5432/dbname
DB_URL=TheProductionDatabaseConnectionUrl__Format:postgres://user:pass@host:5432/dbname
DB_URL=TheProductionDatabaseConnectionUrl__Format:postgres://user:pass@host:5432/dbname
TOKEN_KEY=TheTokenKey
17 changes: 11 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"main": "index.js",
"scripts": {
"start": "babel-node src/index.js",
"test": "NODE_ENV=test nyc --reporter=html --reporter=text --reporter=lcov ./node_modules/.bin/mocha ./test/* --require @babel/register --exit",
"test": "NODE_ENV=test nyc --reporter=html --reporter=text --reporter=lcov ./node_modules/.bin/mocha --exclude src/index.js ./test/* --require @babel/register --exit",
"dev": "nodemon --exec babel-node src/index.js",
"coverage": "nyc report --reporter=text-lcov | coveralls"
},
Expand All @@ -21,18 +21,20 @@
"nyc": "^14.1.1"
},
"dependencies": {
"babel-plugin-istanbul": "^5.1.2",
"@babel/cli": "^7.4.4",
"@babel/core": "^7.4.5",
"@babel/node": "^7.4.5",
"@babel/preset-env": "^7.4.5",
"@babel/register": "^7.4.4",
"babel-plugin-istanbul": "^5.1.2",
"babel-polyfill": "^6.26.0",
"bcrypt": "^3.0.6",
"body-parser": "^1.18.3",
"chai-http": "^4.3.0",
"cors": "^2.8.5",
"dotenv": "^8.0.0",
"expect": "^24.8.0",
"express": "^4.16.4",
"jsonwebtoken": "^8.5.1",
"morgan": "^1.9.1",
"pg": "^7.11.0",
"sequelize": "^5.8.7",
Expand All @@ -42,10 +44,13 @@
"nyc": {
"per-file": true,
"check-coverage": true,
"branches": 50,
"branches": 80,
"lines": 80,
"functions": 80,
"statements": 80
"functions": 100,
"statements": 80,
"exclude": [
"src/index.js"
]
},
"author": "Andela Simulations Programme",
"license": "MIT"
Expand Down
66 changes: 66 additions & 0 deletions src/api/controllers/authController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import bcrypt, { hashSync, genSaltSync } from 'bcrypt';
import models from '../models/index';
import generateToken from '../../helpers/tokens/generate.token';
import sendResult from '../../helpers/results/send.auth';

const { User } = models;

/**
* containing all user's model controllers (signup, login)
*
* @export
* @class Auth
*/
export default class Auth {
/**
* register a new user
*
* @static
* @param {*} req the request
* @param {*} res the response to be sent
* @memberof Auth
* @returns {Object} res
*/
static async signup(req, res) {
const { username, email, password } = req.body;
const salt = genSaltSync(parseFloat(process.env.BCRYPT_HASH_ROUNDS) || 10);
const hashedPassword = hashSync(password, salt);
const user = await User.create({
username,
email,
password: hashedPassword,
});
const tokenData = { username, email };
const token = generateToken(tokenData, process.env.TOKEN_KEY);
return sendResult(res, 201, 'user created successfully', user, token);
}

/**
*login an existing user
*
* @static
* @param {*} req the request
* @param {*} res the response to be sent
* @memberof Auth
* @returns {Object} res
*/
static login(req, res) {
const { email, password } = req.body;
User.findByEmail(email).then((user) => {
if (user) {
const isPasswordValid = bcrypt.compareSync(password, user.dataValues.password);
if (isPasswordValid) {
const tokenData = { username: user.dataValues.username, email };
const token = generateToken(tokenData, process.env.TOKEN_KEY);
return sendResult(res, 200, 'user logged in successfully', user, token);
}
return res.status(401).json({
message: 'password is incorrect'
});
}
return res.status(404).json({
message: 'user doesn\'t exist'
});
});
}
}
25 changes: 0 additions & 25 deletions src/api/controllers/db.test.js

This file was deleted.

11 changes: 3 additions & 8 deletions src/api/models/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

import Sequelize from 'sequelize';
import environments from '../../configs/environnements';
import environments from '../../configs/environments';

const env = environments.currentEnv;

Expand All @@ -9,15 +9,10 @@ const sequelize = new Sequelize(env.dbUrl, {
});

const models = {
Test: sequelize.import('./test')
User: sequelize.import('./user'),
Token: sequelize.import('./token'),
};

Object.keys(models).forEach((key) => {
if ('associate' in models[key]) {
models[key].associate(models);
}
});

export { sequelize };

export default models;
9 changes: 0 additions & 9 deletions src/api/models/test.js

This file was deleted.

10 changes: 10 additions & 0 deletions src/api/models/token.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const token = (sequelize, DataTypes) => {
const Token = sequelize.define('Tokens', {
data: {
type: DataTypes.TEXT,
}
});
return Token;
};

export default token;
29 changes: 29 additions & 0 deletions src/api/models/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const user = (sequelize, DataTypes) => {
const User = sequelize.define('Users', {
username: {
type: DataTypes.STRING,
},
email: {
type: DataTypes.STRING,
},
password: {
type: DataTypes.STRING,
},
verified: {
type: DataTypes.BOOLEAN,
defaultValue: true
}
});

User.findByEmail = (email) => {
const queryResult = User.findOne({
where: { email },
});

return queryResult;
};

return User;
};

export default user;
10 changes: 10 additions & 0 deletions src/api/routes/authRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Router } from 'express';
import authController from '../controllers/authController';

const authRouter = Router();

authRouter.post('/signup', authController.signup);
authRouter.post('/login', authController.login);


export default authRouter;
12 changes: 0 additions & 12 deletions src/api/routes/db.test.js

This file was deleted.

8 changes: 4 additions & 4 deletions src/api/routes/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import express from 'express';
import dbTestRouter from './db.test';
import authRouter from './authRouter';

const v2router = express();
const router = express();

v2router.use('/dbTest', dbTestRouter);
router.use('/auth', authRouter);

export default v2router;
export default router;
13 changes: 9 additions & 4 deletions src/configs/environnements.js → src/configs/environments.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,32 @@ dotenv.config();

const port = process.env.PORT || 3000;
const env = process.env.NODE_ENV;
const jwtSecret = process.env.TOKEN_KEY;

const environnements = [
{
name: 'test',
port,
dbUrl: process.env.TEST_DB_URL
dbUrl: process.env.TEST_DB_URL,
secret: jwtSecret,
},
{
name: 'development',
port,
dbUrl: process.env.DEV_DB_URL
dbUrl: process.env.DEV_DB_URL,
secret: jwtSecret,
},
{
name: 'production',
port,
dbUrl: process.env.DB_URL
dbUrl: process.env.DB_URL,
secret: jwtSecret,
},
{
name: 'stagging',
port,
dbUrl: process.env.DB_URL
dbUrl: process.env.DB_URL,
secret: jwtSecret,
}
];

Expand Down
44 changes: 42 additions & 2 deletions src/docs/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
"Author": "Savage Ranges"
}
},
"host": "bah-staging.herokuapp.com",
"host": "savage-rangers-ah-staging.herokuapp.com",
"basePath": "/api",
"schemes": [
"https",
"http"
],
"paths": {
"/users": {
"/auth/signup": {
"post": {
"tags": [
"Users"
Expand Down Expand Up @@ -55,6 +55,46 @@
}
}
}
},
"/auth/login": {
"post": {
"tags": [
"Users"
],
"summary": "login existing user",
"description": "",
"produces": [
"application/json"
],
"consumes": [
"application/json"
],
"parameters": [
{
"in": "body",
"name": "body",
"description": "login existing user",
"required": true,
"schema": {
"$ref": "#/definitions/signup"
}
}
],
"responses": {
"200": {
"description": "User loged in correctly"
},
"400": {
"description": "Invalid entries"
},
"401": {
"description": "Invalid entries"
},
"default": {
"description": "Something went wrong"
}
}
}
}
},
"externalDocs": {
Expand Down
10 changes: 10 additions & 0 deletions src/helpers/results/send.auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
const sendResult = (res, status, message, user, token) => res.status(status).json({
message,
user: {
email: user.email,
token,
username: user.username
}
});

export default sendResult;
Loading

0 comments on commit db9436e

Please sign in to comment.