Your IP : 216.73.216.91


Current Path : /var/node/inatote/Inatote-Backend/rating/
Upload File :
Current File : /var/node/inatote/Inatote-Backend/rating/rating-list.js

import makeRating from './ratings.js'
import { UniqueConstraintError } from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'

export default function makeratingList({ database }) {
    return Object.freeze({
        add,
        findByEmail,
        findById,
        getItems,
        remove,
        replace,
        update,
        updateVendorOrProduct
    })

    async function getItems({ max = 100, page = 1, userId, objectId, type } = {}) {

        const db = await database
        var query = {}

        if (userId) {
            query = { userId: db.makeId(userId) }

        }
        if (objectId) {
            query = {...query , objectId: db.makeId(objectId) }
        }

        if (type) {
            query = {...query , type: db.makeId(type) }
        }


        try {


            //console.log("query", query);
            var res = await db
                .collection('ratings')
                .find(query)
                .limit(Number(max))
                .skip(max * (page - 1))
                .toArray();
            //console.log("res", res);
          
            
            return res
        } catch (err) {
            //console.log("er", 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(id) {
        const db = await database
        //console.log(id)
        const result = await db
            .collection('ratings')
            .findOne({_id : db.makeId(id)})
        //console.log("result" , result);
        if (result) {
          
            return result
        }
        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({ riderId, vendorId, products , order  , ratingInfo}) {
        const db = await database
        var q = {};
        var s = {}
        for (var item in products) {
            q[`products.$.ratingSum`] = ratingInfo.products;
            q[`products.$.ratingCount`] = 1;

            
            const query = {
                $inc: q,
                // $set : {ratingAverage : }  
            }
            var result  = await db.collection('categories').findOneAndUpdate({
                // _id: db.makeId(categoryId),
                "products.productId": db.makeId(products[item])
            }, query, { new: true  , returnNewDocument: true})
    
            //console.log(result )
            let prod = result.value.products; 
            updateAverage(prod[0])      
        }

        var vendorResult  = await db.collection('vendors').findOne({ _id : db.makeId(vendorId)});
        vendorResult.ratingCount = vendorResult.ratingCount? vendorResult.ratingCount+1 : 1;
        vendorResult.ratingSum = vendorResult.ratingSum? vendorResult.ratingSum + ratingInfo.vendor : ratingInfo.vendor ;
        vendorResult.ratingAverage = vendorResult.ratingSum / vendorResult.ratingCount;
        

        //console.log("vendorResult" ,vendorResult);
        let update = await db.collection("vendors").save(vendorResult);
        //console.log("update" , update);
        

        var riderResult  = await db.collection('users').findOne({ _id : db.makeId(riderId)});
        riderResult.ratingCount = riderResult.ratingCount? riderResult.ratingCount+1 : 1;
        riderResult.ratingSum = riderResult.ratingSum? riderResult.ratingSum + ratingInfo.vendor : ratingInfo.vendor ;
        riderResult.ratingAverage = riderResult.ratingSum / riderResult.ratingCount;
        

        //console.log("riderResult" ,riderResult);
        let updateRider = await db.collection("users").save(riderResult);

        order.ratingCount = order.ratingCount? order.ratingCount+1 : 1;
        order.ratingSum = order.ratingSum? order.ratingSum + ratingInfo.order : ratingInfo.order ;
        order.ratingAverage = order.ratingSum / order.ratingCount;
        

        //console.log("order" ,order);
        let updateOrder = await db.collection("orders").save(order);
        

        
      
        return result.created
    }

    async function updateAverage(product){
        //console.log("product" , product);
        const db = await database
        try{
            var { result } = await db.collection('categories').update({
                // _id: db.makeId(categoryId),
                "products.productId": db.makeId(product.productId)
            }, {
                $set : {'products.$.ratingAverage' :product.ratingSum / product.ratingCount  }
            }, { new: true  })
        }
        catch(err){
            //console.log("err" , err);
        }
    }

    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 })
    }
}