Your IP : 216.73.216.91


Current Path : /var/node/inatote/Inatote-Backend/chat/
Upload File :
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 })
    }
}