Skip to main content

Create/Launch new Product API +Update an Delete Product by Admin, Get Product Details by customer API Nodejs , MongoDB MERN Stack

 //  Create Required following files mentioned in previous post = https://vasubirla.blogspot.com/2023/02/register-new-user-login-user-delete.html 

config.env    

Server.js 

//app.js 

/utilsfolder/errorhander.js

/utils/jwtToken.js file

3. /utils/sendEmail.js  file



//Create Product Model - and import it in ProductController 


//ProductModel.js
const mongoose = require('mongoose');

const ProductSchema = new mongoose.Schema({

    name: {
        type:String,
        required:[true,"please enter produt name"],
        trim:true
    },
    description: {
        type:String,
        required:[true,"please add product description"]
    },
    price: {
        type:Number,
        required:[true,"Product Price is required"],
        maxLength:[8,"price cannot be exceed 8 character"]
    },
    ratings: {
        type:Number,
        default:0
    },
    image: [
        {
            public_id: {
                type:String,
                required:true
            },
            url: {
                type:String,
                required:true
            }
        }        
    ],
    category: {
        type:String,
        required:[true,"Please enter Product Category"]
    },
    stock:{
        type:Number,
        required:[true,"Product stoke limit required"],
        maxLength:[4,"stoke cannot be exceed 4 char"],
        default:1
    },
    numOfReviews:{
        type:Number,
        default:0
    },
    reviews: [
        {
            user:{
                type: mongoose.Schema.ObjectId,
                ref:"user",
                required:true
            },
            name:{
                type:String,
                required:true
            },
            rating:{
                type:Number,
                required:true
            },
            comment:{
                type:String,
                required:true
            }
        }
    ],
    createdAt:{
        type:Date,
        defualt:Date.now
    }
 })

 
 module.exports = mongoose.model("Product",ProductSchema)



//Create ProductController.js and import it in route 

//ProductController.js
const Product = require('../models/productModel');
const ErrorHander = require('../utils/errorhander');
const catchAsyncError = require('../middleware/catchAsyncError')
const ApiFeatures = require('../utils/apifeatures')

//create/add or Launch New Products to sell on website --by Admin
 
exports.createProduct = catchAsyncError(
    async (req,res,next)=>{

        const product = await Product.create(req.body);
   
        res.status(201).json({
   
            success:true,
            product
       
        })
   
   
    }

)
//==create Product API Testing on Postman





//Get Products Details on HomePage by different Customers or Visiters
exports.getAllProduct =catchAsyncError( async (req,res)=>{

        console.log("Hited from React End")
    const resultPerPage = 5; // show 5 product per page

    const productCount = await Product.countDocuments()

    const apiFeatures = new ApiFeatures(Product.find(),req.query).search().filter().pagination(resultPerPage)
   
    const products = await apiFeatures.query //await Product.find()

    res.status(200).json({

        success:true,
        products,
        productCount
    });

}
)

//== Get products API Testing on Postman =




//get perticular Product Details


    exports.getProductDetails =catchAsyncError( async (req,res,next)=>{

        const product = await Product.findById(req.params.id)

        if(!product){
            return next(new ErrorHander("Product Not Found",404))
        }
        else{
            res.status(200).json({
                success:true,
                product
            })
        }

       

    }

    )
//=====Open Perticular Product DEtails API Testing - Postman (with wrong ID)





//Update Product -- Admin

exports.updateProduct = catchAsyncError( async (req,res,next)=>{

    let product = await Product.findById(req.params.id)

    if(!product){
        res.status(500).json({
            success:false,
            message:"Product not found"
        })
    }
    product = await Product.findByIdAndUpdate(req.params.id,req.body,{

        new:true,
        runValidators:true,
        useFindAndModify:false
    })
    res.status(200).json({
        success:true,
        product
    })
}
)

//========Update Product API testing - only Admin can update - Postman







//=======delete Products=============================

exports.deleteProduct =catchAsyncError(  async(req,res,next)=>{

    const product = await Product.findById(req.params.id)

    if(!product){
        res.status(500).json({
            success:false,
            message:"Product not found"
        }) // or we can use this line  return next(new ErrorHander("Product Not Found",404))
    }
    else {
        await Product.findByIdAndDelete(req.params.id,req.body);

        res.status(200).json({
            success:true,
            message:"Product Deleted Successfully"
        })
    }
   


}
)


//Give Product Review or Update it if already exists =========================================

exports.createProductReview = catchAsyncError(async(req,res,next)=>{

        const { rating,comment, productId} = req.body;

    const review = {
        user:req.user.id,
        name:req.user.name,
        rating,
        comment
    }

    const product = await Product.findById(productId);

        const isReviewed = product.reviews.find(
           (rev)=>rev.user.toString()=== req.user._id.toString()
            )
        //here rev.user who already made reviewed and req.user._id is also your Id - If Both ID is same and Review already exists by you then it will be updated

        if(isReviewed)
        {
           product.reviews.forEach(rev=>{

            if(rev.user.toString()=== req.user._id.toString())
            {                
             rev.rating = rating,
             rev.comment = comment
            }
           })
        }
        else
        {
            product.reviews.push(review)
            product.numOfReviews = product.reviews.length
        }

        //Overall Rating = Total Rating divided by length of Rating
        let avg = 0
        product.reviews.forEach( rev=>{
            avg=avg+rev.rating
        })

        product.ratings = avg/product.reviews.length

        await product.save({validateBeforeSave:false})

        res.status(200).json({
            success:true,
            message:"You have rated this Product Successfully !!"
        })

})


