diff --git a/.env.example b/.env.example index cb9285e..af92940 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,6 @@ EMAIL_USERNAME=krish@sentientgeeks.com EMAIL_PASSWORD=123456 NODE_ENV=development PORT=3000 -MONGO_URI_TESTS=mongodb://mongodb:27017/sg-node-express-rest-api -MONGO_URI=mongodb://mongodb:27017/sg-node-express-rest-api +MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api +MONGO_URI=mongodb://localhost:27017/sg-node-express-rest-api JWT_EXPIRATION_MINUTES=300 \ No newline at end of file diff --git a/src/api/controllers/emp.controller.js b/src/api/controllers/emp.controller.js new file mode 100644 index 0000000..31a1e02 --- /dev/null +++ b/src/api/controllers/emp.controller.js @@ -0,0 +1,60 @@ +const Employee = require("../models/employee.model"); + +exports.empreg = async (req, res, next) => { + try { + const employee = new Employee(req.body); + const savedEmployee = await employee.save(); + res.status(201).send(employee); + } catch (error) { + res.status(400).send(error); + } + }; + + // router.get('/student/:id', + exports.empget = async (req, res) => { + const employee = await Employee.findById(req.params.id); + res.send(employee); + }; + + //router.put("/updatestudent/:id", + exports.empupdate = async (req, res, next) => { + Employee.findByIdAndUpdate( + req.params.id, + { $set: req.body }, + function (err, employee) { + if (err) return next(err); + res.send("data udpated"); + } + ); + }; + + //router.delete("/deletestudent/:id", + exports.empdel = async (req, res) => { + Employee.findByIdAndRemove(req.params.id, function (err) { + if (err) return next(err); + res.send("data Deleted"); + }); + }; + + //post with id + exports.emppost = async (req, res, next) => { + try { + const id = req.params.id + const employee = new Employee({...req.body, user_id:id}); + const savedEmployee = await employee.save(); + res.status(201).send(employee); + } catch (error) { + res.status(400).send(error); + } + }; + // router.get('/showstudent', + exports.empshow = async (req, res) => { + const employee = await Employee.find( + {}, + { + _id: 0, + } + ); + res.send(employee); + }; + \ No newline at end of file diff --git a/src/api/controllers/user.controller.js b/src/api/controllers/user.controller.js index f14c8f2..937373e 100644 --- a/src/api/controllers/user.controller.js +++ b/src/api/controllers/user.controller.js @@ -1,6 +1,6 @@ -const httpStatus = require('http-status'); -const { omit } = require('lodash'); -const User = require('../models/user.model'); +const httpStatus = require("http-status"); +const { omit } = require("lodash"); +const User = require("../models/user.model"); /** * Load user and append to req. @@ -51,10 +51,9 @@ exports.replace = async (req, res, next) => { try { const { user } = req.locals; const newUser = new User(req.body); - const ommitRole = user.role !== 'admin' ? 'role' : ''; - const newUserObject = omit(newUser.toObject(), '_id', ommitRole); + const ommitRole = user.role !== "admin" ? "role" : ""; + const newUserObject = omit(newUser.toObject(), "_id", ommitRole); - res.json(savedUser.transform()); } catch (error) { next(User.checkDuplicateEmail(error)); @@ -66,13 +65,14 @@ exports.replace = async (req, res, next) => { * @public */ exports.update = (req, res, next) => { - const ommitRole = req.locals.user.role !== 'admin' ? 'role' : ''; + const ommitRole = req.locals.user.role !== "admin" ? "role" : ""; const updatedUser = omit(req.body, ommitRole); const user = Object.assign(req.locals.user, updatedUser); - user.save() - .then(savedUser => res.json(savedUser.transform())) - .catch(e => next(User.checkDuplicateEmail(e))); + user + .save() + .then((savedUser) => res.json(savedUser.transform())) + .catch((e) => next(User.checkDuplicateEmail(e))); }; /** @@ -82,7 +82,7 @@ exports.update = (req, res, next) => { exports.list = async (req, res, next) => { try { const users = await User.list(req.query); - const transformedUsers = users.map(user => user.transform()); + const transformedUsers = users.map((user) => user.transform()); res.json(transformedUsers); } catch (error) { next(error); @@ -96,7 +96,8 @@ exports.list = async (req, res, next) => { exports.remove = (req, res, next) => { const { user } = req.locals; - user.remove() + user + .remove() .then(() => res.status(httpStatus.NO_CONTENT).end()) - .catch(e => next(e)); + .catch((e) => next(e)); }; diff --git a/src/api/models/employee.model.js b/src/api/models/employee.model.js new file mode 100644 index 0000000..40c3d5c --- /dev/null +++ b/src/api/models/employee.model.js @@ -0,0 +1,35 @@ +const mongoose = require("mongoose"); + +const employeeSchema = new mongoose.Schema({ + fname: { + type: String, + maxlength: 128, + trim: true, + }, + lastname: { + type: String, + maxlength: 128, + trim: true, + }, + empid: { + type: String, + required: true, + unique: true, + }, + designation: { + type: String, + required: true, + }, + dateofjoining: { + type: String, + required: true, + }, + // userid (fkey of user) + user_id: { + type: mongoose.Schema.Types.ObjectId, + ref: "User", + required: true + } +}); + +module.exports = mongoose.model("Employee", employeeSchema); diff --git a/src/api/models/user.model.js b/src/api/models/user.model.js index e195957..22f660d 100644 --- a/src/api/models/user.model.js +++ b/src/api/models/user.model.js @@ -4,7 +4,8 @@ const { omitBy, isNil } = require('lodash'); const bcrypt = require('bcryptjs'); const moment = require('moment-timezone'); const jwt = require('jwt-simple'); -const uuidv4 = require('uuid/v4'); +// const uuidv4 = require('uuid/v4'); +const { v4: uuidv4 } = require('uuid'); const APIError = require('../utils/APIError'); const { env, jwtSecret, jwtExpirationInterval } = require('../../config/vars'); @@ -55,6 +56,11 @@ const userSchema = new mongoose.Schema({ timestamps: true, }); +userSchema.virtual('employee', { + ref: 'employee', + localField: '_id', + foreignField: 'user_id' +}) /** * Add your * - pre-save hooks diff --git a/src/api/routes/v1/auth.route.js b/src/api/routes/v1/auth.route.js index a339268..cfc43c2 100644 --- a/src/api/routes/v1/auth.route.js +++ b/src/api/routes/v1/auth.route.js @@ -43,7 +43,6 @@ const router = express.Router(); router.route('/register') .post(validate(register), controller.register); - /** * @api {post} v1/auth/login Login * @apiDescription Get an accessToken diff --git a/src/api/routes/v1/emp.route.js b/src/api/routes/v1/emp.route.js new file mode 100644 index 0000000..3d09fef --- /dev/null +++ b/src/api/routes/v1/emp.route.js @@ -0,0 +1,17 @@ +const express = require('express'); +const controller = require('../../controllers/emp.controller'); +const {employee} = require('../../validations/emp.validation'); +const { validate, ValidationError, Joi } = require('express-validation') +const router = express.Router(); + +router.route('/reg') + .post(validate(employee), controller.empreg) + .get( controller.empshow); + +router.route('/emp/:id') +.post(validate(employee), controller.emppost) +.get(controller.empget) +.put(validate(employee), controller.empupdate) +.delete(controller.empdel) + +module.exports = router; \ No newline at end of file diff --git a/src/api/routes/v1/index.js b/src/api/routes/v1/index.js index 40a552e..5f0a078 100644 --- a/src/api/routes/v1/index.js +++ b/src/api/routes/v1/index.js @@ -1,6 +1,7 @@ const express = require('express'); const userRoutes = require('./user.route'); const authRoutes = require('./auth.route'); +const empRoutes = require('./emp.route') const router = express.Router(); @@ -16,5 +17,6 @@ router.use('/docs', express.static('docs')); router.use('/users', userRoutes); router.use('/auth', authRoutes); +router.use('/emp', empRoutes); module.exports = router; diff --git a/src/api/routes/v1/user.route.js b/src/api/routes/v1/user.route.js index f57d830..02ccd5b 100644 --- a/src/api/routes/v1/user.route.js +++ b/src/api/routes/v1/user.route.js @@ -6,7 +6,7 @@ const { listUsers, createUser, replaceUser, - updateUser, + updateUser } = require('../../validations/user.validation'); const router = express.Router(); @@ -40,7 +40,8 @@ router * @apiError (Unauthorized 401) Unauthorized Only authenticated users can access the data * @apiError (Forbidden 403) Forbidden Only admins can access the data */ - .get(authorize(ADMIN), validate(listUsers), controller.list) + .get( validate(listUsers), controller.list) + //authorize(ADMIN), /** * @api {post} v1/users Create User * @apiDescription Create a new user @@ -66,8 +67,8 @@ router * @apiError (Unauthorized 401) Unauthorized Only authenticated users can create the data * @apiError (Forbidden 403) Forbidden Only admins can create the data */ - .post(authorize(ADMIN), validate(createUser), controller.create); - + .post( validate(createUser), controller.create); +//authorize(ADMIN), router .route('/profile') @@ -89,8 +90,8 @@ router * * @apiError (Unauthorized 401) Unauthorized Only authenticated Users can access the data */ - .get(authorize(), controller.loggedIn); - + .get( controller.loggedIn); +//authorize(), router .route('/:userId') @@ -114,7 +115,8 @@ router * @apiError (Forbidden 403) Forbidden Only user with same id or admins can access the data * @apiError (Not Found 404) NotFound User does not exist */ - .get(authorize(LOGGED_USER), controller.get) + .get(controller.get) + //authorize(LOGGED_USER), /** * @api {put} v1/users/:id Replace User * @apiDescription Replace the whole user document with a new one @@ -189,5 +191,4 @@ router */ .delete(authorize(LOGGED_USER), controller.remove); - module.exports = router; diff --git a/src/api/validations/auth.validation.js b/src/api/validations/auth.validation.js index 73679fb..bf405f2 100644 --- a/src/api/validations/auth.validation.js +++ b/src/api/validations/auth.validation.js @@ -66,4 +66,5 @@ module.exports = { resetToken: Joi.string().required(), }), }, + }; diff --git a/src/api/validations/emp.validation.js b/src/api/validations/emp.validation.js new file mode 100644 index 0000000..8c835af --- /dev/null +++ b/src/api/validations/emp.validation.js @@ -0,0 +1,19 @@ +const Joi = require('joi'); +const Employee = require('../models/employee.model'); + +module.exports = { + employee : { + body: Joi.object({ + fname: Joi.string() + .required() + .max(128), + lastname: Joi.string() + .required() + .max(128), + empid: Joi.string().required(), + designation: Joi.string().required(), + dateofjoining: Joi.string().required(), + user_id: Joi.required() + }) + } +} \ No newline at end of file diff --git a/src/api/validations/user.validation.js b/src/api/validations/user.validation.js index 95abbe9..ce234aa 100644 --- a/src/api/validations/user.validation.js +++ b/src/api/validations/user.validation.js @@ -1,5 +1,6 @@ const Joi = require('joi'); const User = require('../models/user.model'); +// const Employee = require('../models/employee.model'); module.exports = { @@ -48,5 +49,5 @@ module.exports = { params: { userId: Joi.string().regex(/^[a-fA-F0-9]{24}$/).required(), }, - }, + } }; diff --git a/src/config/vars.js b/src/config/vars.js index d3b7da5..cf04a51 100644 --- a/src/config/vars.js +++ b/src/config/vars.js @@ -1,7 +1,7 @@ const path = require('path'); // import .env variables -require('dotenv-safe').load({ +require('dotenv-safe').config({ path: path.join(__dirname, '../../.env'), sample: path.join(__dirname, '../../.env.example'), });