ecommerce / backend / routes / products.js
products.js
Raw
const express = require('express');
const mongoose = require('mongoose');
const { Product } = require('../models/Product');
const { adminAuth } = require('../middlewares/adminAuth');
const { productBody } = require('../types');
const router = express.Router();

// get all or a specific product
router.get('/:id?', async (req, res) => {
    try {   
        let productId = req.params.id;
        if (productId) {
            let isValid = mongoose.Types.ObjectId.isValid(productId);
            if (!isValid) {
                res.json({ message: 'Invalid Product Id'});
                return;
            }
            let product = await Product.findOne({_id: productId});
            res.status(200).json({product});
            return;
        } 
        let products = await Product.find();
        res.status(200).json({products});        
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});
    }
});

// search product by name, fetches all products which contain the name even as a substring
router.get('/search/:name', async (req, res) => {
    try {
        let productName = req.params.name;
        console.log(productName);
        if (productName) {
            let products = await Product.find({ 
                name: { 
                    $regex: productName, 
                    $options: 'i' 
                } 
            });

            if (products.length > 0) {
                res.status(200).json({products});
            } else {
                res.status(200).json({message: 'No products found'});
            }
        } else {
            res.json({message: "Product Name invalid"});
        } 
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"});  
    }
});

// Add a product
router.post('/add', adminAuth, async (req, res) => {
    try {
        let { success } = productBody.safeParse(req.body);
        if (!success) {
            console.log(req.body);
            res.json({message: "Invalid Product Input"});
            return;
        }

        let {name, price, image, description, ratings, ratingsCount} = req.body;
        let addProduct = await Product.create({
            name,
            price,
            image,
            description,
            ratings,
            ratingsCount
        })

        if (addProduct) {
            res.status(200).json({message:"success"});
        } else {
            res.json({message: "Failed to Add Product"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
})

// update a product
router.put('/edit', adminAuth, async (req, res) => {
    try {
        let updatedBody = req.body;
        let productId = req.body.id;
        let isValid = mongoose.Types.ObjectId.isValid(productId);
        if (!isValid) {
            res.json({ message: 'Invalid Product Id'});
            return;
        }
        let updatedProduct = await Product.findOneAndUpdate({_id: productId}, {$set: updatedBody});
        if (updatedProduct) {
            res.status(200).json({message:"Product updated successfully"});
        } else {
            res.json({message: "Failed to update Product"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Api Call Failed"}); 
    }
});

// delete product
router.delete('/delete/:id', adminAuth, async (req, res) => {
    try {
        if (req.params.id) {
            let productId = req.params.id;
            let isValid = mongoose.Types.ObjectId.isValid(productId);
            if (!isValid) {
                res.json({ message: 'Invalid Product Id'});
                return;
            }
            let deletedProduct = await Product.findOneAndDelete({_id: req.params.id});
            if (deletedProduct) {
                res.status(200).json({message:"success"});
            } else {
                res.status(404).json({message: "Product Not Found"});
            }
        } else {
            res.status(404).json({message: "Product Id Invalid/Empty"});
        }
    } catch (err) {
        console.log(err);
        res.json({message: "Invalid product Id/ Product not found"}); 
    }
});


module.exports = router;