| Current Path : /var/node/inatote/Inatote-Backend/chat/ |
| Current File : /var/node/inatote/Inatote-Backend/chat/chat-list.js |
import MakeChat from './chat.js'
import { UniqueConstraintError } from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'
export default function makeChatList({ database }) {
return Object.freeze({
checkRoomExist : checkRoomExist,
createRoom : createRoom,
saveMessage : saveMessage,
// findByEmail,
findById,
getItems,
getChatRooms
// remove,
// replace,
// update,
// updateVendorOrProduct
})
async function createRoom(data){
try{
const db = await database
let obj = { from : db.makeId(data.from), to: db.makeId(data.to) , order_id : db.makeId(data.order_id) };
const {ops} = await db.collection("chatRoom").insertOne(obj)
//console.log("inser", ops);
return ops[0];
}catch (error){
//console.log("err" , error);
return false;
}
}
async function checkRoomExist(data){
try {
const db = await database
let result = await db.collection("chatRoom").find({ $or: [{from: db.makeId(data.from), to: db.makeId(data.to) , order_id : db.makeId(data.order_id)},{from: db.makeId(data.to) , to: db.makeId(data.from) ,order_id : db.makeId(data.order_id)}]}).toArray();
//console.log("result" , result);
let obj = {
roomId: '',
exist: false
}
if(result && result.length > 0){
obj = {
roomId: result[0]._id,
exist: true
}
}
////console.log(result)
return obj;
} catch (error) {
return {
roomId: '',
exist: false
}
}
}
async function saveMessage(data){
try{
const db = await database
let obj = { roomId: db.makeId(data.roomId), from : db.makeId(data.from), to: db.makeId(data.to), message: data.message ,image : data.image , order_id : db.makeId(data.order_id ) , date : new Date()};
obj._id = db.makeId()
const chatData = MakeChat(obj);
//console.log("obj" , chatData);
let result = await db.collection("chat").insertOne(chatData);
return result;
}catch (error){
//console.log("err" , error);
return false;
}
}
async function getItems({ from, to, order_id } = {}) {
const db = await database
try {
var res = await db
.collection('chatRoom')
.find({ $or: [{from: db.makeId(from), to:db.makeId(to) , order_id : db.makeId(order_id)},{from: db.makeId(to), to: db.makeId(from),order_id : db.makeId(order_id)}]})
.limit(1)
.skip(0)
.toArray();
//console.log("res", res);
return res.length > 0 ? res[0] : []
} catch (err) {
//console.log("er", err);
}
}
async function getChatRooms(userId){
try{
const db = await database
let res = await db.collection("chatRoom").find({ $or: [{from: db.makeId(userId)},{to: db.makeId(userId)}]}).sort({_id : -1}).toArray();
return res
}
catch(err){
//console.log("err" , err);
}
}
async function add({ userId, objectId ,...rating }) {
const db = await database
try {
rating.userId = db.makeId(userId) ;
rating.objectId = db.makeId(objectId) ;
rating.createdDate = new Date()
rating.lastUpdatedDate = new Date()
const { result, ops } = await db
.collection('ratings')
.insertOne(rating)
.catch(mongoError => {
const [errorCode] = mongoError.message.split(' ')
if (errorCode === 'E11000') {
const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
throw new UniqueConstraintError(
mongoIndex === 'vendorEmailIndex' ? 'emailAddress' : 'vendorId'
)
}
throw mongoError
})
return {
success: result.ok === 1,
created: rating
}
}
catch (err) {
//console.log("err", err);
return makeHttpError({
statusCode: 400,
errorMessage: err.message
})
}
// const { result, ops } = await db
// .collection('products')
// .insertOne(product)
// .catch(mongoError => {
// const [errorCode] = mongoError.message.split(' ')
// if (errorCode === 'E11000') {
// const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
// throw new UniqueConstraintError(
// mongoIndex === 'productEmailIndex' ? 'emailAddress' : 'productId'
// )
// }
// throw mongoError
// })
}
async function findById({roomId}) {
try{
const db = await database
const data = await db.collection("chat").aggregate([
{
$match : {roomId : roomId}
},
{
$lookup:
{
from: "users",
localField: "from",
foreignField: "_id",
as: "sender"
}
},
{
$lookup:
{
from: "users",
localField: "to",
foreignField: "_id",
as: "receiver"
}
},
]).toArray();
return data
}
catch(err){
//console.log("err in findBYId" ,err);
return []
}
}
async function findOne({roomId}) {
try{
const db = await database
const data = await db.collection("chat").aggregate([
{
$match : {roomId : roomId}
},
{
$lookup:
{
from: "users",
localField: "from",
foreignField: "_id",
as: "sender"
}
},
{
$lookup:
{
from: "users",
localField: "to",
foreignField: "_id",
as: "receiver"
}
},
{
$sort: {date : -1}
},
{
$limit: 1
}
]).toArray();
return data
}
catch(err){
//console.log("err in findBYId" ,err);
return []
}
}
async function findByEmail({ emailAddress }) {
return {
emailAddress: emailAddress
}
}
async function remove({ productId, ...product }) {
return {
productId: productId
}
}
// todo:
async function replace(product) {
}
// todo:
async function update({ productId, categoryId, product }) {
const db = await database
var q = {};
product.lastUpdatedDate = new Date();
for (var item in product) {
//console.log(item)
q[`products.$.${item}`] = product[item]
}
const query = {
$set: q
}
const { result } = await db.collection('categories').updateOne({
_id: db.makeId(categoryId),
"products.productId": db.makeId(productId)
}, query, { strict: false })
//console.log(result)
if (result.nModified != 1) {
return {
success: false,
error: "Something went wrong when performing this operation."
}
}
return {
success: true,
updated: product
};
}
async function updateVendorOrProduct({ id, items , ratingType }) {
const db = await database
//console.log(id)
//console.log(items)
items.lastUpdatedDate = new Date();
var q = {};
if(ratingType == "product"){
for (var item in items) {
//console.log(item)
q[`products.$.${item}`] = items[item]
}
const query = {
$set: q
}
let result;
//console.log(query)
result = await db.collection("categories").updateOne({
"products.productId": db.makeId(id)
}
,query, {})
//console.log("result" , result);
}
else{
result = await db.collection('vendors').updateOne({
_id: db.makeId(id)
}, query, {})
}
// //console.log("res",result)
// if (result.nModified != 1) {
// return {
// success: false,
// error: "Something went wrong when performing this operation."
// }
// }
return {
success: true,
vendor: items
};
}
function documentToRating({ _id: productId, ...doc }, markup) {
return makeRating({ productId, ...doc })
}
}