Untitled
unknown
plain_text
a year ago
7.3 kB
10
Indexable
const mongoose = require('mongoose');
const User = require('../Models/userModel.js');
const SubCategory = require('../Models/subcategoryModel.js');
const Group = require('../Models/groupModel.js');
const Brand = require('../Models/brandModel.js');
const Category = require('../Models/categoryModel.js');
const Product = require('../Models/productModel.js');
const AppError = require('../utils/appError.js');
const catchAsync = require('../utils/catchAsync.js');
const Client = require('../Models/clientModel.js');
const SalesMan = require('../Models/salesmanModel.js');
const Cart = require('../Models/cartModel.js');
const Order = require('../Models/orderModel.js');
const Retailer = require('../Models/retailerModel.js');
const Chat = require('../Models/chatModel.js');
const Message = require('../Models/messageModel.js');
const Offer = require('../Models/offerModel.js');
const { exist } = require('joi');
exports.addNewOffer = catchAsync(async(req,res,next) => {
const {name,discount,listproducts} = req.body
if(!name){
return next(new AppError('name is require', 400));
}
if(!discount){
return next(new AppError('discount is require', 400));
}
if(discount <0 || discount > 100){
return next(new AppError('discount is not valid', 400));
}
if ( !Array.isArray(listproducts) || !listproducts.length) {
return next(new AppError('products array cannot be empty', 400));
}
const {validIds , invalidIds} = await verifyIds(listproducts,next)
const newvalidIds = validIds.map( id => toObjectId(id,next))
if(invalidIds.length){
return next(new AppError('invalid products ids '+invalidIds, 400));
}
for(let i=0 ; i<validIds.length ; i++){
const prod = await Product.findById(validIds[i])
if(prod.offer){
return next(new AppError('this product '+prod.name.fr +' has offer', 400));
}
}
const session = await mongoose.startSession();
try {
session.startTransaction();
const offer = await Offer.create([{name : name,discount: discount}],{ session })
const Products = await Product.updateMany({_id: {$in : validIds}},{offer : offer[0]._id},{ session })
await session.commitTransaction();
session.endSession();
res.status(200).json({
message: 'offer added successfully',
data: Products
});
} catch (error) {
await session.abortTransaction();
session.endSession();
return next(error);
}
})
exports.getoffersList = catchAsync(async(req,res,next) => {
const requestedPage = parseInt(req.query.page) || 1; // Requested page number
const productsPerPage = parseInt(req.query.limit) || 10; // Requested page number
const obj = {}
const {name} = req.query
if(name){
obj.name = { $regex: name , $options: 'i' }
}
// Count total number of products
const count = await Offer.countDocuments();
console.log(name)
// Get products for the requested page
const offers = await Offer.aggregate([
{
$match : obj
},
{
$lookup: {
from: 'products',
localField: '_id',
foreignField: 'offer',
pipeline: [
{ $group: {
_id:"" ,
totalProduct: { $sum: 1 }
}
}
],
as: 'products'
}
},
])
.skip((requestedPage - 1) * productsPerPage)
.limit(productsPerPage)
const data = offers.reduce((result, offer) => {
let obj = {};
obj._id = offer._id;
obj.name = offer.name;
obj.discount = offer.discount;
obj.status = offer.status;
obj.totalProduct = offer.products[0]?.totalProduct ?? 0;
result.push(obj);
return result;
}, []);
res.status(200).json({
count,
currentPage: requestedPage,
productsPerPage,
offers : data
});
});
exports.getofferbyId = catchAsync(async(req,res,next) => {
const {id} = req.params
const offer = await Offer.findById(toObjectId(id,next))
if(!offer) {
return next(new AppError('no offer existe', 400));
}
const results = await Offer.aggregate([
{
$match : {_id : toObjectId(id,next)}
},
{
$lookup: {
from: 'products',
localField: '_id',
foreignField: 'offer',
pipeline: [
{ $project: { name: 1} },
],
as: 'products'
}
},
])
res.status(200).json({
offer : results[0]
});
})
exports.changeStatus = catchAsync(async(req,res,next) =>{
const {status,id_offer} = req.body
const offer = await Offer.findById(toObjectId(id_offer,next))
if(!offer) {
return next(new AppError('this offer no existe', 400));
}
if(status == 'true'){
offer.status = true
}else if(status == 'false'){
offer.status = false
}else{
return next(new AppError('status invalid', 400));
}
offer.save()
res.status(200).json({
message: 'offer updated successfully',
});
})
exports.updateOffer = catchAsync(async(req,res,next) => {
const {name,discount,id_offer} = req.body
if(!id_offer){
return next(new AppError('id_offer is require', 400));
}
try{
const offer = await Offer.findById(toObjectId(id_offer,next))
if(!offer){
return next(new AppError('this offer not valid', 400));
}
if(name){
offer.name = name
}
if(discount){
if(discount <0 || discount > 100){
return next(new AppError('discount is not valid', 400));
}
offer.discount = discount
}
offer.save()
res.status(200).json({
message: 'offer updated successfully',
});
} catch (error) {
return next(error);
}
})
exports.deleteOffer = catchAsync(async(req,res,next) => {
const {id} = req.params
console.log(id)
if(!id){
return next(new AppError('id offer is require', 400));
}
const offer = await Offer.findById(toObjectId(id,next))
if(!offer){
return next(new AppError('this offer not valid', 400));
}
const session = await mongoose.startSession();
try {
session.startTransaction();
await Product.updateMany({offer : toObjectId(id)},{$unset : {offer : ""}})
await Offer.deleteOne({_id : id})
await session.commitTransaction();
session.endSession();
res.status(200).json({
message: 'offer deleted successfully',
});
} catch (error) {
await session.abortTransaction();
session.endSession();
return next(error);
}
})
async function verifyIds(ids,next) {
const objectIds = ids.map(id => toObjectId(id,next));
try {
const results = await Product.find({ _id: { $in: objectIds } }).lean().select('_id');
const foundIds = results.map(doc => doc._id.toString());
const invalidIds = ids.filter(id => !foundIds.includes(id));
return {
validIds: foundIds,
invalidIds: invalidIds
};
} catch (error) {
console.error("Error verifying IDs:", error);
throw error;
}
}
const toObjectId = (id, next) => {
try {
return new mongoose.Types.ObjectId(id);
} catch (e) {
return next(new AppError('Invalid id.', 401));
}
};Editor is loading...
Leave a Comment