ecommerce / backend / routes / cart.js
cart.js
Raw
const express = require('express');
const mongoose = require('mongoose');
const { User } = require('../models/User');
const { Product } = require('../models/Product');
const { userAuth } = require('../middlewares/userAuth');
const router = express.Router();

router.get('/', userAuth, async (req, res) => {
    try {
        let userId = req.userId;
        let userData = await User.findOne({_id: userId});
        let cart = [];
        if (userData) {
            cart = userData.cart;   
        } 
        let products = await Promise.all(cart.map(async (product) => {
            let productObj = await Product.findOne({_id: product})
            return productObj;
        }))
        res.json({products});
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});
    }
});

router.post('/add/:productId?', userAuth, async (req, res) => {
    try {
        let userId = req.userId;
        let productId = req.params.productId;
        let isValid = mongoose.Types.ObjectId.isValid(productId);
        if (!isValid) {
            res.json({ message: 'Invalid Product Id'});
            return;
        }
        let user = await User.findOneAndUpdate({_id: userId}, {$push: {cart: productId}});
        if (user) {
            res.status(200).json({message: "success"});
        } else {
            res.json({message: "failed to add product to cart"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
});

router.delete('/remove/:productId', userAuth, async (req, res) => {
    try {
        let userId = req.userId;
        let productId = req.params.productId;
        let isValid = mongoose.Types.ObjectId.isValid(productId);
        if (!isValid) {
            res.json({ message: 'Invalid Product Id'});
            return;
        }
        let user = await User.findOne({_id: userId});
        if (!user) { return res.json({ message: 'User not found' }); }
        let cart = user.cart;
        let index = cart.indexOf(productId);
        cart.splice(index, 1);
        let updateCart = await User.findOneAndUpdate({_id: userId}, {cart: cart});
        if (updateCart) {
            res.status(200).json({message: "success"});
        } else {
            res.json({message: "failed to remove product from cart"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
});

// empty cart
router.delete('/removeAll', userAuth, async (req, res)=> {
    try {
        let userId = req.userId;
        let user = await User.findOne({_id: userId})
        if (user) {
            let cart = user.cart;
            const products = await User.findOneAndUpdate({_id: userId},{cart: []});
            res.status(200).json({message: "All products Removed from Cart successfully"});
        } else {
            res.json({message: "failed to Remove Products from cart"});
        } 
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});   
    }
});

router.get('/total', userAuth, async (req, res)=> {
    try {
        let userId = req.userId;
        let user = await User.findOne({_id: userId})
        if (user) {
            let cart = user.cart;
            let total = 0;
            // const products = await Product.find({ _id: { $in: cart } });
            // console.log(products);
            for (let i = 0; i < cart.length; i++) {
                let product = await Product.findOne({ _id: cart[i]});
                total += parseInt(product.price);
            }
            res.status(200).json({cartTotal : total});
        } else {
            res.json({message: "failed to calculate cart total"});
        } 
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});  
    }
});

module.exports = router;