//Get All Reviews of Product ========
exports.getProductReviews = catchAsyncError(async (req,res,next)=>{

    const product = await Product.findById(req.query.id)

    if(!product){
        return next(new ErrorHander("Product or Review Found ",404))
    }

    else{
        res.status(200).json({
            success:true,
            reviews:product.reviews
        })
    }
   

   
})

//Delete Review of Product
exports.deleteReview = catchAsyncError(async (req,res,next)=>{
    const product = await Product.findById(req.query.productId)
    if(!product){
        console.log("No Product found")
        return next(new ErrorHander("Product Not Found",404))
    }
    else{
           
        //now in review that all reviews are assigned which we dont want to delete  using filter
        const reviews = product.reviews.filter(rev=> rev._id.toString() !== req.query.id.toString());
       

        // now after deleteing review Overall Averaging Rating, Num of rating also should be updated
        let avg = 0
            reviews.forEach( rev=>{
            avg=avg+rev.rating
        })
        const ratings = avg/reviews.length        
        const numOfReviews = reviews.length
        await Product.findByIdAndUpdate(req.query.productId,{
            reviews ,ratings, numOfReviews
        },
        {
            new:true,
            runValidators:true,
            useFindAndModify:false
        })

        res.status(200).json({
            success:true,
            message:"Your Review has Been deleted "
        })
    }

})  





//Create ProductRoute.js 

//===== ProductRoute.js
const express = require('express');
const {getAllProduct,
    createProduct,
     updateProduct,
      deleteProduct,
       getProductDetails, createProductReview, getProductReviews, deleteReview} = require('../controllers/productController.js');
const { isAuthenticatedUser, authorizeRoles } = require('../middleware/auth.js');
const router = express.Router();

router.route('/products').get(getAllProduct);
router.route('/products/new').post(isAuthenticatedUser, authorizeRoles("admin"),createProduct);

router.route('/products/:id').put(isAuthenticatedUser, authorizeRoles("admin"),updateProduct);

router.route('/products/:id').delete(isAuthenticatedUser, authorizeRoles("admin"),deleteProduct);

router.route('/products/:id').get(getProductDetails );

router.route('/review').put(isAuthenticatedUser, createProductReview )

router.route('/reviews').get(getProductReviews)

router.route('/reviews').delete(isAuthenticatedUser,deleteReview)

module.exports = router

=================== End===============



Comments

Popular posts from this blog

How to deploy NodeJS app on server with Apache2 and acess it with Server IP addresss - Node JS deploy project Live.

     hello friens , This is Vasu Birla , in previous post we have seen the deployement of NodeJS app on AWS instance server instance but AWS server is expensive than other servers . SO today we will use simple Ubuntu server for making Live out Project using Apache2 . At the end you will be abe to access your NodeJS app using server IP address from anywhere  .. 1.  Login to your server using SSH terminal . (in AWS part i already explained how to do this )     -> Open your putty in hostname put your server IP -      login with ssh username ->root and password     (if you dont have root username and pass ask your      provider or reset it from cpanel or hosting panel ) 2. after login - on terminal you can Put your project anywhere.     There are two ways to put your project folder on server location     (i) - > using Github - (very popular and easy to track your everyday code changes to your project folder)             you can push your entire project folder to git-hub and and

How to to deploy python app sepratly on same server (previous one ) /root/demo - Deploy Python app on Ubuntu Server using ssh Terminal - by Vasu Birla

hello friends , am Vasu Birla and Today we will deploy Python App.. in previous post we have deployed NODE js app on 0.0.0.0 (your server IP) and acess it using http://0.0.0.0/   Now  If you want to deploy a Python app separately on the same server, in the /root/demo directory, and access it using http://0.0.0.0/demo,  you can use Apache2 and mod_wsgi to host the Python app.   Additionally, you can configure Apache2 to proxy the requests for the   /demo path to your Python app without affecting the Node.js app hosted at the root.   First of all  put your python project folder on root location of server , using putty with cloning git repo or using FTP server and direct paste folder (in previous post we aleady discussed it)   lets suppose your folder name is demo .. location would be  /root/demo   install necessery things to support your python app .  like pip install or django ..etc     as well install in virtual enviorment also ..       -> python3 -m venv venv        -> source v

Part 19- Router (Networking Devices)- Computer Networking- CCNA

Hello friends...i am Vasu Birla and today will discuss about the most important Networking Device ..Router.  so let's start... ROUTER Router is a device which connect two or more networks together, which is why router is also known is Inter-networking device also. Inter-networking means two or more networks are connected together with the help of router. one more thing router is just like a computer  but it is designed for routing only, our computer can be router also but that are software router while hardware router which are specialize for routing is more efficient and fast than software router.  There is a Operating System installed on router which get moves data from one network to another network with the help of routing table.  Router does work on Network layer or Layer 3 of the OSI model.  Cisco Router There many companies which manufacture Router but main companies are - Cisco , Juniper , HP, 3com and Nortel  Functions of Router