diff --git a/bin/addSpec.js b/bin/addSpec.js index 5c835ac..30bd5db 100644 --- a/bin/addSpec.js +++ b/bin/addSpec.js @@ -21,15 +21,15 @@ program if (!fs.existsSync(`./features/${feature}`)) { - log(`Please add the feature first of ${feature} by puriya feature`); + log(`Please add the feature first of ${feature} by puriya feature ${feature}`); process.exit(1); } - let result; + let result = spec.addimports(); let bodyfield = ''; const noofTestSuites = readlineSync.question("No of testsuite : "); for (let i = 0; i < noofTestSuites; i++) { const describeMessage = readlineSync.question("Message for describe block : "); - result = spec.addimports() + spec.addtestsuite(describeMessage); + result = result + spec.addtestsuite(describeMessage); const noofTestCases = readlineSync.question("No of testcases : "); for (let j = 0; j < noofTestCases; j++) { const itMessage = readlineSync.question("Message for it block : "); diff --git a/bin/feature.js b/bin/feature.js index fc527f9..d5e47bc 100644 --- a/bin/feature.js +++ b/bin/feature.js @@ -12,6 +12,7 @@ const ctrl = require('../files/feature/ctrl'); const routes = require('../files/feature/routes'); const spec = require('../files/feature/spec'); const readlineSync = require('readline-sync'); +const db = require('../files/feature/db'); function makeDir(dirName) { @@ -75,6 +76,7 @@ program makeFile(name, `${name}.model`, model.addNewModal(name, modelData)); makeFile(name, `${name}.ctrl`, ctrl.makeBasicCtrl(name)); makeFile(name, `${name}.route`, routes.makeBasic(name)); + makeFile(name, `${name}.db`, db.makeBasicdb(name)); fs.readFile('./routes/router.js', 'utf8', function (err, data) { if (err) { log(`File not found ${err.path}`); @@ -89,7 +91,6 @@ program if (err) { return log(err); } }); }); - }) .parse(process.argv); diff --git a/bin/index.js b/bin/index.js index e57a15f..263e25e 100644 --- a/bin/index.js +++ b/bin/index.js @@ -35,6 +35,10 @@ const route = require('../files/route/route'); const user = require('../bin/usermodel'); const congfigspec = require('../files/spec/config'); const dropdb = require('../files/spec/dropdb'); +const uservalidator = require('../files/feature/validator'); +const validator = require('../files/common/validator'); +const type = require('../files/feature/type'); +const db = require('../files/feature/db'); let name; function makeDir(dirName) { mkdirp(`./${name}/${dirName}`, function (err) { @@ -103,6 +107,7 @@ program makeFile('common', 'log.js', logs()); makeFile('common', 'codes.js', codes()); makeFile('common', 'messages.js', messages()); + makeFile('common', 'validator.js', validator()); makeFile('', '.gitIgnore', gitIgnore()); makeFile('', '.eslintignore', eslintignore()); makeFile('', '.eslintrc.json', esLint()); @@ -116,6 +121,9 @@ program user.makefile(name, `users`, "user.route", routes.defaultroute()); user.makefile(name, `users`, "user.messages", usermessages.defaultusermessage()); user.makefile(name, `users`, "user.spec", userspec.defaultspec()); + user.makefile(name, `users`, "user.type", type.defaultType()); + user.makefile(name, `users`, "user.validator", uservalidator.defaultValidate()); + user.makefile(name, `users`, "user.db", db.defaultDb()); } }); }) diff --git a/bin/routeAdd.js b/bin/routeAdd.js index 635bf4c..cf7b059 100644 --- a/bin/routeAdd.js +++ b/bin/routeAdd.js @@ -7,6 +7,7 @@ const mkdirp = require('mkdirp'); const program = require('commander'); const fs = require('fs'); const ctrl = require('../files/feature/ctrl'); +const db = require('../files/feature/db'); const routes = require('../files/feature/routes'); const log = require('tracer').console({ format: "{{message}} - {{file}}:{{line}}" }).log; const readlineSync = require('readline-sync'); @@ -82,11 +83,17 @@ program }); const dataCtrl = ctrl.makerouteCtrl(feature, query, queryRoute, methodName); + const datadb = db.makeRoutedb(methodName, queryRoute, query, feature); fs.appendFile(`./features/${feature}/${feature}.ctrl.js`, dataCtrl, function (err) { if (err) { return log('Controller not found'); } + }); + fs.appendFile(`./features/${feature}/${feature}.db.js`, datadb, function (err) { + + if (err) { return log('DB access file not found'); } + }); // fs.readFile(`./features/${feature}/${feature}.ctrl.js`, 'utf8', function (err, data) { diff --git a/files/common/logs.js b/files/common/logs.js index a9517a8..e4983d5 100644 --- a/files/common/logs.js +++ b/files/common/logs.js @@ -5,8 +5,8 @@ const makeLogs = function () { logs = `const winston = require('winston'); require('winston-papertrail').Papertrail; const log = require('tracer').console({ format: '{{message}} - {{file}}:{{line}}' }).log; - const host = \`logs6.papertrailapp.com\`; - const port = 29324; + const host = \`\`; + const port = \`\`; const nodeWinstonPapertrail = new winston.transports.Papertrail({ host: host, diff --git a/files/common/validator.js b/files/common/validator.js new file mode 100644 index 0000000..44d5748 --- /dev/null +++ b/files/common/validator.js @@ -0,0 +1,24 @@ +const validator = function () { + return ` + // Models Requires +const Joi = require('Joi'); +// User Package Requires +const log = require('@common/log'); + +exports.validate = function (incomingData, schemaValidation) { + return new Promise(function (resolve, reject) { + Joi.validate(incomingData, schemaValidation, function (err, value) { + if (err) { + + log(err); + return reject(err); + } else { + + resolve(value); + } + }); + }); +}; +`; +}; +module.exports = validator; diff --git a/files/common/verify.js b/files/common/verify.js index acda1c2..4f12a4f 100644 --- a/files/common/verify.js +++ b/files/common/verify.js @@ -62,38 +62,13 @@ const makeVerify = function () { }; exports.admin = function (req, res, next) { - // check header or url parameters or post parameters for token - const token = req.body.token || req.query.token || req.headers[\`x-access-token\`]; - - // decode token - if (token) { - // verifies secret and checks exp - jwt.verify(token, config.secretKey, function (err, decoded) { - if (err) { - const error = new Error(\`You are not authenticated!\`); - error.status = 401; - return next(err); - } else { - // if everything is good, save to request for use in other routes - req._user = decoded; - - // check if the user has admin flag true - if (req._user.admin) { - next(); - } else { - res.status(403).json({ - 'message': \`You are not authorized to perform this operation!\` - }); - } - } - }); - } else { - // if there is no token - // return an error - const err = new Error(\`No token provided!\`); - err.status = 403; - return next(err); - } + if (req._user.admin) { + next(); + } else { + res.status(403).json({ + 'message': \`You are not authorized to perform this operation!\` + }); + } };`; diff --git a/files/feature/Ctrl.js b/files/feature/Ctrl.js index 666256b..c341cff 100644 --- a/files/feature/Ctrl.js +++ b/files/feature/Ctrl.js @@ -1,198 +1,166 @@ +function jsUcfirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} let ctrl = ``; module.exports = ctrl; const makeCtrl = { defaultctrl: function () { - const dctrl = `const User = require('./user.model.js'); - const passport = require('passport'); - const log = require('@common/log'); - const auth = require('@common/auth'); - const serverCodes = require('@common/codes'); - const serverMessages = require('@common/messages'); - exports.listAll = function (req, res, next) { - User.find({}, function (err, users) { - if (err) { - return next({ - message: serverMessages.server.DB_ERROR, - data: err - }); - } - if (users.length === 0) { - return next({ - message: serverMessages.user.ERROR_NO_USER, - data: err - }); - } + const dctrl = `const passport = require('passport'); +const log = require('@common/log'); +const auth = require('@common/auth'); +const serverMessages = require('@common/messages'); +const userData = require('./user.db'); +const Boom = require('Boom'); +exports.listAll = async function (req, res, next) { + const params = { ...req }; + await userData.findAllUser(params).then(users => { + if (users.length === 0) { + return next({ + message: serverMessages.user.ERROR_NO_USER, + data: {} + }); + } + return res.json({ + message: serverMessages.user.SUCCESS_FOUND, + success: true, + data: users + }); + }).catch(err => { + if (err) { + throw Boom.badImplementation(\`DB error\`); + } + }); +}; + +exports.register = async function (req, res) { + const params = { ...req }; + await userData.registerUser(params); + try { + passport.authenticate(\`local\`)(req, res, function () { + return res.json({ + message: serverMessages.user.SUCCESS_REGISTER, + success: true, + data: null + }); + }); + } catch (err) { + if (err) { + throw Boom.badImplementation(\`DB error\`); + } + } +}; + +exports.login = function (req, res, next) { + + passport.authenticate(\`local\`, function (err, user, info) { + log(err, user, info); + if (err) { + return Boom.badImplementation('DB ERROR'); + } + if (info) { + return Boom.unauthorized('Auth error'); + } + if (!user) { + return next({ + message: serverMessages.user.ERROR_NO_USER, + data: null + }); + } + + req.logIn(user, function (err) { + log(err); + + if (err) { + return Boom.forbidden('Login error'); + } + + auth.getLoginData(user).then(function (data) { + return res.json({ - message: serverMessages.user.SUCCESS_FOUND, + message: serverMessages.user.SUCCESS_LOGIN, success: true, - data: users + data: data }); - }); - }; - - exports.register = function (req, res, next) { - if (!req.body.username || !req.body.password) { - return next({ - message: serverMessages.server.MISSING_FORM_DATA_ERROR, - data: null - }); - } - - User.register(new User({ username: req.body.username }), req.body.password, function (err, user) { + }, function (err) { if (err) { - return next({ - message: serverMessages.server.DB_ERROR, - data: err - }); - } - if (req.body.firstname) { - user.firstname = req.body.firstname; + return Boom.forbidden('Login error'); } - - if (req.body.lastname) { - user.lastname = req.body.lastname; - } - if (req.body.admin) { - user.admin = req.body.admin; - } - user.save(function (err) { - if (err) { - return next({ - message: serverMessages.server.DB_ERROR, - data: err - }); - } - passport.authenticate(\`local\`)(req, res, function () { - return res.json({ - message: serverMessages.user.SUCCESS_REGISTER, - success: true, - data: null - }); - }); - }); + + }).catch(err => { + log(err); }); - }; - - exports.login = function (req, res, next) { - - passport.authenticate(\`local\`, function (err, user, info) { - log(err, user, info); - if (err) { - return next({ - message: serverMessages.generic.DB_ERROR, - data: err - }); - } - if (info) { - return next({ - status: serverCodes.AUTH_ERROR, - message: info.message, - data: err - }); - } - if (!user) { - return next({ - message: serverMessages.user.ERROR_NO_USER, - data: null - }); - } - - req.logIn(user, function (err) { - log(err); - - if (err) { - - return next({ - message: serverMessages.user.ERROR_CAN_NOT_LOGIN, - data: err - }); - } - - auth.getLoginData(user).then( - - function (data) { - - return res.json({ - message: serverMessages.user.SUCCESS_LOGIN, - success: true, - data: data - }); - }, - function (err) { - return next({ - message: serverMessages.user.ERROR_LOGIN, - data: err - }); - - }).catch(err => { - log(err); - }); - - }); - })(req, res, next); - }; - - exports.verifyUser = function (req, res, next) { - - User.findById(req._user._id, function (err, user) { - if (err) { - return next({ - message: serverMessages.user.ERROR_FINDING_USER, - data: err - }); - } - if (!user) { - return next({ - message: serverMessages.user.ERROR_NO_USER, - data: err - }); - } - auth.getLoginData(user).then( - function (data) { - - return res.json({ - message: serverMessages.user.SUCCESS_VERIFY, - success: true, - data: data - }); - }, - function (err) { - - return next({ - message: serverMessages.user.ERROR_GET_USERDATA, - data: err - }); - } - ); + + }); + })(req, res, next); +}; + +exports.verifyUser = async function (req, res, next) { + const param = { ...req }; + await userData.verifyUser(param).then(user => { + if (user.length === 0) { + return next({ + message: serverMessages.user.ERROR_NO_USER, + data: {} }); - }; - - exports.logout = function (req, res) { - req.logout(); - res.json({ - message: serverMessages.user.SUCCESS_LOGOUT, + } + auth.getLoginData(user).then(function (data) { + return res.json({ + message: serverMessages.user.SUCCESS_VERIFY, success: true, - data: null + data: data }); - }; + }).catch(err => { + if (err) { + Boom.badImplementation('Error get user data'); + } + }); + }); +}; + +exports.logout = function (req, res) { + req.logout(); + res.json({ + message: serverMessages.user.SUCCESS_LOGOUT, + success: true, + data: null + }); +}; + `; return dctrl; }, makeBasicCtrl: function (name) { - ctrl = `const ${name} = require('./${name}.model.js'); + ctrl = `const ${name}Model = require('./${name}.model.js'); const passport = require('passport'); const log = require('@common/log'); const auth = require('@common/auth'); - const serverCodes = require('@common/codes'); + const Boom = require('Boom'); const serverMessages = require('@common/messages'); - exports.listAll = function (req, res, next) { - ${name}.find({}, function (err, users) { - if (err) throw err; - res.json(users); - }); + const ${name}data=require('./${name}.db.js') + exports.listAll = async function (req, res, next) { + const params={...req}; + let ${name}=null; + ${name}=${name}data.findAll${jsUcfirst(name)}(params); + try{ + if (${name}.length === 0) { + return res.json({ + message: serverMessages.user.ERROR_NO_USER, + data: [] + }); + } + return res.json({ + message: serverMessages.user.SUCCESS_FOUND, + success: true, + data:${name} + }); + }catch(err){ + if(err){ + throw Boom.badImplementation(\`DB error\`); + } + } }; `; @@ -203,23 +171,21 @@ const makeCtrl = { makerouteCtrl: function (name, query, queryModel, methodName) { ctrl = ` exports.${methodName}= function (req, res, next) { - ${queryModel}.${query}({}, function (err,data ) { - if (err) { - return res.status(500).json({ - err: err - }); - } - return res.status(200).json({ + const params={...req}; + let ${name}=null; + ${name}=${name}data.${methodName}(params); + try{ + return res.status(200).json({ message: '', success: true, data: data }); - - }); - } - - - `; + }catch(err){ + if(err){ + throw Boom.badImplementation(\`DB error\`); + } + } + };`; return ctrl; diff --git a/files/feature/db.js b/files/feature/db.js new file mode 100644 index 0000000..a436321 --- /dev/null +++ b/files/feature/db.js @@ -0,0 +1,94 @@ +function jsUcfirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} +const db = { + defaultDb: function () { + return `const User = require('./user.model.js'); +const log = require('@common/log'); +exports.findAllUser = function () { + return new Promise(function (resolve, reject) { + User.find({}, function (err, users) { + if (err) { + log(err); + return reject(err); + } else { + resolve(users); + } + + }); + }); +}; +exports.registerUser = function (req) { + return new Promise(function (resolve, reject) { + User.register(new User({ username: req.body.username }), req.body.password, function (err, user) { + if (err) { + return reject(err); + } else { + if (req.body.firstname) { + user.firstname = req.body.firstname; + } + if (req.body.lastname) { + user.lastname = req.body.lastname; + } + if (req.body.admin) { + user.admin = req.body.admin; + } + user.save(function (err) { + if (err) { + reject(err); + } else { + resolve(user); + } + }); + } + }); + }); +}; +exports.verifyUser = function (req) { + return new Promise(function (resolve, reject) { + User.findById(req._user._id, function (err, user) { + if (err) { + return reject(err); + } else { + resolve(user); + } + + }); + }); +}; +`; + }, + makeBasicdb: function (name) { + return `const ${name} = require('./${name}.model.js'); +const log = require('@common/log'); +exports.findAll${jsUcfirst(name)}= function () { + return new Promise(function (resolve, reject) { + ${name}.find({}, function (err, users) { + if (err) { + log(err); + return reject(err); + } else { + resolve(users); + } + }); + }); +}; +`; + }, + makeRoutedb: function (methodName, queryModel, query, name) { + return `exports.${methodName} = function () { + return new Promise(function (resolve, reject) { + ${queryModel}.${query}({}, function (err, data) { + if (err) { + log(err); + return reject(err); + } else { + resolve(data); + } + }); + }) + };`; + + } +}; +module.exports = db; diff --git a/files/feature/model.js b/files/feature/model.js index 888c587..a087f9b 100644 --- a/files/feature/model.js +++ b/files/feature/model.js @@ -1,3 +1,6 @@ +function jsUcfirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} let model = { defaultmodel: function () { @@ -43,12 +46,11 @@ let model = { addNewModal: function (name, modelData) { model = ` - const log = require('tracer').console({format: "{{message}} - {{file}}:{{line}}"}).log;\n const mongoose = require('mongoose');\n const Schema = mongoose.Schema;\n const passportLocalMongoose = require('passport-local-mongoose');\n - const ${name} = new Schema({\n + const ${jsUcfirst(name)} = new Schema({\n `; @@ -60,7 +62,7 @@ let model = { model += `});\n - module.exports = mongoose.model(\`${name.toUpperCase()}\`, ${name.toUpperCase()});\n`; + module.exports = mongoose.model(\`${jsUcfirst(name)}\`, ${jsUcfirst(name)});\n`; return model; } diff --git a/files/feature/spec.js b/files/feature/spec.js index 64ea582..f98813b 100644 --- a/files/feature/spec.js +++ b/files/feature/spec.js @@ -5,7 +5,6 @@ const makeRoute = { defaultspec: function () { const userspec = `const config = require('../../spec/config'); const frisby = require('frisby'); - const Joi = frisby.Joi; let token; describe(\`User register :\`, () => { @@ -50,7 +49,7 @@ const makeRoute = { .post(\`\${config.domain}/user/login\`, { password: \`12345\` }) - .expect(\`status\`, 401) + .expect(\`status\`, 500) .done(done); }); @@ -60,7 +59,7 @@ const makeRoute = { .post(\`\${config.domain}/user/login\`, { username: \`dany600\` }) - .expect(\`status\`, 401) + .expect(\`status\`, 500) .done(done); }); @@ -69,7 +68,11 @@ const makeRoute = { it(\`it should logout the user\`, done => { frisby .get(\`\${config.domain}/user/logout\`, { - + headers: { + 'x-access-token': token, + origin: config.domain, + 'Content-Type': 'application/json', + } }) .expect(\`status\`, 200) .done(done); @@ -88,8 +91,7 @@ const makeRoute = { }) .expect(\`status\`, 403) .expect(\`json\`, { - message: \`No token provided!\`, - success: false + message: \`You are not authorized to perform this operation!\` }) .done(done); diff --git a/files/feature/type.js b/files/feature/type.js new file mode 100644 index 0000000..2da9478 --- /dev/null +++ b/files/feature/type.js @@ -0,0 +1,28 @@ +const type = { + defaultType: function () { + return `const Joi = require('Joi'); +Joi.objectId = require('joi-objectid')(Joi); +exports.register = Joi.object().keys({ + query: {}, + params: {}, + body: { + + username: Joi.string().required(), + password: Joi.string().required(), + firstname: Joi.string(), + lastname: Joi.string(), + admin: Joi.boolean() + } +}); +exports.login = Joi.object().keys({ + query: {}, + params: {}, + body: { + username: Joi.string().required(), + password: Joi.string().required(), + } +}); +`; + } +}; +module.exports = type; diff --git a/files/feature/validator.js b/files/feature/validator.js new file mode 100644 index 0000000..873f4a3 --- /dev/null +++ b/files/feature/validator.js @@ -0,0 +1,63 @@ +const valiator = { + defaultValidate: function () { + return `// User Package Requires +const serverMessages = require('@common/messages'); +const schema = require('./user.type'); +const validate = require('@common/validator').validate; +exports.register = function (req, res, next) { + const incomingData = { + query: {}, + params: {}, + body: { + username: req.body.username, + password: req.body.password, + firstname: req.body.firstname, + lastname: req.body.lastname, + admin: req.body.admin + } + }; + validate(incomingData, schema.register).then(value => { + req.body = value.body; + req.params = value.params; + req.query = value.query; + + next(); + }) + .catch(err => { + if (err) { + return next({ + message: serverMessages.server.VALIDATION_ERROR, + data: err + }); + } + }); +}; +exports.login = function (req, res, next) { + const incomingData = { + query: {}, + params: {}, + body: { + username: req.body.username, + password: req.body.password + } + }; + validate(incomingData, schema.login).then(value => { + req.body = value.body; + req.params = value.params; + req.query = value.query; + + next(); + }) + .catch(err => { + if (err) { + return next({ + message: serverMessages.server.VALIDATION_ERROR, + data: err + }); + } + }); +}; +`; + } +}; +module.exports = valiator; diff --git a/files/gitIgnore.js b/files/gitIgnore.js index a329198..481130e 100644 --- a/files/gitIgnore.js +++ b/files/gitIgnore.js @@ -3,7 +3,7 @@ let ignore = ''; const makeGitIgnore = function () { ignore = `.idea/ - node_modules/`; +node_modules/`; return ignore; }; diff --git a/files/package.js b/files/package.js index 720bfde..c38b218 100644 --- a/files/package.js +++ b/files/package.js @@ -47,7 +47,8 @@ const makePackageJSON = function (name) { "serve-favicon": "~2.4.5", "tracer": "^0.8.3", "winston": "^2.4.0", - "winston-papertrail": "^1.0.5" + "winston-papertrail": "^1.0.5", + "joi-objectid": "^2.0.0" }, "pre-commit": [ "lint"