Untitled
unknown
plain_text
13 days ago
17 kB
4
Indexable
Never
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 Notification = require('../Models/notificationModel.js'); const Chat = require('../Models/chatModel.js'); const Message = require('../Models/messageModel.js'); const Email = require('./../utils/email'); const Socket = require('../socket/socketIndex.js'); const Salesman = require('../Models/salesmanModel.js'); async function getRandomSalesMan(province, retailer_id, next) { try { const salesmen = await SalesMan.find({ province: province }); if (salesmen.length < 1) { return next(new AppError('no sales man available in your province', 400)); } const salesmen_ids = salesmen.map((doc) => doc._id); const listchats = await Chat.find({ retailer: retailer_id, sales_man: { $in: salesmen_ids } }); const verifier = (doc) => { for (let i = 0; i < listchats.length; i++) { if (doc._id.toString() == listchats[i].sales_man.toString()) { return false; } } return doc; }; const results = salesmen.filter(verifier); console.log(salesmen); if (results.length < 1) { return next(new AppError('no anouther sales man available in your province', 400)); } const random = Math.floor(Math.random() * results.length); const randomClient = results[random]; return randomClient; } catch (error) { return next(new AppError('Error', 400)); } } const sendEmailToSalesman = catchAsync(async (user, name) => { await new Email(user).sendNotificationToSalesMan(name); }); exports.createNewChat = catchAsync(async (req, res, next) => { const { content, id } = req.body; if (!content) { return next(new AppError('message is require', 400)); } if (!id) { return next(new AppError('user is require', 400)); } const session = await mongoose.startSession(); try { session.startTransaction(); const user = await User.findOne({ _id: id }); const retailer = await Retailer.findOne({ _id: user.profile }); if (!retailer.sales_man) { } const salesMan = await getRandomSalesMan(retailer.province, retailer._id, next); const chat = await Chat.find({ retailer: retailer._id, sales_man: salesMan._id }); if (chat.length > 0) { const message = await Message.create([{ message: content, sender: retailer._id, receiver: salesMan._id }], { session }); await Chat.updateOne({ _id: chat[0]._id }, { $push: { messages: message[0]._id } }, { session }); } else { const newChat = await Chat.create([{ retailer: retailer._id, sales_man: salesMan._id }], { session }); const message = await Message.create([{ message: content, sender: retailer._id, receiver: salesMan._id }], { session }); await Chat.updateOne({ _id: newChat[0]._id }, { $push: { messages: message[0]._id } }, { session }); } const users = await User.find({ profile: salesMan._id }); const usersIds = []; for (let i = 0; i < users.length; i++) { const notification = await Notification.create( [{ content: 'new conversation with ' + user.name, type: 'chat' }], { session } ); await User.updateOne({ _id: users[i]._id }, { $push: { notifications: notification[0]._id } }, { session }); usersIds.push({ id: users[i]._id.toString(), data: notification }); } Socket.SocketConnectedList(usersIds); try { sendEmailToSalesman(users[0], user.name); } catch (error) {} await session.commitTransaction(); session.endSession(); res.status(200).json({ message: 'message successfully' }); } catch (error) { await session.abortTransaction(); session.endSession(); return next(error); } }); exports.getSalesManChat = catchAsync(async (req, res, next) => { const { id } = req.params; const retailer = await Retailer.findById(toObjectId(id, next)); if (!retailer) { return next(new AppError('retailer not found', 400)); } const results = await Chat.aggregate([ { $match: { retailer: retailer._id } }, { $lookup: { from: 'salesmen', localField: 'sales_man', foreignField: '_id', pipeline: [ { $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1, photo: 1 } }], as: 'user' } } ], as: 'salesMan' } }, { $lookup: { from: 'messages', localField: 'messages', foreignField: '_id', pipeline: [{ $match: { vu: false, receiver: retailer._id } }, { $count: 'messages_not_vu' }], as: 'messages' } } ]); const data = results.reduce((result, order) => { let obj = {}; obj.salesMan_id = order.sales_man; obj.user_id = order.salesMan[0].user[0]?._id; obj.name = order.salesMan[0].user[0]?.name; obj.photo = order.salesMan[0].user[0]?.photo; obj.messages_not_vu = order.messages[0]?.messages_not_vu; result.push(obj); return result; }, []); res.status(200).json({ message: 'successfully', data: data }); }); exports.getSalesManChatForRetailer = catchAsync(async (req, res, next) => { const { id } = req.params; const retailer = await Retailer.findById(toObjectId(id, next)); if (!retailer) { return next(new AppError('retailer not found', 400)); } const results = await Salesman.aggregate([ { $match: { _id: retailer.sales_man }}, { $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1, photo: 1 } }], as: 'user' } }, { $lookup: { from: 'chats', localField: '_id', foreignField: 'sales_man', pipeline: [ { $match: { retailer: retailer._id, sales_man: retailer.sales_man } }, { $lookup: { from: 'messages', localField: 'messages', foreignField: '_id', pipeline: [{ $match: { vu: false, receiver: retailer._id } }, { $count: 'messages_not_vu' }], as: 'messages' } } ], as: 'chat' } } ]) const data = results.reduce((result, salesman) => { let obj = {}; obj.salesMan_id = salesman._id; obj.user_id = salesman.user?.at(0)?._id; obj.name = salesman.user?.at(0)?.name; obj.photo = salesman.user?.at(0)?.photo; obj.messages_not_vu = salesman.chat?.at(0).messages?.at(0)?.messages_not_vu; result.push(obj); return result; }, []); res.status(200).json({ message: 'successfully', data: data }); }); exports.getSalesMenList = catchAsync(async (req, res, next) => { const { id } = req.params; const retailer = await Retailer.findById(toObjectId(id, next)); if (!retailer) { return next(new AppError('retailer not found', 400)); } const salesmen = await SalesMan.aggregate([ { $match: { province: retailer.province } }, { $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1, photo: 1 } }], as: 'user' } } ]); const data = salesmen.reduce((result, salesman) => { let obj = {}; obj._id = salesman._id; obj.user_id = salesman.user[0]?._id; obj.name = salesman.user[0]?.name; obj.photo = salesman.user[0]?.photo; result.push(obj); return result; }, []); res.status(200).json({ message: 'successfully', data: data }); }); exports.SetSalesmanToRetailer = catchAsync(async (req, res, next) => { const { salesMan_id, retailer_id } = req.body; if (!salesMan_id) { return next(new AppError('salesman id is require', 400)); } if (!retailer_id) { return next(new AppError('retailer id is require', 400)); } const retailer = await Retailer.findById(toObjectId(retailer_id, next)); if (!retailer) { return next(new AppError('retailer not found', 400)); } const sales_Man = await SalesMan.findById(toObjectId(salesMan_id, next)); if (!sales_Man) { return next(new AppError('salesman not found', 400)); } if (retailer.province == sales_Man.province) { retailer.sales_man = toObjectId(salesMan_id, next); } else { return next(new AppError("retailer and salesman don't have the same province", 400)); } await retailer.save(); res.status(200).json({ message: 'successfully', data: retailer }); }); exports.getRetailersChat = catchAsync(async (req, res, next) => { const { id } = req.params; const salesman = await SalesMan.findById(toObjectId(id, next)); if (!salesman) { return next(new AppError('salesman not found', 400)); } console.log(salesman); const results = await Chat.aggregate([ { $match: { sales_man: salesman._id } }, { $lookup: { from: 'retailers', localField: 'retailer', foreignField: '_id', pipeline: [ { $lookup: { from: 'users', localField: '_id', foreignField: 'profile', pipeline: [{ $project: { name: 1, photo: 1 } }], as: 'user' } } ], as: 'Retailer' } }, { $lookup: { from: 'messages', localField: 'messages', foreignField: '_id', pipeline: [{ $match: { vu: false, receiver: salesman._id } }, { $count: 'messages_not_vu' }], as: 'messages' } } ]); const data = results.reduce((result, order) => { let obj = {}; obj.retailer_id = order.retailer; obj.user_id = order.Retailer[0].user[0]?._id; obj.name = order.Retailer[0].user[0]?.name; obj.photo = order.Retailer[0].user[0]?.photo; obj.messages_not_vu = order.messages[0]?.messages_not_vu; result.push(obj); return result; }, []); res.status(200).json({ message: 'successfully', data: data }); }); exports.sendMessage = catchAsync(async (req, res, next) => { const { content, salesMan_id, retailer_id, sender } = req.body; if (!content) { return next(new AppError('message is require', 400)); } if (!retailer_id) { return next(new AppError('retailer id is require', 400)); } if (!salesMan_id) { return next(new AppError('salesMan id is require', 400)); } if (sender != 'retailer' && sender != 'salesman') { return next(new AppError('sender is require', 400)); } const session = await mongoose.startSession(); try { session.startTransaction(); const retailer = await Retailer.findById(toObjectId(retailer_id, next)); if (!retailer) { return next(new AppError('retailer not found', 400)); } const user = await User.findOne({profile:retailer._id}) if (user.length < 1) { return next(new AppError('user not found', 400)); } if (!retailer.sales_man) { return next(new AppError("this retailer doesn't have a salesman", 400)); } const salesman = await SalesMan.findById(retailer.sales_man); if (!salesman) { return next(new AppError('salesman not found', 400)); } if (String(retailer.sales_man) != String(salesMan_id)) { return next(new AppError("salesman can't chat with this retailer", 400)); } const chat = await Chat.find({ retailer: toObjectId(retailer_id, next), sales_man: toObjectId(salesMan_id, next) }); let message; if (sender == 'retailer') { message = await Message.create([{ message: content, sender: retailer_id, receiver: salesMan_id }], { session }); } else if (sender == 'salesman'){ message = await Message.create([{ message: content, sender: salesMan_id, receiver: retailer_id }], { session }); }else{ return next(new AppError("role error", 400)); } if (chat.length < 1) { const newChat = await Chat.create([{ retailer: retailer._id, sales_man: retailer.sales_man }], { session }); await Chat.updateOne({ _id: newChat[0]._id }, { $push: { messages: message[0]._id } }, { session }); const users = await User.find({ profile: salesMan_id }); const usersIds = []; for (let i = 0; i < users.length; i++) { const notification = await Notification.create( [{ content: 'new conversation with ' + user.name, type: 'chat' }], { session } ); await User.updateOne({ _id: users[i]._id }, { $push: { notifications: notification[0]._id } }, { session }); usersIds.push({ id: users[i]._id.toString(), data: notification }); } Socket.SocketConnectedList(usersIds); try { sendEmailToSalesman(users[0], user.name); } catch (error) {} } else { await Chat.updateOne({ _id: chat[0]._id }, { $push: { messages: message[0]._id } }, { session }); } await session.commitTransaction(); session.endSession(); res.status(200).json({ message: 'message successfully' }); } catch (error) { await session.abortTransaction(); session.endSession(); return next(error); } }); exports.getMessagesChat = catchAsync(async (req, res, next) => { const { retailer_id, salesMan_id } = req.body; if (!salesMan_id) { return next(new AppError('salesman id is require', 400)); } if (!retailer_id) { return next(new AppError('retailer id is require', 400)); } const results = await Chat.aggregate([ { $match: { sales_man: toObjectId(salesMan_id, next), retailer: toObjectId(retailer_id, next) } }, { $lookup: { from: 'messages', localField: 'messages', foreignField: '_id', pipeline: [ { $sort: { createdAt: -1 } }, { $addFields: { senderRole: { $cond: [{ $eq: ['$sender', toObjectId(retailer_id, next)] }, 'retailer', 'salesman'] } } }, { $project: { vu: 1, senderRole: 1, createdAt: 1, message: 1 } } ], as: 'messages' } } ]); res.status(200).json({ message: 'successfully', data: results[0] }); }); exports.setMessagesVue = catchAsync(async (req, res, next) => { const { chat_id, user_id, role } = req.body; const filter = {}; if (!user_id) { return next(new AppError('id is require', 400)); } // const user = await User.findById({ _id: toObjectId(user_id, next) }); // if (!user) { // return next(new AppError('user not found', 400)); // } const chat = await Chat.findById({ _id: toObjectId(chat_id, next) }); if (!chat) { return next(new AppError('user not found', 400)); } if (role == 'retailer') { // console.log(user.profile); const retailer = await Retailer.findById({ _id: user_id }); if (!retailer) { return next(new AppError('retailer not found', 400)); } const results = await Message.updateMany({ _id: { $in: chat.messages }, receiver: retailer._id }, { vu: true }); res.status(200).json({ message: 'successfully', data: results }); } else if (role == 'salesman') { const salesMan = await SalesMan.findById({ _id: user_id }); if (!salesMan) { return next(new AppError('salesMan not found', 400)); } const results = await Message.updateMany({ _id: { $in: chat.messages }, receiver: salesMan._id }, { vu: true }); res.status(200).json({ message: 'successfully', data: results }); }else{ return next(new AppError('error in role', 400)); } }); const toObjectId = (id, next) => { try { return new mongoose.Types.ObjectId(id); } catch (e) { return next(new AppError('Invalid id.', 401)); } };
Leave a Comment