Your IP : 216.73.216.91


Current Path : /var/node/inatote/qa_inatote/favourite/
Upload File :
Current File : /var/node/inatote/qa_inatote/favourite/favourite-list.js

import makeFavourite from './favourite.js'
import { UniqueConstraintError } from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'

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

    async function makeObjectId(id){
        const db = await database;
        return db.makeId(id)
    }

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

        const db = await database
        var query = {}

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

        }
    


        try {


            //console.log("query", query);
            var res = await db
                .collection('favourites')
                .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({...rating }) {
        const db = await database
        try {
            rating.createdDate = new Date()
            rating.lastUpdatedDate = new Date()

        
            const { result, ops } = await db
                .collection('favourites')
                .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({ userId, data }) {
        const db = await database
        var q = {};
        // data.lastUpdatedDate = new Date();

        for (var item in data) {
            //console.log(item)
            q[`${item}`] = data[item]
        }

        const query = {
            $set: q
        }
//console.log("query" , query);
        const { result } = await db.collection('favourites').updateOne({
            userId: db.makeId(userId),
        }, 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: data
        };
    }

    async function updateVendorOrProduct({ id, items }) {
        const db = await database
        //console.log(id)
        //console.log(items)
        items.lastUpdatedDate = new Date();
        var q = {};

        for (var item in items) {
            //console.log(item)
            q[item] = items[item]
        }

        const query = {
            $set: q
        }

        //console.log(query)

        const { result } = await db.collection('vendors').updateOne({
            _id: db.makeId(id)
        }, query, {})

        //console.log(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 })
    }
}