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;