All files / src/controllers/products-controllers searchByIds.js

87.5% Statements 14/16
100% Branches 7/7
100% Functions 3/3
84.61% Lines 11/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51            4x 4x 14x 4x           4x     4x                                       4x 4x   4x   4x 4x            
import idParser from "../../utilities/idParser.js";
import ProductsModel from "../../models/Products.js";
import productRatingPreparingStages from "../../utilities/productRatingPreparingStages.js";
import toObjectId from "../../utilities/toObjectId.js";
 
export default async function searchByIds(productsIds, projection, options) {
    try {
        const { withCount, withPrice } = options;
        const ids = productsIds.map((product => toObjectId(idParser(product).id)))
        const pipeline = [
            { $match: { _id: { $in: ids } } },
            { $project: projection },
            ...productRatingPreparingStages()
        ]
 
        const addFieldsStage = {};
 
        function getValueAt(ValueIndex) {
            return {
                $toDouble: {
                    $arrayElemAt: [
                        {
                            $split: [
                                {
                                    $arrayElemAt: [
                                        productsIds,
                                        { $indexOfArray: [ids, "$_id"] }
                                    ]
                                }
                                , "-"
                            ]
                        },
                        ValueIndex
                    ]
                }
            }
        }
 
        if (Boolean(withCount)) addFieldsStage.count = getValueAt(1);
        if (Boolean(withPrice)) addFieldsStage.price = getValueAt(2);
 
        (withCount || withPrice) && pipeline.push({ $addFields: addFieldsStage });
 
        const products = await ProductsModel.aggregate(pipeline);
        return products;
    } catch (error) {
        console.log(error)
        return null;
    }
}