Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prikshit Rana - Case Study : StackOverflow || SwiggyIPP : Stage 2 #43

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
<Checkpoint:2> : Register and Login Functionality Added || Controller…
… and Routes added for user
prikshit-08 committed Jan 9, 2022
commit deb1ef2932e08908cafdf9fd77a8e6b155412a47
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import User from '../models/user.model.js'

console.log('[' + new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}) + '] ', User)

/**
* displayUserInfo : display user info
*/
export const displayUserInfo = (req, res) => {
console.log('[' + new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}) + '] ', req.user)
res.status(200).json({ message: "User Info", data: req.user})
}

/**
* updateUserInfo : update user info
*/
export const updateUserIndo = async (req, res) => {
try{
const user = await User.findByIdAndUpdate(req.user._id, req.body, {
new: true
})
.select("-updatedAt, -__v")
.lean()
.exec();

res.status(200).json({message: "User Updated Successfull", data: user})
}catch(e){
return res.status(400).send({data: e});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import express from 'express'
import {displayUserInfo, updateUserIndo} from '../controller/user.controller.js'
const router = express.Router()

//get user info
router.get('/', displayUserInfo)

//update user info
router.put('/', updateUserIndo)

export default router
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import config from "../config/index.js";
import User from "../models/user.model.js";
import jwt from "jsonwebtoken";

/**
* newToken : create New JWT token for user
*/
export const newToken = user => {
return jwt.sign({ id: user.id }, config.secrets.jwt, {
expiresIn: config.secrets.jwtExp
});
};

/**
* verifyToken : verify JWT token for user
*/
export const verifyToken = token =>
new Promise((resolve, reject) => {
jwt.verify(token, config.secrets.jwt, (err, payload) => {
if (err) return reject(err);
resolve(payload);
});
});

/**
* register : register user
* method-type = POST
* return-status:201
*/

export const register = async (req, res) => {
if (!req.body.email || !req.body.password) {
return res.status(400).send({ message: "Email and Password are required" });
}

try {
const user = await User.create(req.body);
const token = newToken(user);
return res.status(201).send({ message: "User registered Successfully" , registration_name: user._doc.firstName + " " + user._doc.lastName , email: user._doc.email ,access_token: token });
} catch (e) {
console.log('[' + new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'}) + '] ', e)
return res.status(500).end();
}
};

/**
* login : login user
* method-type = POST
* return-status:201 on success and 401 for invalid cred
*/
export const login = async (req, res) => {
if (!req.body.email || !req.body.password) {
return res.status(400).send({ message: "Email and Password are required" });
}

try {
const user = await User.findOne({ email: req.body.email })
.select("email password")
.exec();

if (!user) {
return res.status(401).send({ message: "Sorry invalid credentials" });
}

const match = await user.checkPassword(req.body.password);

if (!match) {
return res.status(401).send({ message: "Sorry invalid credentials" });
}

const token = newToken(user);
return res.status(201).send({ message: "User logged in successfully" , access_token: token });
} catch (e) {
res.status(500).end();
}
};

/**
* protect : check user is logged in before doing any operation
*/
export const protect = async (req, res, next) => {
const bearer = req.headers.authorization;
if (!bearer || !bearer.startsWith("Bearer ")) {
return res.status(401).end();
}

const token = bearer.split("Bearer ")[1].trim();
let payload;
try {
payload = await verifyToken(token);
} catch (e) {
return res.status(401).end();
}

const user = await User.findById(payload.id)
.select("-password, -updatedAt, -__v")
.lean()
.exec();


const invalidUser = { message: "Sorry invalid credentials" };

if (!user) {
return res.status(401).end();
}

req.user = user;
next();
};