From df90c7b4f31a23eae4e1df94b9967a01043ed667 Mon Sep 17 00:00:00 2001 From: "Engr.Sunday" Date: Sun, 12 Aug 2018 15:07:05 +0100 Subject: [PATCH] Fixing could not get response for localhost --- src/config/config.js | 4 +-- src/config/express.js | 37 +++++++++++---------- src/config/passport.js | 26 +++++++-------- src/config/persistence/mongodb/connectdb.js | 14 ++++---- src/config/vars.js | 4 +-- src/controllers/auth.controller.js | 18 +++++----- src/controllers/user.controller.js | 24 ++++++------- src/middlewares/auth.js | 15 +++++---- src/middlewares/error.js | 17 +++++----- src/models/refreshToken.model.js | 9 +++-- src/models/user.model.js | 36 +++++++++++++------- src/routes/v1/auth.route.js | 21 +++++++----- src/routes/v1/index.js | 19 +++++------ src/routes/v1/user.route.js | 14 ++++---- src/server/index.js | 7 ++-- src/utils/APIError.js | 4 +-- src/validations/auth.validation.js | 4 +-- src/validations/user.validation.js | 7 ++-- 18 files changed, 148 insertions(+), 132 deletions(-) diff --git a/src/config/config.js b/src/config/config.js index 83b4e18..9a49f0b 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -1,4 +1,4 @@ -import convict from 'convict'; +const convict = require('convict'); // this loads the defined variables from .env require('dotenv').config(); @@ -152,4 +152,4 @@ const config = convict({ // throws error if config does not conform to schema config.validate({ allowed: 'strict' }); -export default config; +module.exports = config; diff --git a/src/config/express.js b/src/config/express.js index 223ddb7..238b46e 100644 --- a/src/config/express.js +++ b/src/config/express.js @@ -1,22 +1,25 @@ -import express from 'express'; -import morgan from 'morgan'; -import bodyParser from 'body-parser'; -import compress from 'compression'; -import methodOverride from 'method-override'; -import cors from 'cors'; -import helmet from 'helmet'; -import passport from 'passport'; - -import strategies from './passport'; -import routes from '../routes/v1'; -import { logs } from './vars'; -import config from '../config/config'; - -// Express instance +const express = require('express'); +const morgan = require('morgan'); +const bodyParser = require('body-parser'); +const compress = require('compression'); +const methodOverride = require('method-override'); +const cors = require('cors'); +const helmet = require('helmet'); +const passport = require('passport'); + +const routes = require('../routes/v1'); +const { logs } = require('./vars'); +const strategies = require('./passport'); +const error = require('../middlewares/error'); + +/** +* Express instance +* @public +*/ const app = express(); // request logging. dev: console | production: file -app.use(morgan(config.get('env'))); +app.use(morgan(logs)); // parse body params and attache them to req.body app.use(bodyParser.json()); @@ -53,4 +56,4 @@ app.use(error.notFound); // error handler, send stacktrace only during development app.use(error.handler); -export default app; +module.exports = app; diff --git a/src/config/passport.js b/src/config/passport.js index e75b690..e17440e 100644 --- a/src/config/passport.js +++ b/src/config/passport.js @@ -1,20 +1,20 @@ -import BearerStrategy from 'passport-http-bearer'; -import { ExtractJwt } from 'passport-jwt'; +const JwtStrategy = require('passport-jwt').Strategy; +const BearerStrategy = require('passport-http-bearer'); +const { ExtractJwt } = require('passport-jwt'); -import { jwtSecret } from './vars'; -import authProviders from '../services/authProviders'; -import User from '../models/user.model'; -import config from '../config/config'; +const { jwtSecret } = require('./vars'); +const authProviders = require('../services/authProviders'); +const User = require('../models/user.model'); +const config = require('../config/config'); -const JwtStrategy = require('passport-jwt').Strategy; -const getsecret = config.get('authentication.token.secret') + const getSecret = config.get('authentication.token.secret') const jwtOptions = { - secretOrKey: getsecret, + secretOrKey: getSecret, jwtFromRequest: ExtractJwt.fromAuthHeaderWithScheme('Bearer'), }; -const jwts = async (payload, done) => { +const jwt = async (payload, done) => { try { const user = await User.findById(payload.sub); if (user) return done(null, user); @@ -34,6 +34,6 @@ const oAuth = service => async (token, done) => { } }; -export const jwt = new JwtStrategy(jwtOptions, jwts); -export const facebook = new BearerStrategy(oAuth('facebook')); -export const google = new BearerStrategy(oAuth('google')); +exports.jwt = new JwtStrategy(jwtOptions, jwt); +exports.facebook = new BearerStrategy(oAuth('facebook')); +exports.google = new BearerStrategy(oAuth('google')); diff --git a/src/config/persistence/mongodb/connectdb.js b/src/config/persistence/mongodb/connectdb.js index a0176e3..2346103 100644 --- a/src/config/persistence/mongodb/connectdb.js +++ b/src/config/persistence/mongodb/connectdb.js @@ -2,28 +2,26 @@ import mongoose from 'mongoose'; const config = require('../../config'); -let dbURI = 'mongodb://kayak:kayak@kayakcluster-shard-00-00-j61pv.mongodb.net:27017,kayakcluster-shard-00-01-j61pv.mongodb.net:27017,kayakcluster-shard-00-02-j61pv.mongodb.net:27017/kayak?ssl=true&replicaSet=KayakCluster-shard-0&authSource=admin'; -if (process.env.NODE_ENV === 'production') { - dbURI = process.env.MONGOLAB_URI; -} let gracefulShutdown; +let db = `${config.get('mongo.host')}/${config.get('mongo.database')}`; +mongoose.Promise = global.Promise; // Connecting to Database - mongoose.connect(`${config.get('mongo.host')}/${config.get('mongo.database')}`); + mongoose.connect(db, { useNewUrlParser: true }); // Checking if connection to db was successful mongoose.connection.on('connected', () => { - console.log('Mongoose successfully connected to database URL: '+config.get('mongo.database')); + console.log('Mongoose successfully connected to database URL: '+db); }); mongoose.connection.on('error', (err) => { - console.error("Mongoose connection error occurred. Error: " + error); + console.error("Mongoose connection error occurred. Error: " + err); }); mongoose.connection.on('disconnected', () => { console.log("Mongoose connection lost..."); }); - +// // CAPTURE APP TERMINATION / RESTART EVENTS // To be called when process is restarted or terminated gracefulShutdown = function (msg, callback) { diff --git a/src/config/vars.js b/src/config/vars.js index bd4b854..29caa12 100644 --- a/src/config/vars.js +++ b/src/config/vars.js @@ -1,4 +1,4 @@ -import path from 'path'; +const path = require('path'); // import .env variables require('dotenv-safe').load({ @@ -8,7 +8,7 @@ require('dotenv-safe').load({ }); -export default { +module.exports = { env: process.env.NODE_ENV, port: process.env.PORT, jwtSecret: process.env.JWT_SECRET, diff --git a/src/controllers/auth.controller.js b/src/controllers/auth.controller.js index baa8a81..29d8e16 100644 --- a/src/controllers/auth.controller.js +++ b/src/controllers/auth.controller.js @@ -1,9 +1,9 @@ -import httpStatus from 'http-status'; -import moment from 'moment-timezone'; +const httpStatus = require('http-status'); +const moment = require('moment-timezone'); -import User from '../models/user.model'; -import RefreshToken from '../models/refreshToken.model'; -import { jwtExpirationInterval } from '../config/vars'; +const User = require('../models/user.model'); +const RefreshToken = require('../models/refreshToken.model'); +const { jwtExpirationInterval } = require('../config/vars'); /** * Returns a formated object with tokens @@ -22,7 +22,7 @@ function generateTokenResponse(user, accessToken) { * Returns jwt token if registration was successful * @public */ -export const register = async (req, res, next) => { +exports.register = async (req, res, next) => { try { const user = await (new User(req.body)).save(); const userTransformed = user.transform(); @@ -38,7 +38,7 @@ export const register = async (req, res, next) => { * Returns jwt token if valid username and password is provided * @public */ -export const login = async (req, res, next) => { +exports.login = async (req, res, next) => { try { const { user, accessToken } = await User.findAndGenerateToken(req.body); const token = generateTokenResponse(user, accessToken); @@ -54,7 +54,7 @@ export const login = async (req, res, next) => { * Returns jwt token * @public */ -export const oAuth = async (req, res, next) => { +exports.oAuth = async (req, res, next) => { try { const { user } = req; const accessToken = user.token(); @@ -70,7 +70,7 @@ export const oAuth = async (req, res, next) => { * Returns a new jwt when given a valid refresh token * @public */ -export const refresh = async (req, res, next) => { +exports.refresh = async (req, res, next) => { try { const { email, refreshToken } = req.body; const refreshObject = await RefreshToken.findOneAndRemove({ diff --git a/src/controllers/user.controller.js b/src/controllers/user.controller.js index 2889e5a..460c763 100644 --- a/src/controllers/user.controller.js +++ b/src/controllers/user.controller.js @@ -1,14 +1,14 @@ -import httpStatus from 'http-status'; -import { omit } from 'lodash'; +const httpStatus = require('http-status'); +const { omit } = require('lodash'); -import User from '../models/user.model'; -import { handler as errorHandler } from '../middlewares/error'; +const User = require('../models/user.model'); +const { handler: errorHandler } = require('../middlewares/error'); /** * Load user and append to req. * @public */ -export const load = async (req, res, next, id) => { +exports.load = async (req, res, next, id) => { try { const user = await User.get(id); req.locals = { user }; @@ -22,19 +22,19 @@ export const load = async (req, res, next, id) => { * Get user * @public */ -export const get = (req, res) => res.json(req.locals.user.transform()); +exports.get = (req, res) => res.json(req.locals.user.transform()); /** * Get logged in user info * @public */ -export const loggedIn = (req, res) => res.json(req.user.transform()); +exports.loggedIn = (req, res) => res.json(req.user.transform()); /** * Create new user * @public */ -export const create = async (req, res, next) => { +exports.create = async (req, res, next) => { try { const user = new User(req.body); const savedUser = await user.save(); @@ -49,7 +49,7 @@ export const create = async (req, res, next) => { * Replace existing user * @public */ -export const replace = async (req, res, next) => { +exports.replace = async (req, res, next) => { try { const { user } = req.locals; const newUser = new User(req.body); @@ -69,7 +69,7 @@ export const replace = async (req, res, next) => { * Update existing user * @public */ -export const update = (req, res, next) => { +exports.update = (req, res, next) => { const ommitRole = req.locals.user.role !== 'admin' ? 'role' : ''; const updatedUser = omit(req.body, ommitRole); const user = Object.assign(req.locals.user, updatedUser); @@ -83,7 +83,7 @@ export const update = (req, res, next) => { * Get user list * @public */ -export const list = async (req, res, next) => { +exports.list = async (req, res, next) => { try { const users = await User.list(req.query); const transformedUsers = users.map(user => user.transform()); @@ -97,7 +97,7 @@ export const list = async (req, res, next) => { * Delete user * @public */ -export const remove = (req, res, next) => { +exports.remove = (req, res, next) => { const { user } = req.locals; user.remove() diff --git a/src/middlewares/auth.js b/src/middlewares/auth.js index 888dea4..449afc9 100644 --- a/src/middlewares/auth.js +++ b/src/middlewares/auth.js @@ -1,11 +1,11 @@ -import httpStatus from 'http-status'; -import passport from 'passport'; +const httpStatus = require('http-status'); +const passport = require('passport'); const User = require('../models/user.model'); const APIError = require('../utils/APIError'); -export const ADMIN = 'admin'; -export const LOGGED_USER = '_loggedUser'; +const ADMIN = 'admin'; +const LOGGED_USER = '_loggedUser'; const handleJWT = (req, res, next, roles) => async (err, user, info) => { const error = err || info; @@ -42,11 +42,14 @@ const handleJWT = (req, res, next, roles) => async (err, user, info) => { return next(); }; -export const authorize = (roles = User.roles) => (req, res, next) => +exports.ADMIN = ADMIN; +exports.LOGGED_USER = LOGGED_USER; + +exports.authorize = (roles = User.roles) => (req, res, next) => passport.authenticate( 'jwt', { session: false }, handleJWT(req, res, next, roles), )(req, res, next); -export const oAuth = service => +exports.oAuth = service => passport.authenticate(service, { session: false }); diff --git a/src/middlewares/error.js b/src/middlewares/error.js index aea6d72..15f23aa 100644 --- a/src/middlewares/error.js +++ b/src/middlewares/error.js @@ -1,14 +1,14 @@ -import httpStatus from 'http-status'; -import expressValidation from 'express-validation'; +const httpStatus = require('http-status'); +const expressValidation = require('express-validation'); -import APIError from '../utils/APIError'; -import { env } from '../config/vars'; +const APIError = require('../utils/APIError'); +const { env } = require('../config/vars'); /** * Error handler. Send stacktrace only during development * @public */ -export const handler = (err, req, res, next) => { +const handler = (err, req, res, next) => { const response = { code: err.status, message: err.message || httpStatus[err.status], @@ -24,17 +24,18 @@ export const handler = (err, req, res, next) => { res.json(response); res.end(); }; +exports.handler = handler; /** * If error is not an instanceOf APIError, convert it. * @public */ -export const converter = (err, req, res, next) => { +exports.converter = (err, req, res, next) => { let convertedError = err; if (err instanceof expressValidation.ValidationError) { convertedError = new APIError({ - message: 'Error in validation', + message: 'Erro de Validação', errors: err.errors, status: err.status, stack: err.stack, @@ -54,7 +55,7 @@ export const converter = (err, req, res, next) => { * Catch 404 and forward to error handler * @public */ -export const notFound = (req, res, next) => { +exports.notFound = (req, res, next) => { const err = new APIError({ message: 'Not found', status: httpStatus.NOT_FOUND, diff --git a/src/models/refreshToken.model.js b/src/models/refreshToken.model.js index 2e94c86..08fc70b 100644 --- a/src/models/refreshToken.model.js +++ b/src/models/refreshToken.model.js @@ -1,6 +1,6 @@ -import mongoose from 'mongoose'; -import crypto from 'crypto'; -import moment from 'moment-timezone'; +const mongoose = require('mongoose'); +const crypto = require('crypto'); +const moment = require('moment-timezone'); /** * Refresh Token Schema @@ -51,5 +51,4 @@ refreshTokenSchema.statics = { * @typedef RefreshToken */ const RefreshToken = mongoose.model('RefreshToken', refreshTokenSchema); - -export default RefreshToken; +module.exports = RefreshToken; diff --git a/src/models/user.model.js b/src/models/user.model.js index 8214e94..ad1a9b5 100644 --- a/src/models/user.model.js +++ b/src/models/user.model.js @@ -1,13 +1,13 @@ -import mongoose from 'mongoose'; -import httpStatus from 'http-status'; -import { omitBy, isNil } from 'lodash'; -import bcrypt from 'bcryptjs'; -import moment from 'moment-timezone'; -import jwt from 'jwt-simple'; -import uuidv4 from 'uuid/v4'; +const mongoose = require('mongoose'); +const httpStatus = require('http-status'); +const { omitBy, isNil } = require('lodash'); +const bcrypt = require('bcryptjs'); +const moment = require('moment-timezone'); +const jwt = require('jwt-simple'); +const uuidv4 = require('uuid/v4'); -import APIError from '../utils/APIError'; -import { env, jwtSecret, jwtExpirationInterval } from '../config/vars'; +const APIError = require('../utils/APIError'); +const { env, jwtSecret, jwtExpirationInterval } = require('../config/vars'); /** * User Roles @@ -16,6 +16,7 @@ const roles = ['user', 'admin']; /** * User Schema + * @private */ const userSchema = new mongoose.Schema({ email: { @@ -114,6 +115,9 @@ userSchema.statics = { /** * Get user + * + * @param {ObjectId} id - The objectId of user. + * @returns {Promise} */ async get(id) { try { @@ -137,6 +141,9 @@ userSchema.statics = { /** * Find user by email and tries to generate a JWT token + * + * @param {ObjectId} id - The objectId of user. + * @returns {Promise} */ async findAndGenerateToken(options) { const { email, password, refreshObject } = options; @@ -166,6 +173,10 @@ userSchema.statics = { /** * List users in descending order of 'createdAt' timestamp. + * + * @param {number} skip - Number of users to be skipped. + * @param {number} limit - Limit number of users to be returned. + * @returns {Promise} */ list({ page = 1, perPage = 30, name, email, role, @@ -182,6 +193,9 @@ userSchema.statics = { /** * Return new validation error * if error is a mongoose duplicate key error + * + * @param {Error} error + * @returns {Error|APIError} */ checkDuplicateEmail(error) { if (error.name === 'MongoError' && error.code === 11000) { @@ -220,6 +234,4 @@ userSchema.statics = { /** * @typedef User */ -const User = mongoose.model('User', userSchema); - -export default User; \ No newline at end of file +module.exports = mongoose.model('User', userSchema); diff --git a/src/routes/v1/auth.route.js b/src/routes/v1/auth.route.js index e77fad1..14afb61 100644 --- a/src/routes/v1/auth.route.js +++ b/src/routes/v1/auth.route.js @@ -1,15 +1,15 @@ -import express from 'express'; -import validate from 'express-validation'; +const express = require('express'); +const validate = require('express-validation'); -import controller from '../../controllers/auth.controller'; -import { +const controller = require('../../controllers/auth.controller'); +const oAuthLogin = require('../../middlewares/auth').oAuth; +const { login, register, oAuth, refresh, -} from '../../validations/auth.validation'; +} = require('../../validations/auth.validation'); -const oAuthLogin = require('../../middlewares/auth').oAuth; const router = express.Router(); // POST- v1/auth/register Register @@ -24,8 +24,11 @@ router.route('/login') router.route('/refresh-token') .post(validate(refresh), controller.refresh); -// TODO: POST /v1/auth/reset-password - + +/** + * TODO: POST /v1/auth/reset-password + */ + // POST- v1/auth/facebook Facebook Login router.route('/facebook') .post(validate(oAuth), oAuthLogin('facebook'), controller.oAuth); @@ -35,4 +38,4 @@ router.route('/google') .post(validate(oAuth), oAuthLogin('google'), controller.oAuth); -export default router; +module.exports = router; diff --git a/src/routes/v1/index.js b/src/routes/v1/index.js index 3aa072a..9d5e9e5 100644 --- a/src/routes/v1/index.js +++ b/src/routes/v1/index.js @@ -1,21 +1,20 @@ -import express from 'express'; +const express = require('express'); -//import userRoutes from './user.route'; -import authRoutes from './auth.route'; +const userRoutes = require('./user.route'); +const authRoutes = require('./auth.route'); const router = express.Router(); -/** - * GET v1/status - */ +// Index Route +router.get('/', (req, res) => res.send('Invalid endpoint')); + +// GET v1/status router.get('/status', (req, res) => res.send('OK')); -/** - * GET v1/docs - */ +// GET v1/docs router.use('/docs', express.static('docs')); router.use('/users', userRoutes); router.use('/auth', authRoutes); -export default router; +module.exports = router; diff --git a/src/routes/v1/user.route.js b/src/routes/v1/user.route.js index 4f4bf50..1019387 100644 --- a/src/routes/v1/user.route.js +++ b/src/routes/v1/user.route.js @@ -1,14 +1,14 @@ -import express from 'express'; -import validate from 'express-validation'; +const express = require('express'); +const validate = require('express-validation'); -import controller from '../../controllers/user.controller'; -import { authorize, ADMIN, LOGGED_USER } from '../../middlewares/auth'; -import { +const controller = require('../../controllers/user.controller'); +const { authorize, ADMIN, LOGGED_USER } = require('../../middlewares/auth'); +const { listUsers, createUser, replaceUser, updateUser, -} from '../../validations/user.validation'; +} = require('../../validations/user.validation'); const router = express.Router(); @@ -45,4 +45,4 @@ router .delete(authorize(LOGGED_USER), controller.remove); -export default router; +module.exports = router; diff --git a/src/server/index.js b/src/server/index.js index 8274602..c78e727 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -1,8 +1,7 @@ -import config from '../config/config'; -import app from '../config/express'; - // make bluebird default Promise Promise = require('bluebird'); // eslint-disable-line no-global-assign +const config = require('../config/config'); +const app = require('../config/express'); // open mongoose connection require('../config/persistence/mongodb/connectdb'); @@ -10,4 +9,4 @@ require('../config/persistence/mongodb/connectdb'); // listen to requests app.listen( () => console.info(`server started on port ${config.get('server.port')} (${config.get('env')})`)); -export default app; +module.exports = app; diff --git a/src/utils/APIError.js b/src/utils/APIError.js index d5f3b76..a9eec95 100644 --- a/src/utils/APIError.js +++ b/src/utils/APIError.js @@ -1,4 +1,4 @@ -import httpStatus from 'http-status'; +const httpStatus = require('http-status'); /** * @extends Error @@ -36,4 +36,4 @@ class APIError extends ExtendableError { } } -export default APIError; +module.exports = APIError; diff --git a/src/validations/auth.validation.js b/src/validations/auth.validation.js index 338f0d8..ae33b2a 100644 --- a/src/validations/auth.validation.js +++ b/src/validations/auth.validation.js @@ -1,6 +1,6 @@ -import Joi from 'joi'; +const Joi = require('joi'); -export default { +module.exports = { // POST /v1/auth/register register: { body: { diff --git a/src/validations/user.validation.js b/src/validations/user.validation.js index 9148682..cad5fb4 100644 --- a/src/validations/user.validation.js +++ b/src/validations/user.validation.js @@ -1,8 +1,7 @@ -import Joi from 'joi'; +const Joi = require('joi'); +const User = require('../models/user.model'); -import User from '../models/user.model'; - -export default { +module.exports = { // GET /v1/users listUsers: {