From d1dfb14d362dfdea6bc834bb2e91d153cf3b5ae4 Mon Sep 17 00:00:00 2001 From: geeknk Date: Mon, 6 Nov 2023 18:50:48 +0530 Subject: [PATCH] solved que 1 --- config/config.js | 4 +- controllers/userController.js | 147 ++++++++++++++++++---------------- middleware/mid_register.js | 19 +++-- model/userToken.js | 9 +++ routes/register.js | 11 ++- services/userservices.js | 104 ++++++++++++++++++++++++ 6 files changed, 212 insertions(+), 82 deletions(-) create mode 100644 model/userToken.js create mode 100644 services/userservices.js diff --git a/config/config.js b/config/config.js index f495807..5ddc956 100644 --- a/config/config.js +++ b/config/config.js @@ -4,11 +4,13 @@ env.config(); const portNo = process.env.PORT_NO const secretKey = process.env.SECRET_KEY const db_url = process.env.DB_URL +const JWT_EXPIRES_IN = process.env.JWT_EXPIRY module.exports = { portNo, secretKey, - db_url + db_url, + JWT_EXPIRES_IN } \ No newline at end of file diff --git a/controllers/userController.js b/controllers/userController.js index f646348..5f1f4f3 100644 --- a/controllers/userController.js +++ b/controllers/userController.js @@ -2,90 +2,99 @@ const config = require("../config/config"); const users = require("../model/userModel"); const bcrypt = require("bcryptjs"); const jwt = require("jsonwebtoken"); +const {updateuser1,getdata,matchpass,modifyPass,verifyemail,userlogin,usersignup,user_list} = require("../services/userservices") -exports.register_user = async (req, res) => { - let user = new users({ - username: req.body.username, - firstname: req.body.firstname, - lastname: req.body.lastname, - email: req.body.email, - password: req.body.password, - mobile: req.body.mobile, - address: req.body.address, - }); - const user_data = await user.save(); - return res.status(200).send({ success: true, data: user_data }); +exports.signup = async (req, res) => { + const data = await usersignup(req.body) + if(data){ + res.status(201).send({ success: true, msg:"User registered successfully", data: data }); + } }; exports.login_user = async (req, res) => { - const userData = await users.findOne({ email: req.body.email }); - const pass = bcrypt.compare(userData.password, req.body.password); - const token = jwt.sign( - { email: userData.email, id: userData._id }, - config.secretKey - ); - - if (userData && pass) { - res.status(200).send(token); - } else { + const loggedin = await userlogin(req.body) + if (!loggedin) { return res.status(401).send({ success: false, msg: "Email or Password is wrong" }); + } else { + res.status(200).send(loggedin); } }; exports.changePass = async (req, res) => { - const { password, new_password } = req.body; - if (password && new_password) { - if (password !== new_password) { - res.send({ status: "failed", message: "password dose not match" }); - } else { - await users.updateOne(req.data.email, { - password: password, - }); - res.send({ - status: "true", - message: "password reset successfully", - }); - } - } else { - req.send({ status: "failed", message: "All fields are required" }); + const validpass = await matchpass(req.body) + if(!validpass){ + return res.status(401).send({success: "failed", message: "password doesn't match" }); + }try { + modifyPass(req.data.email,req.body); + res.status(201).send({success: "true", message: "password changed" }); + } catch (error) { + res.status(401).send({success: "false", message: "password is not changed" }); } }; -exports.forgetPass = async (req, res) => { - const { password, new_password, email } = req.body; - const userData = await users.findOne({ email: email }); - if (userData) { - if (password && new_password) { - if (password !== new_password) { - res.send({ status: "failed", message: "password dose not match" }); - } else { - await users.updateOne( - { email }, - { - password: password, - } - ); - res.send({ status: "true", message: "password updated" }); - } - } else { - req.send({ status: "failed", message: "All fields are required" }); - } - } else { - res.send("account dosen't exist"); +exports.verifyuser = async(req,res) => { + const validuser = await verifyemail(req.body) + if(!validuser){ + res.status(401).send({success: "false", message: "user doesn't exist" }); + }else{ + res.status(201).send({success: "true", message: "user exist" }); + } +}; + +exports.forgetPass = async (req, res) => { + const validpass = await matchpass(req.body) + if(!validpass){ + return res.status(401).send({success: "failed", message: "password doesn't match" }); + }try { + modifyPass(req.data.email,req.body); + res.status(201).send({success: "true", message: "password updated" }); + } catch (error) { + res.status(401).send({success: "false", message: "password is not updated" }); } }; exports.updateuser = async (req, res) => { - const { username, firstname, lastname, password, mobile, uemail, address } = req.body; + try { + await updateuser1(req.data.email , req.body); + res.status(201).send({success: "true", message: "user updated successfully" }); + } catch (error) { + res.status(402).send({success: "false", message: "user not updated" }); + } +}; + +//get user data with the help of token (without body) + +exports.getuser = async (req, res) => { + try { + const userData = await getdata(req.data.email); + res.send(userData) + } catch (error) { + console.log(error) + res.status(402).send(error); + } +}; - await users.updateOne(req.data.email, { - username: username, - firstname: firstname, - lastname: lastname, - password: password, - mobile: mobile, - email: uemail, - address: address, - }); - res.send({ status: "true", message: "user updated successfully" }); +//get user data with the help of token (without email) + +exports.deluser = async (req, res) => { + try { + await deleteuser(req.data.email); + res.status(201).send({success: "true", message: "user deleted" }); + } catch (error) { + console.log(error) + res.status(402).send(error); + } }; + +// get user in the form of list (page wise) + +exports.userlist = async (req, res) => { + try{ + const data = await user_list(req.params.page) + if(data){ + res.status(201).send({success: "true", message: data }); + } + }catch(error){ + res.status(401).send({success: "false", message: "userdata not found" ,error}); + } +}; \ No newline at end of file diff --git a/middleware/mid_register.js b/middleware/mid_register.js index 7a72bc0..916b757 100644 --- a/middleware/mid_register.js +++ b/middleware/mid_register.js @@ -19,16 +19,15 @@ exports.checkAuth = async (req, res, next) => { if (typeof bearerHeader !== "undefined") { const bearer = bearerHeader.split(" "); const token = bearer[1]; - const {email}=jwt.verify(token, config.secretKey, async (err, authData) => { - if (err) { - res.send({ result: "invalid token" }); - } - }); - req.data= {email, token} - next(); + const {email}=jwt.verify(token, config.secretKey); + if(email){ + req.data= {email, token} + next(); + }else{ + res.status(403).send({"success":"false", msg:"email not found in token"}) + } + } else { - res.send({ - result: "Token is not valid", - }); + res.status(401).send({"success":"false", msg:"email not found in token"}) } }; diff --git a/model/userToken.js b/model/userToken.js new file mode 100644 index 0000000..a6d8671 --- /dev/null +++ b/model/userToken.js @@ -0,0 +1,9 @@ +const mongoose = require("mongoose"); +const user = mongoose.Schema({ + token:{ + type:String, + required:true + }, +}); + +module.exports = mongoose.model("usertoken",user) \ No newline at end of file diff --git a/routes/register.js b/routes/register.js index dbd5047..6283d48 100644 --- a/routes/register.js +++ b/routes/register.js @@ -8,11 +8,18 @@ const userController = require("../controllers/userController") // Route level middleware router.use('/changePassword',mid_register.checkAuth) router.use('/updateuser',mid_register.checkAuth) +router.use('/get',mid_register.checkAuth) +router.use('/delete',mid_register.checkAuth) +router.use('/verify-reset-password',mid_register.checkAuth) -router.get("/register",mid_register.REG_MIDDLE,userController.register_user); +router.get("/register",mid_register.REG_MIDDLE,userController.signup); +router.get("/get",userController.getuser); +router.get("/list/:page",userController.userlist); router.post("/auth/signin",userController.login_user); router.put("/changePassword",userController.changePass); -router.put("/forgetpassword",userController.forgetPass); +router.put("/verify-reset-password",userController.forgetPass); router.put("/updateuser",userController.updateuser); +router.put("/delete",userController.deluser); +router.post("/forgot-password",userController.verifyuser); module.exports=router; \ No newline at end of file diff --git a/services/userservices.js b/services/userservices.js new file mode 100644 index 0000000..acb5f1f --- /dev/null +++ b/services/userservices.js @@ -0,0 +1,104 @@ +const config = require("../config/config"); +const jwt = require("jsonwebtoken"); +const bcrypt = require("bcryptjs"); +const users = require("../model/userModel"); +const userToken = require("../model/userToken"); + +const getdata= async ({email})=>{ + return await users.findOne(email); +} + +const deleteuser = async ()=>{ + const data = await users.findOneAndDelete(req.data.email); + if (data) { + res.status(200).send({success: "true", message: "User deleted" }); + } +} + +const updateuser1 = async (data, body_data)=>{ + await users.updateOne(data.email, body_data); +} + +const matchpass = async (data) => { + return data.password===data.new_password +} + +const verifyemail = async (data) =>{ + const emailexist = await users.findOne({ email: data.email }); + + if(emailexist){ + const token = jwt.sign( + { email: emailexist.email, id: emailexist._id }, + config.secretKey, + {expiresIn:config.JWT_EXPIRES_IN} + ); + let user = new userToken({ + token: token + }); + await user.save(); + console.log("token saved"); + return true + }else{ + return false + } +} + +const modifyPass = async(email,data) =>{ + await users.updateOne( + { email }, + { + password: data.password, + } + ); +} + +const userlogin = async(data) =>{ + const userData = await users.findOne({ email: data.email }); + const pass = (userData.password === data.password) + + if(pass && userData){ + const token = jwt.sign( + { email: userData.email, id: userData._id }, + config.secretKey + ); + return token; + }else{ + return false + } +} + +const usersignup = async(data) =>{ + let user = new users({ + username: data.username, + firstname: data.firstname, + lastname: data.lastname, + email: data.email, + password: data.password, + mobile: data.mobile, + address: data.address, + }); + if(user){ + return await user.save(); + }else{ + return false; + } +}; + +const user_list = async (page)=>{ + firstindex = (page - 1)*10; + lastindex = page *10; + const data= await users.find(); + const sliced_data = data.slice(firstindex, lastindex); + return sliced_data; +} +module.exports={ + getdata, + deleteuser, + updateuser1, + modifyPass, + matchpass, + verifyemail, + user_list, + userlogin, + usersignup +} \ No newline at end of file