import mongoose from "mongoose"; import { PDStock } from "./PdStockModel.js"; import { Product } from "../Products/ProductModel.js"; export const getProductsAndStockByUser = async (req, res) => { try { const { userId } = req.params; // Pagination parameters const PAGE_SIZE = parseInt(req.query.show) || 10; const page = parseInt(req.query.page) || 1; const skip = (page - 1) * PAGE_SIZE; // Filtering criteria const filter = {}; if (req.query.name) { filter.name = { $regex: new RegExp(req.query.name, "i"), }; } if (req.query.category) { filter.category = mongoose.Types.ObjectId(req.query.category); } if (req.query.brand) { filter.brand = mongoose.Types.ObjectId(req.query.brand); } // Fetch user's PDStock data and products concurrently const [userStock, products] = await Promise.all([ PDStock.findOne({ userId: mongoose.Types.ObjectId(userId) }), Product.aggregate([ { $match: filter }, { $lookup: { from: "categorymodels", localField: "category", foreignField: "_id", as: "categoryDetails", }, }, { $lookup: { from: "brandmodels", localField: "brand", foreignField: "_id", as: "brandDetails", }, }, { $project: { category: { $arrayElemAt: ["$categoryDetails.categoryName", 0] }, brand: { $arrayElemAt: ["$brandDetails.brandName", 0] }, GST: 1, HSN_Code: 1, SKU: 1, addedBy: 1, createdAt: 1, description: 1, image: 1, name: 1, price: 1, product_Status: 1, updatedAt: 1, }, }, { $skip: skip }, { $limit: PAGE_SIZE }, ]), ]); // Create a stock map for easy lookup const stockMap = {}; if (userStock && userStock.products) { userStock.products.forEach((product) => { stockMap[product.productid.toString()] = product.Stock; }); } // Combine products with their respective stock const productsWithStock = products.map((product) => ({ ...product, stock: stockMap[product._id.toString()] || 0, })); // Get total count for pagination purposes const total = await Product.countDocuments(filter); return res.status(200).json({ success: true, totalProducts: total, totalPages: Math.ceil(total / PAGE_SIZE), currentPage: page, products: productsWithStock, }); } catch (error) { console.error("Error fetching products with stock:", error); return res.status(500).json({ success: false, message: "Error fetching products and stock", }); } };