ecommerce / backend / routes / user.js
user.js
Raw
const express = require('express');
const router = express.Router();
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
const zod = require('zod');
const { signUpBody, loginBody } = require('../types');
const { User } = require('../models/User');
const { fetchUser } = require('../controllers/fetchUser');
const { userAuth } = require('../middlewares/userAuth');

router.get('/me', userAuth, async (req, res) => {
    try {
        let user = await User.findOne({_id : req.userId}).select('-password');
        if (user) {
            res.status(200).json({user});
            return;
        } else {
            res.json({message:"failed to fetch user"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
});

router.post('/signUp', async (req, res) => {
    try {
        const {success} = signUpBody.safeParse(req.body);
        if (!success) {
            res.json({message:"Invalid Details"});
            return;
        }

        // checking for existing user
        let userExists = await fetchUser(req.body.email);
        if (userExists) {
            res.json({message:"User already exists"});
            return;
        }

        let { name, email, phone, password } = req.body;
        let salt = await bcrypt.genSalt(10);
        let hash = await bcrypt.hash(password, salt);

        let createdUser = await User.create({
            name,
            email,
            phone,
            password: hash
        })

        if (createdUser) {
            let userId = createdUser._id.toString();
            let token = jwt.sign({
                userId: userId
            }, process.env.SECRET_KEY);

            res.status(200).json({
                message: "success",
                token: token
            });
        } else {
            console.log(createdUser);
            res.json({message:"failed to create user"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});
    }
});


router.post('/signin', async (req, res) => {
    try {
        let {success} = loginBody.safeParse(req.body);
        if (!success) {
            res.json({message: "Invalid Credentials"});
            return;
        }

        let userExists = await fetchUser(req.body.email);
        if (!userExists) {
            res.json({message: "User does not exist"});
            return;
        }

        const checkPassword = await bcrypt.compare(req.body.password, userExists.password);
        if (checkPassword) {
            let token = jwt.sign({
                userId: userExists._id,
            }, process.env.SECRET_KEY);
            return res.status(200).json({
                message: "success",
                token: token
            })
        } else {
            return res.json({
                message: "Password is incorrect"
            })
        }        

    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
});

router.put('/edit', userAuth, async (req, res) => {
    try {
        let edited = false;
        let userId = req.userId;
        if (req.body.name) {
            await User.updateOne({_id: userId}, {name: req.body.name});
            edited = true;
        }

        if (req.body.phone) {
            await User.updateOne({_id: userId}, {phone: req.body.phone});
            edited = true;
        }

        if (req.body.password) {
            let password = req.body.password;
            if (password.length >= 6) {
                let salt = await bcrypt.genSalt(10);
                let hash = await bcrypt.hash(password, salt);
                await User.updateOne({_id: userId}, {password: hash});
                edited = true;
            } else {
                res.json({message:"The password must be at least 6 characters"});
                return;
            }
        }

        if (edited) {
            res.status(200).json({message:"Profile updated successfuly"});
        } else {
            res.json({message:"failed to update user"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});
    }
});

router.delete('/delete', userAuth, async (req, res) => {
    try {
        let userId = req.userId;
        let {deletedCount} = await User.deleteOne({_id: userId});
        if (deletedCount) {
            res.status(200).json({message:"User deleted successfully"});
        } else {
            res.json({message: "failed to delete user"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});
    }
});

module.exports = router;