Spaces:
Sleeping
Sleeping
| // src/controllers/productController.js | |
| const Product = require('../models/Product'); | |
| const sendTelegramAlert = require('../utils/telegram'); | |
| // @desc Fetch all products (with search & category filter) | |
| // @route GET /api/products | |
| // @access Public | |
| const getProducts = async (req, res) => { | |
| try { | |
| const keyword = req.query.keyword | |
| ? { | |
| name: { | |
| $regex: req.query.keyword, | |
| $options: 'i', // Case insensitive | |
| }, | |
| } | |
| : {}; | |
| // Filter by category if provided | |
| const categoryFilter = req.query.category ? { category: req.query.category } : {}; | |
| const products = await Product.find({ ...keyword, ...categoryFilter }); | |
| res.json(products); | |
| } catch (error) { | |
| res.status(500).json({ message: error.message }); | |
| } | |
| }; | |
| // @desc Fetch single product | |
| // @route GET /api/products/:id | |
| // @access Public | |
| const getProductById = async (req, res) => { | |
| try { | |
| const product = await Product.findById(req.params.id); | |
| if (product) { | |
| res.json(product); | |
| } else { | |
| res.status(404).json({ message: 'Product not found' }); | |
| } | |
| } catch (error) { | |
| res.status(500).json({ message: error.message }); | |
| } | |
| }; | |
| // @desc Create a product | |
| // @route POST /api/products | |
| // @access Private/Admin | |
| const createProduct = async (req, res) => { | |
| const { name, price, originalPrice, description, image, category, stock } = req.body; | |
| try { | |
| const product = new Product({ | |
| name, | |
| price, | |
| originalPrice, | |
| description, | |
| image, | |
| category, | |
| stock, | |
| }); | |
| const createdProduct = await product.save(); | |
| res.status(201).json(createdProduct); | |
| } catch (error) { | |
| res.status(400).json({ message: error.message }); | |
| } | |
| }; | |
| // @desc Update a product | |
| // @route PUT /api/products/:id | |
| // @access Private/Admin | |
| const updateProduct = async (req, res) => { | |
| const { name, price, originalPrice, description, image, category, stock, isActive } = req.body; | |
| try { | |
| const product = await Product.findById(req.params.id); | |
| if (product) { | |
| product.name = name || product.name; | |
| product.price = price || product.price; | |
| product.originalPrice = originalPrice !== undefined ? originalPrice : product.originalPrice; | |
| product.description = description || product.description; | |
| product.image = image || product.image; | |
| product.category = category || product.category; | |
| product.stock = stock !== undefined ? stock : product.stock; | |
| product.isActive = isActive !== undefined ? isActive : product.isActive; | |
| // 🔥 Stock Low Alert | |
| if (product.stock < 5) { | |
| sendTelegramAlert(`⚠️ <b>Low Stock Alert</b>\nProduct: <b>${product.name}</b> is down to ${product.stock} units!`); | |
| } | |
| const updatedProduct = await product.save(); | |
| res.json(updatedProduct); | |
| } else { | |
| res.status(404).json({ message: 'Product not found' }); | |
| } | |
| } catch (error) { | |
| res.status(400).json({ message: error.message }); | |
| } | |
| }; | |
| // @desc Delete a product | |
| // @route DELETE /api/products/:id | |
| // @access Private/Admin | |
| const deleteProduct = async (req, res) => { | |
| try { | |
| const product = await Product.findById(req.params.id); | |
| if (product) { | |
| await product.deleteOne(); | |
| res.json({ message: 'Product removed' }); | |
| } else { | |
| res.status(404).json({ message: 'Product not found' }); | |
| } | |
| } catch (error) { | |
| res.status(500).json({ message: error.message }); | |
| } | |
| }; | |
| module.exports = { | |
| getProducts, | |
| getProductById, | |
| createProduct, | |
| updateProduct, | |
| deleteProduct, | |
| }; |