From 6d9c6f9ccac91a3fdb9c87a3fe351f33fe2dd4b6 Mon Sep 17 00:00:00 2001 From: Aryan Singhal Date: Mon, 16 Mar 2020 10:17:26 +0530 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20Fix=20indentatio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extra/index.js | 45 ++++++++++++----------- extra/patterns/diamond.js | 40 +++++++++----------- extra/patterns/equilateral.js | 25 ++++++------- extra/patterns/index.js | 7 ++-- extra/utils/helper.js | 19 ++++------ extra/utils/index.js | 6 +-- extra/utils/permissions.js | 36 ++++++++---------- extra/utils/validation.js | 61 ++++++++++++++----------------- package.json | 9 ++--- src/Controllers/trainee/routes.ts | 10 ++--- src/Controllers/user/routes.ts | 4 +- src/Server.ts | 4 +- 12 files changed, 122 insertions(+), 144 deletions(-) diff --git a/extra/index.js b/extra/index.js index 2494a65..a501802 100644 --- a/extra/index.js +++ b/extra/index.js @@ -1,25 +1,26 @@ -import {diamond} from './patterns/index.js'; -import {equilateral} from './patterns/index.js'; -import {hasPermission, validateUser} from './utils/index.js'; +import { diamond } from './patterns/index'; +import { equilateral } from './patterns/index'; +import { hasPermission, validateUser } from './utils/index'; + diamond(10); equilateral(8); -hasPermission("getUsers","trainer","write"); -const user=[ - { - traineeEmail: 'trainee1@successive.tech', - reviewerEmail: 'reviewer1@successive.tech' - }, - { - traineeEmail: 'aryan.singhal@successive.tech', - reviewerEmail: 'rahul.sadhukhan@successive.tech' - }, - { - traineeEmail: 'trainee1@gmail.com', - reviewerEmail: 'reviewer1@hotmail.com' - }, - { - traineeEmail: 'Aman$2@successive.tech', - reviewerEmail: 'vinay.chaudhary@successive.tech' - } +hasPermission("getUsers", "trainer", "write"); +const user = [ + { + traineeEmail: 'trainee1@successive.tech', + reviewerEmail: 'reviewer1@successive.tech' + }, + { + traineeEmail: 'aryan.singhal@successive.tech', + reviewerEmail: 'rahul.sadhukhan@successive.tech' + }, + { + traineeEmail: 'trainee1@gmail.com', + reviewerEmail: 'reviewer1@hotmail.com' + }, + { + traineeEmail: 'Aman$2@successive.tech', + reviewerEmail: 'vinay.chaudhary@successive.tech' + } ]; -validateUser(user); \ No newline at end of file +validateUser(user); diff --git a/extra/patterns/diamond.js b/extra/patterns/diamond.js index 30ceed4..6d96cc5 100644 --- a/extra/patterns/diamond.js +++ b/extra/patterns/diamond.js @@ -1,30 +1,24 @@ -function diamond(n) -{ -for(let i=0;i0;i--) -{ - let str=""; - for(let k=0;k 0; i--) { + let str = ''; + for (let k = 0; k < n - i; k++) { + str = str + ' '; } - for(let j=0;j { - if(element==role) - { - tmp=true; - } - - }); - return tmp; -} \ No newline at end of file +import { permissions } from '../constant.js'; +export default function hasPermission(moduleName, role, permissionType) { + console.log("hasPermission", moduleName, role, permissionType); + if (permissions[moduleName] === undefined) + return false; + let data = permissions[moduleName]; + let tmp = false; + if (data[permissionType] === undefined) + return false; + data[permissionType].forEach(element => { + if (element == role) { + tmp = true; + } + }); + return tmp; +} diff --git a/extra/utils/validation.js b/extra/utils/validation.js index 6709acb..98a39a6 100644 --- a/extra/utils/validation.js +++ b/extra/utils/validation.js @@ -1,35 +1,30 @@ -import {validateEmail} from './helper.js'; -function validateUser(user) -{ - let validEmails=[]; - let invalidEmails=[]; - user.forEach(function(value,index) - { - const {traineeEmail,reviewerEmail}=user[index]; - if(validateEmail(traineeEmail)){ - validEmails.push(traineeEmail); - } - else - { - invalidEmails.push(traineeEmail); - } - if(validateEmail(reviewerEmail)){ - - validEmails.push(reviewerEmail); - } - else - { - invalidEmails.push(reviewerEmail); - } - - }); - console.log("Valid Users are:\n"); - validEmails.forEach(element => console.log(element)); - console.log("\nNo. of Valid Users: ",validEmails.length); - console.log("-----------------------------------------------------") +import { validateEmail } from './helper.js'; - console.log("\nInvalid Users are:\n"); - invalidEmails.forEach(element => console.log(element)); - console.log("\nNo. of Invalid Users: ",invalidEmails.length); +function validateUser(user) { + let validEmails = []; + let invalidEmails = []; + user.forEach(function (value) { + const { traineeEmail, reviewerEmail } = value; + if (validateEmail(traineeEmail)) { + validEmails.push(traineeEmail); + } + else { + invalidEmails.push(traineeEmail); + } + if (validateEmail(reviewerEmail)) { + validEmails.push(reviewerEmail); + } + else { + invalidEmails.push(reviewerEmail); + } + }); + console.log("Valid Users are:\n"); + validEmails.forEach(element => console.log(element)); + console.log("\nNo. of Valid Users: ", validEmails.length); + console.log("-----------------------------------------------------") + console.log("\nInvalid Users are:\n"); + invalidEmails.forEach(element => console.log(element)); + console.log("\nNo. of Invalid Users: ", invalidEmails.length); } -export default validateUser; \ No newline at end of file + +export default validateUser; diff --git a/package.json b/package.json index cec5436..e704159 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,9 @@ "author": "", "license": "ISC", "dependencies": { - "@babel/core": "7.8.3", - "@babel/node": "7.8.3", - "@babel/preset-env": "7.8.3", "@types/express": "4.17.2", "@types/mongoose": "5.7.0", "@types/node": "13.5.1", - "babel": "6.23.0", "babel-node": "0.0.1-security", "bcrypt": "^3.0.8", "body-parser": "1.19.0", @@ -47,7 +43,10 @@ "tslint": "6.0.0" }, "devDependencies": { + "@babel/core": "7.8.3", + "@babel/node": "7.8.3", + "@babel/preset-env": "7.8.3", "tsc-watch": "4.1.0", "typescript": "3.7.5" } -} \ No newline at end of file +} diff --git a/src/Controllers/trainee/routes.ts b/src/Controllers/trainee/routes.ts index 6ce7d52..8c8deaa 100644 --- a/src/Controllers/trainee/routes.ts +++ b/src/Controllers/trainee/routes.ts @@ -87,7 +87,7 @@ traineeRouter.route('/') /** * @swagger * - * /api/trainee: + * /trainee: * get: * description: Returns the list of the trainees * security: @@ -146,7 +146,7 @@ traineeRouter.route('/') /** * @swagger * - * /api/trainee: + * /trainee: * post: * description: Returns the success reponse on creation * security: @@ -189,7 +189,7 @@ traineeRouter.route('/') /** * @swagger * - * /api/trainee: + * /trainee: * put: * description: Returns the success reponse on creation * security: @@ -234,7 +234,7 @@ traineeRouter.route('/') /** * @swagger * - * /api/trainee/{id}: + * /trainee/{id}: * delete: * description: Returns the success reponse on creation * security: @@ -267,4 +267,4 @@ traineeRouter.route('/') */ traineeRouter.route('/:id') .delete(authMiddleWare('traineeModule', 'delete'), validationHandler(validation.delete), controller.delete); -export default traineeRouter; \ No newline at end of file +export default traineeRouter; diff --git a/src/Controllers/user/routes.ts b/src/Controllers/user/routes.ts index 6b56e51..16df6ef 100644 --- a/src/Controllers/user/routes.ts +++ b/src/Controllers/user/routes.ts @@ -30,7 +30,7 @@ const userRouter: Router = Router(); /** * @swagger * - * /api/user/me: + * /user/me: * get: * description: Details of the current user. * security: @@ -48,7 +48,7 @@ userRouter.route('/me') /** * @swagger * - * /api/user/login: + * /user/login: * post: * description: Login Credentials * security: diff --git a/src/Server.ts b/src/Server.ts index 74713fc..04c9063 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -28,9 +28,9 @@ export class Server { name: 'Authorization', in: 'headers' } - } }, basePath: '/api', + }, swagger: '2.0', apis: ['./dist/Controllers/**/routes.js'], }; @@ -68,4 +68,4 @@ export class Server { app.use(notFoundRoute); app.use(errorHandler); } -} \ No newline at end of file +} From a73f6dfeded0306a8d1c0da8a3bfcabd1e3a9db6 Mon Sep 17 00:00:00 2001 From: Aryan Singhal Date: Wed, 18 Mar 2020 13:46:21 +0530 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20fix=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extraTs/index.ts | 5 +- extraTs/interface.ts | 6 +- extraTs/utils/permissions.ts | 29 +-- src/Controllers/trainee/Controller.ts | 182 +++++++++--------- src/Controllers/trainee/searchQuery.ts | 8 + src/Controllers/trainee/sortQuery.ts | 10 + src/Controllers/trainee/validation.ts | 4 +- src/repositories/user/UserRepository.ts | 6 +- .../versionable/VersionableRepository.ts | 7 +- 9 files changed, 139 insertions(+), 118 deletions(-) create mode 100644 src/Controllers/trainee/searchQuery.ts create mode 100644 src/Controllers/trainee/sortQuery.ts diff --git a/extraTs/index.ts b/extraTs/index.ts index 7c19650..4ef20f3 100644 --- a/extraTs/index.ts +++ b/extraTs/index.ts @@ -2,9 +2,11 @@ import { diamond } from './patterns/index'; import { equilateral } from './patterns/index'; import { hasPermission, validateUser } from './utils/index'; import { Iuser } from './interface'; + diamond(10); equilateral(8); hasPermission('getUsers', 'trainer', 'write'); + const user: Iuser[] = [ { traineeEmail: 'trainee1@successive.tech', @@ -23,4 +25,5 @@ const user: Iuser[] = [ reviewerEmail: 'vinay.chaudhary@successive.tech' } ]; -validateUser(user); \ No newline at end of file + +validateUser(user); diff --git a/extraTs/interface.ts b/extraTs/interface.ts index c46d3da..e65bc38 100644 --- a/extraTs/interface.ts +++ b/extraTs/interface.ts @@ -2,14 +2,16 @@ interface Iuser { traineeEmail: string; reviewerEmail: string; } -export { Iuser }; + interface Iauthority { all: string[]; read: string[]; write: string[]; delete: string[]; } + interface Ipermission { [key: string]: Iauthority; } -export { Ipermission }; \ No newline at end of file + +export { Ipermission, Iuser }; diff --git a/extraTs/utils/permissions.ts b/extraTs/utils/permissions.ts index 26eaa38..fad97da 100644 --- a/extraTs/utils/permissions.ts +++ b/extraTs/utils/permissions.ts @@ -1,18 +1,19 @@ import { permissions } from '../constant.js'; + export default function hasPermission(moduleName: string, role: string, permissionType: string): boolean { - console.log('hasPermission', moduleName, role, permissionType); - if (permissions[moduleName] === undefined) - return false; - const data = permissions[moduleName]; - let tmp: boolean = false; - if (data[permissionType] === undefined) - return false; + console.log('hasPermission', moduleName, role, permissionType); + if (permissions[moduleName] === undefined || permissions[moduleName] === null) + return false; + const data = permissions[moduleName]; + let tmp: boolean = false; + if (data[permissionType] === undefined || data[permissionType] === null) + return false; - data[permissionType].forEach(element => { - if (element === role) { - tmp = true; - } + data[permissionType].forEach(element => { + if (element === role) { + tmp = true; + } - }); - return tmp; -} \ No newline at end of file + }); + return tmp; +} diff --git a/src/Controllers/trainee/Controller.ts b/src/Controllers/trainee/Controller.ts index c38a37b..13b0113 100644 --- a/src/Controllers/trainee/Controller.ts +++ b/src/Controllers/trainee/Controller.ts @@ -1,101 +1,97 @@ import { Request, Response } from 'express'; +import * as bcrypt from 'bcrypt'; import { userRepository } from '../../repositories/user'; import SystemResponse from '../../libs/SystemResponse'; -import * as bcrypt from 'bcrypt'; -class Controller { - static instance: Controller; - static getInstance = () => { - if (Controller.instance) { - return Controller.instance; - } - else { - Controller.instance = new Controller(); - return Controller.instance; - } +import sortQuery from './sortQuery'; +import searchQuery from './searchQuery'; + +class TraineeController { + static instance: TraineeController; + static getInstance = () => { + if (TraineeController.instance) { + return TraineeController.instance; } - create = async (req, res: Response) => { - console.log('----------Create Trainee----------'); - const { address, dob, mob, hobbies, role, password} = req.body; - let { name, email } = req.body; - try { - const hash = await bcrypt.hash(password, 10); - email = email.toLowerCase(); - name = name.toLowerCase(); - const validity = await userRepository.findByEmail(email); - if (!validity) { - const userData = await userRepository.create(req.user._id, { name, address, email, dob, mob, hobbies, role, password: hash }); - const message = 'Trainee added successfully'; - userData.password = '*****'; - console.log(userData); - SystemResponse.success(res, userData, message); - } - else - return SystemResponse.failure(res, 'User is not create', 'Email id already exist'); - } - catch (error) { - return SystemResponse.failure(res, error, 'User is not create'); - } - }; - list = async (req: Request, res: Response) => { - console.log('----------Trainee List----------'); - console.log(`req.query.skip = ${req.query.skip},req.query.limit = ${req.query.limit}`); - try { - let sortBy; - let dataList; - if (req.query.sortBy === 'email') - sortBy = { email: req.query.order}; - if (req.query.sortBy === 'name') - sortBy = { name: req.query.order}; - else - sortBy = {updatedAt: req.query.order}; - if (req.query.search !== undefined) { - dataList = await userRepository.list('trainee', req.query.skip, req.query.limit, sortBy, {name: { $regex: req.query.search.toLowerCase()}}); - const List = await userRepository.list('trainee', req.query.skip, req.query.limit, sortBy, {email: { $regex: req.query.search.toLowerCase()}}); - dataList = {...dataList, ...List }; - } - else { - dataList = await userRepository.list('trainee', req.query.skip, req.query.limit, sortBy, {}); - } + else { + TraineeController.instance = new TraineeController(); + return TraineeController.instance; + } + } - console.log(dataList); - const count = await userRepository.countTrainee(); - const message = 'Trainee List , No. of trainee: ' + count ; - const data = {Count: count, ...dataList}; - SystemResponse.success(res, data, message); - } - catch (error) { - return SystemResponse.failure(res, error, 'User data does not exist'); - } - }; - update = async (req, res: Response) => { - console.log('----------Update Trainee----------'); - try { - const value = await userRepository.update(req, req.body.id, req.body.dataToUpdate); - if (value) { - const message = 'Trainee Data successfully Updated'; - const data = req.body.dataToUpdate; - SystemResponse.success(res, data, message); - } - else - return SystemResponse.failure(res, 'User data is not Updated', 'Email id already exist'); - } - catch (error) { - return SystemResponse.failure(res, error, 'User data is not Updated'); - } - }; - delete = async(req, res: Response) => { - console.log('----------Delete Trainee----------'); - try { - const value = await userRepository.delete(req, req.params.id); - if (value) { - const message = 'Trainee Data Successfully Deleted'; - SystemResponse.success(res, req.params.id, message); - } - } - catch (error) { - return SystemResponse.failure(res, error, 'User data is not deleted'); + create = async (req, res: Response) => { + console.log('----------Create Trainee----------'); + const { address, dob, mob, hobbies, role, password } = req.body; + let { name, email } = req.body; + try { + const hash = await bcrypt.hash(password, 10); + email = email.toLowerCase(); + name = name; + const validity = await userRepository.findByEmail(email); + if (validity) { + throw { + msg: 'Email id already exist', } + } + const userData = await userRepository.create(req.user._id, { name, address, email, dob, mob, hobbies, role, password: hash }); + const message = 'Trainee added successfully'; + userData.password = '*****'; + console.log(userData); + SystemResponse.success(res, userData, message); + } + catch (error) { + return SystemResponse.failure(res, error, error.msg || 'User is not created'); + } + }; + + list = async (req: Request, res: Response) => { + console.log('----------Trainee List----------'); + console.log(`req.query.skip = ${req.query.skip},req.query.limit = ${req.query.limit}`); + const { order, sortBy, search } = req.query; + try { + const sort = sortQuery(sortBy, order); + const searchBy = searchQuery(search); + let dataList; + dataList = await userRepository.list('trainee', req.query.skip, req.query.limit, sort, searchBy); + console.log(dataList); + const count = await userRepository.countTrainee(); + const message = 'Trainee List , No. of trainee: ' + count; + const data = { Count: count, ...dataList }; + SystemResponse.success(res, data, message); + } + catch (error) { + return SystemResponse.failure(res, error, 'User data does not exist'); + } + }; - }; + update = async (req, res: Response) => { + console.log('----------Update Trainee----------'); + try { + const value = await userRepository.update(req, req.body.id, req.body.dataToUpdate); + if (value) { + const message = 'Trainee Data successfully Updated'; + const data = req.body.dataToUpdate; + SystemResponse.success(res, data, message); + } + else + return SystemResponse.failure(res, 'User data is not Updated', 'Email id already exist'); + } + catch (error) { + return SystemResponse.failure(res, error, 'User data is not Updated'); + } + }; + + delete = async (req, res: Response) => { + console.log('----------Delete Trainee----------'); + try { + const value = await userRepository.delete(req, req.params.id); + if (value) { + const message = 'Trainee Data Successfully Deleted'; + SystemResponse.success(res, req.params.id, message); + } + } + catch (error) { + return SystemResponse.failure(res, error, 'User data is not deleted'); + } + }; } -export default Controller.getInstance(); \ No newline at end of file + +export default TraineeController.getInstance(); diff --git a/src/Controllers/trainee/searchQuery.ts b/src/Controllers/trainee/searchQuery.ts new file mode 100644 index 0000000..90e4562 --- /dev/null +++ b/src/Controllers/trainee/searchQuery.ts @@ -0,0 +1,8 @@ +const searchQuery = (search) => { + if (search === undefined) + return {}; + else + return { $or: [{ name: { $regex: search, $options: 'i' } }, { email: { $regex: search.toLowerCase() } }] }; +} + +export default searchQuery; diff --git a/src/Controllers/trainee/sortQuery.ts b/src/Controllers/trainee/sortQuery.ts new file mode 100644 index 0000000..05b661e --- /dev/null +++ b/src/Controllers/trainee/sortQuery.ts @@ -0,0 +1,10 @@ +const sortQuery = (sortBy, order) => { + if (sortBy === 'email') + return { email: order }; + else if (sortBy === 'name') + return { name: order }; + else + return { updatedAt: order }; +} + +export default sortQuery; diff --git a/src/Controllers/trainee/validation.ts b/src/Controllers/trainee/validation.ts index 71f5c9a..19f251f 100644 --- a/src/Controllers/trainee/validation.ts +++ b/src/Controllers/trainee/validation.ts @@ -30,7 +30,7 @@ const validation = { string: true, regex: /[a-z]([[-]*\w+[.]*){1,63}@successive[.]tech$/, in: ['body'], - errorMessage: 'email is required' + errorMessage: 'email is required', }, dob: { @@ -151,4 +151,4 @@ const validation = { } } }; -export default validation ; \ No newline at end of file +export default validation ; diff --git a/src/repositories/user/UserRepository.ts b/src/repositories/user/UserRepository.ts index d12f654..a75ab51 100644 --- a/src/repositories/user/UserRepository.ts +++ b/src/repositories/user/UserRepository.ts @@ -22,8 +22,8 @@ class UserRepository extends VersionableRepository { return this.versionModel.countDocuments({role: 'trainee', deletedAt: {$exists: false}}); } - list = (userRole, skip, limit, sortBy, searchBy) => { - return super.list(userRole, skip, limit, sortBy, searchBy); + list = (userRole, skip, limit, sort, searchBy) => { + return super.list(userRole, skip, limit, sort, searchBy); } findOne = (id) => { return this.versionModel.findOne({originalId: id}).exec(); @@ -35,4 +35,4 @@ class UserRepository extends VersionableRepository > { protected versionModel: M ; constructor(versionModel) { @@ -56,7 +57,7 @@ export default class VersionRepository< D extends mongoose.Document, M extends m return false; } } - public list(userRole, skipRecord, limitRecord, sortBy, searchBy) { - return this.versionModel.find({deletedAt: undefined, role: userRole, ...searchBy}, {password: 0}).sort(sortBy).skip(Number(skipRecord)).limit(Number(limitRecord)); + public list(userRole, skipRecord, limitRecord, sort, searchBy) { + return this.versionModel.find({deletedAt: undefined, role: userRole, ...searchBy}, {password: 0}).sort(sort).skip(Number(skipRecord)).limit(Number(limitRecord)); } -} \ No newline at end of file +} From 6ea1bf26b6f5e89f5d7c71a73287c27b67c50a20 Mon Sep 17 00:00:00 2001 From: Aryan Singhal Date: Wed, 18 Mar 2020 16:43:52 +0530 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20add=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controllers/trainee/Controller.ts | 6 +- src/Controllers/user/Controller.ts | 79 +++++----- src/Server.ts | 122 ++++++++-------- src/config/IConfig.ts | 12 +- src/config/configuration.ts | 13 +- src/index.ts | 3 +- src/libs/Database.ts | 38 ++--- src/libs/routes/authMiddleWare.ts | 9 +- src/libs/routes/validationHandler.ts | 137 +++++++++--------- src/libs/seedData.ts | 42 +++--- src/repositories/user/UserRepository.ts | 69 +++++---- .../versionable/VersionableRepository.ts | 12 +- src/router.ts | 4 +- 13 files changed, 288 insertions(+), 258 deletions(-) diff --git a/src/Controllers/trainee/Controller.ts b/src/Controllers/trainee/Controller.ts index 13b0113..cbe548b 100644 --- a/src/Controllers/trainee/Controller.ts +++ b/src/Controllers/trainee/Controller.ts @@ -29,7 +29,7 @@ class TraineeController { if (validity) { throw { msg: 'Email id already exist', - } + }; } const userData = await userRepository.create(req.user._id, { name, address, email, dob, mob, hobbies, role, password: hash }); const message = 'Trainee added successfully'; @@ -65,7 +65,7 @@ class TraineeController { update = async (req, res: Response) => { console.log('----------Update Trainee----------'); try { - const value = await userRepository.update(req, req.body.id, req.body.dataToUpdate); + const value = await userRepository.update(req.user._id, req.body.id, req.body.dataToUpdate); if (value) { const message = 'Trainee Data successfully Updated'; const data = req.body.dataToUpdate; @@ -82,7 +82,7 @@ class TraineeController { delete = async (req, res: Response) => { console.log('----------Delete Trainee----------'); try { - const value = await userRepository.delete(req, req.params.id); + const value = await userRepository.delete(req.user._id, req.params.id); if (value) { const message = 'Trainee Data Successfully Deleted'; SystemResponse.success(res, req.params.id, message); diff --git a/src/Controllers/user/Controller.ts b/src/Controllers/user/Controller.ts index ccedd3e..ecc0790 100644 --- a/src/Controllers/user/Controller.ts +++ b/src/Controllers/user/Controller.ts @@ -4,44 +4,51 @@ import { userRepository } from '../../repositories/user'; import SystemResponse from '../../libs/SystemResponse'; import * as jwt from 'jsonwebtoken'; import config from '../../config/configuration'; + class Controller { - static instance: Controller; - static getInstance = () => { - if (Controller.instance) { - return Controller.instance; - } - else { - Controller.instance = new Controller(); - return Controller.instance; - } + static instance: Controller; + static getInstance = () => { + if (Controller.instance) { + return Controller.instance; } - me = (req, res: Response) => { - console.log('--------------me-------------'); - delete req.user.password; - SystemResponse.success(res, req.user, 'User data fetched'); + else { + Controller.instance = new Controller(); + return Controller.instance; } - login = async(req , res: Response) => { - console.log('--------------Login-------------'); - try { - const { email, password } = req.body; - console.log(email, password); - const user = await userRepository.findByEmail(email); - if (!user) { - return SystemResponse.failure(res, 'User data not found', 'User not found', 404); - } - const result = await bcrypt.compare(password, user.password); - console.log(result); - if (!result) { - return SystemResponse.failure(res, 'Password is incorrect', 'Password does not match', 422); - } - console.log('Password matched'); - const token = jwt.sign({ email: user.email , _id: user.originalId }, config.Key, { expiresIn: 900 }); - return SystemResponse.success(res, token); - } - catch (err) { - console.log(err); - return SystemResponse.failure(res, err.message); - } + } + me = (req, res: Response) => { + console.log('--------------me-------------'); + try { + delete req.user.password; + SystemResponse.success(res, req.user, 'User data fetched'); } + catch (err) { + SystemResponse.failure(res, err.message); + } + } + login = async (req, res: Response) => { + console.log('--------------Login-------------'); + try { + const { email, password } = req.body; + console.log(email, password); + const user = await userRepository.findByEmail(email); + if (!user) { + return SystemResponse.failure(res, 'User data not found', 'User not found', 404); + } + const result = await bcrypt.compare(password, user.password); + console.log(result); + if (!result) { + return SystemResponse.failure(res, 'Password is incorrect', 'Password does not match', 422); + } + console.log('Password matched'); + const token = jwt.sign({ email: user.email, _id: user.originalId }, config.key, { expiresIn: 900 }); + return SystemResponse.success(res, token); + } + catch (err) { + console.log(err); + return SystemResponse.failure(res, err.message); + } + } } -export default Controller.getInstance(); \ No newline at end of file + +export default Controller.getInstance(); diff --git a/src/Server.ts b/src/Server.ts index 04c9063..0081f61 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -5,67 +5,71 @@ import { default as mainRouter } from './router'; import Database from './libs/Database'; import * as swaggerJsDoc from 'swagger-jsdoc'; import * as swaggerUI from 'swagger-ui-express'; + export class Server { - private app: express.Express; - constructor(protected config) { - this.app = express(); - } - public bootstrap = (): Server => { - this.initBodyParser(); - this.setupRoutes(); - return this; - } - public initSwagger = () => { - const options = { - definition: { - info: { - title: 'Javascript-Server API', - version: '1.0.0', - }, - securityDefinitions: { - Bearer: { - type: 'apiKey', - name: 'Authorization', - in: 'headers' - } - }, - basePath: '/api', - }, - swagger: '2.0', - apis: ['./dist/Controllers/**/routes.js'], - }; - const swaggerSpec = swaggerJsDoc(options); - return swaggerSpec; - } - public run = async (): Promise => { - try { - const { app, config: { Port, MongoURL } }: Server = this; - await Database.open(MongoURL); - app.listen(Port, (err) => { - if (err) { - console.log(err); - } - else { - console.log(`Express app Successfully started on port : ${Port} `); - } - }); + private app: express.Express; + constructor(protected config) { + this.app = express(); + } + + public bootstrap = (): Server => { + this.initBodyParser(); + this.setupRoutes(); + return this; + } + + public initSwagger = () => { + const options = { + definition: { + info: { + title: 'Javascript-Server API', + version: '1.0.0', + }, + securityDefinitions: { + Bearer: { + type: 'apiKey', + name: 'Authorization', + in: 'headers' + } + }, + basePath: '/api', + }, + swagger: '2.0', + apis: ['./dist/Controllers/**/routes.js'], + }; + const swaggerSpec = swaggerJsDoc(options); + return swaggerSpec; + } + + public run = async (): Promise => { + try { + const { app, config: { port, mongoUrl } }: Server = this; + await Database.open(mongoUrl); + app.listen(port, (err) => { + if (err) { + console.log(err); } - catch (err) { - console.log(err); - } - return this; - } - public initBodyParser = () => { - const { app } = this; - app.use(bodyParser.urlencoded({ extended: false })); - app.use(bodyParser.json()); + console.log(`Express app Successfully started on port : ${port} `); + }); } - public setupRoutes = (): void => { - const { app }: Server = this; - this.app.use('/swagger', swaggerUI.serve, swaggerUI.setup(this.initSwagger())); - app.get('/health-check', (req: express.Request, res: express.Response) => res.send('I am OK')); - app.use('/api', mainRouter); - app.use(notFoundRoute); - app.use(errorHandler); + catch (err) { + throw err; } + return this; + } + + public initBodyParser = () => { + const { app } = this; + app.use(bodyParser.urlencoded({ extended: false })); + app.use(bodyParser.json()); + } + + public setupRoutes = (): void => { + const { app }: Server = this; + this.app.use('/swagger', swaggerUI.serve, swaggerUI.setup(this.initSwagger())); + app.get('/health-check', (req: express.Request, res: express.Response) => res.send('I am OK')); + app.use('/api', mainRouter); + app.use(notFoundRoute); + app.use(errorHandler); + } } diff --git a/src/config/IConfig.ts b/src/config/IConfig.ts index 15d3bc0..cbb0b53 100644 --- a/src/config/IConfig.ts +++ b/src/config/IConfig.ts @@ -1,7 +1,7 @@ export interface IConfig { - Port: string; - NODE_ENV: string; - Key: string; - MongoURL: string; - Password: string; -} \ No newline at end of file + port: string; + nodeEnv: string; + key: string; + mongoUrl: string; + password: string; +} diff --git a/src/config/configuration.ts b/src/config/configuration.ts index 95f817c..d28ee29 100644 --- a/src/config/configuration.ts +++ b/src/config/configuration.ts @@ -1,12 +1,13 @@ import { IConfig } from './IConfig'; import { config } from 'dotenv'; + config(); const configuration: IConfig = { - Port : process.env.PORT, - NODE_ENV : process.env.NODE_ENV, - Key : process.env.SECRET_KEY, - MongoURL: process.env.MONGO_URL, - Password: process.env.PASSWORD, + port : process.env.PORT, + nodeEnv : process.env.NODE_ENV, + key : process.env.SECRET_KEY, + mongoUrl: process.env.MONGO_URL, + password: process.env.PASSWORD, }; Object.freeze(configuration); -export default configuration; \ No newline at end of file +export default configuration; diff --git a/src/index.ts b/src/index.ts index 7318eb8..d7e9847 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import { Server } from './Server'; import config from './config/configuration'; + const server: Server = new Server(config); server.bootstrap(); server.run(); -server.initSwagger(); \ No newline at end of file +server.initSwagger(); diff --git a/src/libs/Database.ts b/src/libs/Database.ts index 551cad8..e930b99 100644 --- a/src/libs/Database.ts +++ b/src/libs/Database.ts @@ -1,22 +1,22 @@ import * as mongoose from 'mongoose'; import seedData from './seedData'; -export default class Database { - static open = (mongoURL) => { - const promise = new Promise(( resolve, reject ) => { - mongoose.connect(mongoURL, { useNewUrlParser: true, useUnifiedTopology: true }, (err) => { - if (err) { - reject(err); - } - console.log('Database Connected at :', mongoURL); - seedData(); - resolve(); - }); - }); - return promise; - } - static disconnect = () => { - mongoose.connection.close(); - console.log('Database disconnected'); - } ; -} \ No newline at end of file +export default class Database { + static open = (mongoUrl) => { + const promise = new Promise((resolve, reject) => { + mongoose.connect(mongoUrl, { useNewUrlParser: true, useUnifiedTopology: true }, (err) => { + if (err) { + reject(err); + } + console.log('Database Connected at :', mongoUrl); + seedData(); + resolve(); + }); + }); + return promise; + } + static disconnect = () => { + mongoose.connection.close(); + console.log('Database disconnected'); + }; +} diff --git a/src/libs/routes/authMiddleWare.ts b/src/libs/routes/authMiddleWare.ts index 29de1c3..098888c 100644 --- a/src/libs/routes/authMiddleWare.ts +++ b/src/libs/routes/authMiddleWare.ts @@ -4,16 +4,18 @@ import hasPermission from '../hasPermission'; import { Request, Response, NextFunction } from 'express'; import UserRepository from '../../repositories/user/UserRepository'; import IUserModel from '../../repositories/user/IUserModel'; + interface IRequest extends Request { user: IUserModel; } + const authMiddleWare = (module, permissionType) => async (req: IRequest, res: Response, next: NextFunction) => { console.log('------------AUTHMIDDLEWARE------------', module, permissionType); try { const token: string = req.headers.authorization; console.log(token); - const { Key } = config; - const decodedUser = jwt.verify(token, Key); + const { key } = config; + const decodedUser = jwt.verify(token, key); if (!decodedUser) { return next({ status: 403, @@ -46,4 +48,5 @@ const authMiddleWare = (module, permissionType) => async (req: IRequest, res: Re }); } }; -export { authMiddleWare }; \ No newline at end of file + +export { authMiddleWare }; diff --git a/src/libs/routes/validationHandler.ts b/src/libs/routes/validationHandler.ts index ac8b07e..f881ca5 100644 --- a/src/libs/routes/validationHandler.ts +++ b/src/libs/routes/validationHandler.ts @@ -1,85 +1,86 @@ import { Request, Response, NextFunction } from 'express'; + export default (config) => { - return (req: Request, res: Response, next: NextFunction) => { + return (req: Request, res: Response, next: NextFunction) => { console.log('---------Validation Handler---------'); console.log(config); console.log(req.body); const err = []; Object.keys(config).forEach(key => { - console.log(`---------${ key }---------`); - const { errorMessage } = config[key]; - const { in: reqType } = config[key]; - reqType.forEach(reqMethod => { + console.log(`---------${key}---------`); + const { errorMessage } = config[key]; + const { in: reqType } = config[key]; + reqType.forEach(reqMethod => { const keyValue = req[reqMethod][key]; - if ( config[key].required === true ) { - if ( keyValue === undefined || keyValue === null ) { - const obj = { - location: `${ reqMethod}`, - msg: `${ errorMessage }`, - param: `${ key }` , - value: `${keyValue}` - }; - obj[reqMethod] = obj.param; - delete obj.param; - err.push(obj); - } - if (config[key].regex !== undefined) { - const { regex } = config[key]; - if (!regex.test(keyValue)) { - const obj = { - location: `${ reqMethod}`, - msg: `${ key } is invalid`, - param: `${ key }` , - value: `${keyValue}` - }; - obj[reqMethod] = obj.param; - delete obj.param; - err.push(obj); - } + if (config[key].required === true) { + if (keyValue === undefined || keyValue === null) { + const obj = { + location: `${reqMethod}`, + msg: `${errorMessage}`, + param: `${key}`, + value: `${keyValue}` + }; + obj[reqMethod] = obj.param; + delete obj.param; + err.push(obj); + } + if (config[key].regex !== undefined) { + const { regex } = config[key]; + if (!regex.test(keyValue)) { + const obj = { + location: `${reqMethod}`, + msg: `${key} is invalid`, + param: `${key}`, + value: `${keyValue}` + }; + obj[reqMethod] = obj.param; + delete obj.param; + err.push(obj); } + } } else { - if (config[key].regex !== undefined && keyValue !== undefined ) { - console.log('inside regex'); - const { regex } = config[key]; - if (!regex.test(keyValue)) { - const obj = { - location: `${ reqMethod}`, - msg: `${ key } is invalid`, - param: `${ key }` , - value: `${keyValue}` - }; - obj[reqMethod] = obj.param; - delete obj.param; - err.push(obj); - } + if (config[key].regex !== undefined && keyValue !== undefined) { + console.log('inside regex'); + const { regex } = config[key]; + if (!regex.test(keyValue)) { + const obj = { + location: `${reqMethod}`, + msg: `${key} is invalid`, + param: `${key}`, + value: `${keyValue}` + }; + obj[reqMethod] = obj.param; + delete obj.param; + err.push(obj); } + } } - if (config[key].custom !== undefined ) - if (config[key].custom(reqMethod, req, res, next )) { - const obj = { - location: `${ reqMethod}`, - msg: `${ errorMessage }`, - param: `${ key }` , - value: `${keyValue}` - }; - obj[reqMethod] = obj.param; - delete obj.param; - err.push(obj); - } - }); + if (config[key].custom !== undefined) + if (config[key].custom(reqMethod, req, res, next)) { + const obj = { + location: `${reqMethod}`, + msg: `${errorMessage}`, + param: `${key}`, + value: `${keyValue}` + }; + obj[reqMethod] = obj.param; + delete obj.param; + err.push(obj); + } + }); }); if (err.length === 0) - return next(); + return next(); else { - console.log(err); - const error = { - message: 'Error Occurred', - status: 400 , - error: err, - }; - console.log(error); - return next(error); + console.log(err); + const error = { + message: 'Error Occurred', + status: 400, + error: err, + }; + console.log(error); + return next(error); } - } ; -}; \ No newline at end of file + }; +}; diff --git a/src/libs/seedData.ts b/src/libs/seedData.ts index 3fc9071..2f7c343 100644 --- a/src/libs/seedData.ts +++ b/src/libs/seedData.ts @@ -1,25 +1,31 @@ import * as bcrypt from 'bcrypt'; import UserRepository from '../repositories/user/UserRepository'; import config from '../config/configuration'; -const seedData = async () => { - const user = { - name: 'Vinay Chaudhary', - address: 'Ghaziabad', - email: 'vinay.chaudhary@successive.tech', - dob: '07/25/1998', - mob: 7789839178, - hobbies: ['watching movies', 'hiking'] , - role: 'head-trainer' - }; - const count = await UserRepository.count(); + +const seedData = async () => { + const user = { + name: 'Vinay Chaudhary', + address: 'Ghaziabad', + email: 'vinay.chaudhary@successive.tech', + dob: '07/25/1998', + mob: 7789839178, + hobbies: ['watching movies', 'hiking'], + role: 'head-trainer' + }; + + try { + const count = await UserRepository.count(); if (count === 0) { - const { Password } = config; - const hash = await bcrypt.hash(Password, 10); - UserRepository.create(undefined, { ...user, password: hash }); - console.log('Data seeded'); + const { password } = config; + const hash = await bcrypt.hash(password, 10); + UserRepository.create(undefined, { ...user, password: hash }); + console.log('Data seeded'); } else - console.log(`Data is already seeded`); - + console.log(`Data is already seeded`); + } catch (err) { + throw err; + } }; -export default seedData; \ No newline at end of file + +export default seedData; diff --git a/src/repositories/user/UserRepository.ts b/src/repositories/user/UserRepository.ts index a75ab51..34d84a1 100644 --- a/src/repositories/user/UserRepository.ts +++ b/src/repositories/user/UserRepository.ts @@ -2,37 +2,44 @@ import * as mongoose from 'mongoose'; import IUserModel from './IUserModel'; import { userModel } from './UserModel'; import { VersionableRepository } from '../versionable'; + class UserRepository extends VersionableRepository> { - constructor() { - super(userModel); - } - create = (creatorId, data) => { - return super.create(creatorId, data); - } - delete = (req, id) => { - console.log(id); - return super.delete(req, id); - } - update = (req, id, updatedData) => { - return super.update(req, id, updatedData); - } - count = () => { - return this.versionModel.countDocuments(); - } - countTrainee = () => { - return this.versionModel.countDocuments({role: 'trainee', deletedAt: {$exists: false}}); - } - list = (userRole, skip, limit, sort, searchBy) => { - return super.list(userRole, skip, limit, sort, searchBy); - } - findOne = (id) => { - return this.versionModel.findOne({originalId: id}).exec(); - } - findByEmail = (emailId) => { - return this.versionModel.findOne({email: emailId, deletedAt: undefined}); - } - // createIndexes = (searchBy: string, search: string): IUserModel => { - // return this.versionModel.createIndexes({ name : 'text', email: 'text' ); - // } + constructor() { + super(userModel); + } + + create = (creatorId, data) => { + return super.create(creatorId, data); + } + + delete = (userId, id) => { + console.log(id); + return super.delete(userId, id); + } + + update = (userId, id, updatedData) => { + return super.update(userId, id, updatedData); + } + + count = () => { + return this.versionModel.countDocuments(); + } + + countTrainee = () => { + return this.versionModel.countDocuments({ role: 'trainee', deletedAt: { $exists: false } }); + } + + list = (userRole, skip, limit, sort, searchBy) => { + return super.list(userRole, skip, limit, sort, searchBy); + } + + findOne = (id) => { + return this.versionModel.findOne({ originalId: id }).exec(); + } + + findByEmail = (emailId) => { + return this.versionModel.findOne({ email: emailId, deletedAt: undefined }); + } } + export default new UserRepository(); diff --git a/src/repositories/versionable/VersionableRepository.ts b/src/repositories/versionable/VersionableRepository.ts index 6257220..e225363 100644 --- a/src/repositories/versionable/VersionableRepository.ts +++ b/src/repositories/versionable/VersionableRepository.ts @@ -19,20 +19,18 @@ export default class VersionRepository< D extends mongoose.Document, M extends m createdAt: Date.now(), }); } - async delete(req, id) { + async delete(userId, id) { const oldData: any = await this.versionModel.findOne({originalId: id , deletedAt: undefined}).exec(); return this.versionModel.findByIdAndUpdate( oldData._id , { deletedAt: Date.now(), - deletedBy: req.user._id + deletedBy: userId } ); } - async update(req, id, updatedData) { + async update(userId, id, updatedData) { const oldData: any = await this.versionModel.findOne({originalId: id , deletedAt: undefined}).exec(); const { name, address, email, dob, mob, hobbies, role, password} = oldData; - if ( updatedData.name !== undefined) - updatedData.name = updatedData.name.toLowerCase(); if ( updatedData.email !== undefined) updatedData.email = updatedData.email.toLowerCase(); const bool = await this.versionModel.findOne({email: updatedData.email, deletedAt: undefined}); @@ -44,12 +42,12 @@ export default class VersionRepository< D extends mongoose.Document, M extends m password, originalId: id, updatedAt: Date.now(), - updatedBy: req.user._id + updatedBy: userId, }); return this.versionModel.findByIdAndUpdate( oldData._id , { deletedAt: Date.now(), - deletedBy: req.user._id + deletedBy: userId, } ); } diff --git a/src/router.ts b/src/router.ts index 5d4cf90..faf650a 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,6 +1,8 @@ import { Router } from 'express'; import { traineeRouter, userRouter } from './Controllers'; + const mainRouter: Router = Router(); mainRouter.use('/trainee', traineeRouter); mainRouter.use('/user', userRouter); -export default mainRouter; \ No newline at end of file + +export default mainRouter; From 9ab6bd21c2f08be3a8d4231ec6c23694535f1164 Mon Sep 17 00:00:00 2001 From: Aryan Singhal Date: Fri, 20 Mar 2020 17:43:27 +0530 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20add=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 4 +- src/Controllers/trainee/Controller.ts | 12 +- src/Controllers/trainee/routes.ts | 17 ++- src/Controllers/user/Controller.ts | 7 +- src/libs/constant.ts | 4 +- src/libs/routes/authMiddleWare.ts | 2 +- src/repositories/user/UserRepository.ts | 19 +-- .../versionable/VersionableRepository.ts | 116 +++++++++--------- 8 files changed, 96 insertions(+), 85 deletions(-) diff --git a/.env b/.env index 15ba9fd..f7da912 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -PORT=9000 +PORT=9001 NODE_ENV=dev SECRET_KEY=qwertyuiopasdfghjklzxcvbnm123456 MONGO_URL=mongodb://localhost:27017/express-training -PASSWORD=aryan@123 \ No newline at end of file +PASSWORD=aryan@123 diff --git a/src/Controllers/trainee/Controller.ts b/src/Controllers/trainee/Controller.ts index cbe548b..fd3d59b 100644 --- a/src/Controllers/trainee/Controller.ts +++ b/src/Controllers/trainee/Controller.ts @@ -25,7 +25,7 @@ class TraineeController { const hash = await bcrypt.hash(password, 10); email = email.toLowerCase(); name = name; - const validity = await userRepository.findByEmail(email); + const validity = await userRepository.findOne({ email }); if (validity) { throw { msg: 'Email id already exist', @@ -33,7 +33,7 @@ class TraineeController { } const userData = await userRepository.create(req.user._id, { name, address, email, dob, mob, hobbies, role, password: hash }); const message = 'Trainee added successfully'; - userData.password = '*****'; + userData.password = undefined; console.log(userData); SystemResponse.success(res, userData, message); } @@ -45,14 +45,16 @@ class TraineeController { list = async (req: Request, res: Response) => { console.log('----------Trainee List----------'); console.log(`req.query.skip = ${req.query.skip},req.query.limit = ${req.query.limit}`); - const { order, sortBy, search } = req.query; + const { order, sortBy, search, skip, limit } = req.query; try { const sort = sortQuery(sortBy, order); const searchBy = searchQuery(search); + const options = { skip, limit, userRole: 'trainee' }; + const projection = { password: 0 }; let dataList; - dataList = await userRepository.list('trainee', req.query.skip, req.query.limit, sort, searchBy); + dataList = await userRepository.list({ sort, searchBy }, projection, options); console.log(dataList); - const count = await userRepository.countTrainee(); + const count = await userRepository.count({ role: 'trainee' }); const message = 'Trainee List , No. of trainee: ' + count; const data = { Count: count, ...dataList }; SystemResponse.success(res, data, message); diff --git a/src/Controllers/trainee/routes.ts b/src/Controllers/trainee/routes.ts index 8c8deaa..acce85d 100644 --- a/src/Controllers/trainee/routes.ts +++ b/src/Controllers/trainee/routes.ts @@ -2,6 +2,7 @@ import { Router } from 'express'; import controller from './Controller'; import { validationHandler, authMiddleWare } from '../../libs/routes'; import { default as validation } from './validation'; + const traineeRouter: Router = Router(); /** * @swagger @@ -143,6 +144,7 @@ traineeRouter.route('/') * $ref: '#/definitions/Unauthorized' */ .get(authMiddleWare('traineeModule', 'read'), validationHandler(validation.get), controller.list) + /** * @swagger * @@ -175,10 +177,6 @@ traineeRouter.route('/') * type: object * allOf: * - $ref: '#/definitions/TraineeResponse' - * properties: - * password: - * type: string - * example: "*****" * 403: * description: unauthorised access * schema: @@ -225,12 +223,20 @@ traineeRouter.route('/') * type: object * allOf: * - $ref: '#/definitions/TraineeResponse' + * properties: + * updatedAt: + * type: string + * example: "2020-02-21T11:40:19.325Z" + * updatedBy: + * type: string + * example: 5e45404398e86d576ad964e6 * 403: * description: unauthorised access * schema: * $ref: '#/definitions/Unauthorized' */ .put(authMiddleWare('traineeModule', 'write'), validationHandler(validation.update), controller.update); + /** * @swagger * @@ -252,7 +258,7 @@ traineeRouter.route('/') * 200: * description: Data deleted * schema: - * allOf: + * oneOf: * properties: * status: * example: Ok @@ -267,4 +273,5 @@ traineeRouter.route('/') */ traineeRouter.route('/:id') .delete(authMiddleWare('traineeModule', 'delete'), validationHandler(validation.delete), controller.delete); + export default traineeRouter; diff --git a/src/Controllers/user/Controller.ts b/src/Controllers/user/Controller.ts index ecc0790..01f6805 100644 --- a/src/Controllers/user/Controller.ts +++ b/src/Controllers/user/Controller.ts @@ -7,6 +7,7 @@ import config from '../../config/configuration'; class Controller { static instance: Controller; + static getInstance = () => { if (Controller.instance) { return Controller.instance; @@ -16,22 +17,24 @@ class Controller { return Controller.instance; } } + me = (req, res: Response) => { console.log('--------------me-------------'); try { - delete req.user.password; + req.user.password = undefined; SystemResponse.success(res, req.user, 'User data fetched'); } catch (err) { SystemResponse.failure(res, err.message); } } + login = async (req, res: Response) => { console.log('--------------Login-------------'); try { const { email, password } = req.body; console.log(email, password); - const user = await userRepository.findByEmail(email); + const user = await userRepository.findOne({email}); if (!user) { return SystemResponse.failure(res, 'User data not found', 'User not found', 404); } diff --git a/src/libs/constant.ts b/src/libs/constant.ts index b23a074..0a445c4 100644 --- a/src/libs/constant.ts +++ b/src/libs/constant.ts @@ -1,4 +1,5 @@ import { Ipermission } from './interface'; + const permissions: Ipermission = { 'getUsers': { all: ['head-trainer'], @@ -19,4 +20,5 @@ const permissions: Ipermission = { delete: ['admin'], } }; -export { permissions }; \ No newline at end of file + +export { permissions }; diff --git a/src/libs/routes/authMiddleWare.ts b/src/libs/routes/authMiddleWare.ts index 098888c..9bca1e0 100644 --- a/src/libs/routes/authMiddleWare.ts +++ b/src/libs/routes/authMiddleWare.ts @@ -24,7 +24,7 @@ const authMiddleWare = (module, permissionType) => async (req: IRequest, res: Re }); } console.log(decodedUser); - const userData = await UserRepository.findOne(decodedUser._id); + const userData = await UserRepository.findOne({originalId: decodedUser._id}); console.log(userData); req.user = userData; const role: string = userData.role; diff --git a/src/repositories/user/UserRepository.ts b/src/repositories/user/UserRepository.ts index 34d84a1..6074050 100644 --- a/src/repositories/user/UserRepository.ts +++ b/src/repositories/user/UserRepository.ts @@ -21,25 +21,18 @@ class UserRepository extends VersionableRepository { - return this.versionModel.countDocuments(); + count = (query = {}) => { + return this.versionModel.countDocuments({ ...query, deletedAt: { $exists: false } }); } - countTrainee = () => { - return this.versionModel.countDocuments({ role: 'trainee', deletedAt: { $exists: false } }); + list = (query, projection, options) => { + return super.list(query, projection, options); } - list = (userRole, skip, limit, sort, searchBy) => { - return super.list(userRole, skip, limit, sort, searchBy); + findOne = (item) => { + return this.versionModel.findOne({ ...item, deletedAt: undefined }); } - findOne = (id) => { - return this.versionModel.findOne({ originalId: id }).exec(); - } - - findByEmail = (emailId) => { - return this.versionModel.findOne({ email: emailId, deletedAt: undefined }); - } } export default new UserRepository(); diff --git a/src/repositories/versionable/VersionableRepository.ts b/src/repositories/versionable/VersionableRepository.ts index e225363..6c9e27a 100644 --- a/src/repositories/versionable/VersionableRepository.ts +++ b/src/repositories/versionable/VersionableRepository.ts @@ -1,61 +1,65 @@ import * as mongoose from 'mongoose'; import { IVersionableDocument, VersionableRepository } from '.'; -export default class VersionRepository< D extends mongoose.Document, M extends mongoose.Model > { - protected versionModel: M ; - constructor(versionModel) { - this.versionModel = versionModel; - } - public static generateObjectId = () => { - return String(mongoose.Types.ObjectId()); - } - public create(creatorId, data) { - const id = VersionableRepository.generateObjectId(); - return this.versionModel.create({ - ...data, - _id: id, - originalId: id, - createdBy: creatorId, - createdAt: Date.now(), - }); - } - async delete(userId, id) { - const oldData: any = await this.versionModel.findOne({originalId: id , deletedAt: undefined}).exec(); - return this.versionModel.findByIdAndUpdate( oldData._id , - { - deletedAt: Date.now(), - deletedBy: userId - } - ); - } - async update(userId, id, updatedData) { - const oldData: any = await this.versionModel.findOne({originalId: id , deletedAt: undefined}).exec(); - const { name, address, email, dob, mob, hobbies, role, password} = oldData; - if ( updatedData.email !== undefined) - updatedData.email = updatedData.email.toLowerCase(); - const bool = await this.versionModel.findOne({email: updatedData.email, deletedAt: undefined}); - console.log(updatedData.email, email , bool, updatedData.email !== email); - if ( !(updatedData.email !== email && updatedData.email !== undefined && bool !== null)) { - this.versionModel.create({ - name, address, email, dob, mob, hobbies, role, - ...updatedData, - password, - originalId: id, - updatedAt: Date.now(), - updatedBy: userId, - }); - return this.versionModel.findByIdAndUpdate( oldData._id , - { - deletedAt: Date.now(), - deletedBy: userId, - } - ); - } - else { - return false; - } - } - public list(userRole, skipRecord, limitRecord, sort, searchBy) { - return this.versionModel.find({deletedAt: undefined, role: userRole, ...searchBy}, {password: 0}).sort(sort).skip(Number(skipRecord)).limit(Number(limitRecord)); +export default class VersionRepository> { + protected versionModel: M; + constructor(versionModel) { + this.versionModel = versionModel; + } + + public static generateObjectId = () => { + return String(mongoose.Types.ObjectId()); + } + + public create(creatorId, data) { + const id = VersionableRepository.generateObjectId(); + return this.versionModel.create({ + ...data, + _id: id, + originalId: id, + createdBy: creatorId, + createdAt: Date.now(), + }); + } + + async delete(userId, id) { + const oldData: any = await this.versionModel.findOne({ originalId: id, deletedAt: undefined }); + return this.versionModel.findByIdAndUpdate(oldData._id, + { + deletedAt: Date.now(), + deletedBy: userId + } + ); + } + + async update(userId, id, updatedData) { + const oldData: any = await this.versionModel.findOne({ originalId: id, deletedAt: undefined }); + const { name, address, email, dob, mob, hobbies, role, password } = oldData; + if (updatedData.email !== undefined) + updatedData.email = updatedData.email.toLowerCase(); + const bool = await this.versionModel.findOne({ email: updatedData.email, deletedAt: undefined }); + if (updatedData.email !== email && updatedData.email !== undefined && bool !== null) { + return false; } + this.versionModel.create({ + name, address, email, dob, mob, hobbies, role, + ...updatedData, + password, + originalId: id, + updatedAt: Date.now(), + updatedBy: userId, + }); + return this.versionModel.findByIdAndUpdate(oldData._id, + { + deletedAt: Date.now(), + deletedBy: userId, + } + ); + } + + public list(query, projection, options) { + const { searchBy, sort } = query; + const { userRole, skip: skipRecord, limit: limitRecord } = options; + return this.versionModel.find({ deletedAt: undefined, role: userRole, ...searchBy }, projection).sort(sort).skip(Number(skipRecord)).limit(Number(limitRecord)); + } } From 7cffaf4dafceebd1ade3824975d54e51fab6ebef Mon Sep 17 00:00:00 2001 From: Aryan Singhal Date: Fri, 20 Mar 2020 18:11:10 +0530 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20optimize=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extra/constant.js | 3 ++- src/Controllers/trainee/Controller.ts | 28 +++++++++++++-------------- src/Server.ts | 25 ++++-------------------- src/libs/constant.ts | 21 +++++++++++++++++++- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/extra/constant.js b/extra/constant.js index f8d24eb..62661a4 100644 --- a/extra/constant.js +++ b/extra/constant.js @@ -12,4 +12,5 @@ const permissions={ delete: ['admin'], } }; -export {permissions}; \ No newline at end of file + +export {permissions}; diff --git a/src/Controllers/trainee/Controller.ts b/src/Controllers/trainee/Controller.ts index fd3d59b..e808d4e 100644 --- a/src/Controllers/trainee/Controller.ts +++ b/src/Controllers/trainee/Controller.ts @@ -28,7 +28,7 @@ class TraineeController { const validity = await userRepository.findOne({ email }); if (validity) { throw { - msg: 'Email id already exist', + message: 'Email id already exist', }; } const userData = await userRepository.create(req.user._id, { name, address, email, dob, mob, hobbies, role, password: hash }); @@ -38,7 +38,7 @@ class TraineeController { SystemResponse.success(res, userData, message); } catch (error) { - return SystemResponse.failure(res, error, error.msg || 'User is not created'); + return SystemResponse.failure(res, error, error.message || 'User is not created'); } }; @@ -67,17 +67,16 @@ class TraineeController { update = async (req, res: Response) => { console.log('----------Update Trainee----------'); try { - const value = await userRepository.update(req.user._id, req.body.id, req.body.dataToUpdate); - if (value) { - const message = 'Trainee Data successfully Updated'; - const data = req.body.dataToUpdate; - SystemResponse.success(res, data, message); + const updatedData = await userRepository.update(req.user._id, req.body.id, req.body.dataToUpdate); + if (!updatedData) { + throw { message: 'Operation Failed' }; } - else - return SystemResponse.failure(res, 'User data is not Updated', 'Email id already exist'); + const message = 'Trainee Data successfully Updated'; + updatedData.password = undefined; + SystemResponse.success(res, updatedData, message); } catch (error) { - return SystemResponse.failure(res, error, 'User data is not Updated'); + return SystemResponse.failure(res, error.message, 'User data is not Updated'); } }; @@ -85,13 +84,14 @@ class TraineeController { console.log('----------Delete Trainee----------'); try { const value = await userRepository.delete(req.user._id, req.params.id); - if (value) { - const message = 'Trainee Data Successfully Deleted'; - SystemResponse.success(res, req.params.id, message); + if (!value) { + throw { message: 'Operation Failed' }; } + const message = 'Trainee Data Successfully Deleted'; + SystemResponse.success(res, req.params.id, message); } catch (error) { - return SystemResponse.failure(res, error, 'User data is not deleted'); + return SystemResponse.failure(res, error.message , 'User data is not deleted'); } }; } diff --git a/src/Server.ts b/src/Server.ts index 0081f61..74cd0c6 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -1,10 +1,11 @@ import * as express from 'express'; -import * as bodyParser from 'body-parser'; -import { notFoundRoute, errorHandler } from './libs/routes'; import { default as mainRouter } from './router'; -import Database from './libs/Database'; +import * as bodyParser from 'body-parser'; import * as swaggerJsDoc from 'swagger-jsdoc'; import * as swaggerUI from 'swagger-ui-express'; +import { notFoundRoute, errorHandler } from './libs/routes'; +import Database from './libs/Database'; +import { options } from './libs/constant'; export class Server { private app: express.Express; @@ -19,24 +20,6 @@ export class Server { } public initSwagger = () => { - const options = { - definition: { - info: { - title: 'Javascript-Server API', - version: '1.0.0', - }, - securityDefinitions: { - Bearer: { - type: 'apiKey', - name: 'Authorization', - in: 'headers' - } - }, - basePath: '/api', - }, - swagger: '2.0', - apis: ['./dist/Controllers/**/routes.js'], - }; const swaggerSpec = swaggerJsDoc(options); return swaggerSpec; } diff --git a/src/libs/constant.ts b/src/libs/constant.ts index 0a445c4..fc156b9 100644 --- a/src/libs/constant.ts +++ b/src/libs/constant.ts @@ -21,4 +21,23 @@ const permissions: Ipermission = { } }; -export { permissions }; +const options = { + definition: { + info: { + title: 'Javascript-Server API', + version: '1.0.0', + }, + securityDefinitions: { + Bearer: { + type: 'apiKey', + name: 'Authorization', + in: 'headers' + } + }, + basePath: '/api', + }, + swagger: '2.0', + apis: ['./dist/Controllers/**/routes.js'], +}; + +export { permissions, options };