Your IP : 216.73.216.91


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

import makeConfiguration from './configuration.js'
import { UniqueConstraintError } from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'

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

    async function getItems({ max = 100, before, after } = {}) {
        const db = await database
        const query = {}
        if (before || after) {
            query._id = {}
            query._id = before ? { ...query._id, $lt: db.makeId(before) } : query._id
            query._id = after ? { ...query._id, $gt: db.makeId(after) } : query._id
        }

        return (await db
            .collection('configurations')
            .find(query)
            .limit(Number(max))
            .toArray()).map(documentConfiguration)
    }

    async function add({ configurationId, ...configuration }) {
        const db = await database
        if (configurationId) {
            configuration._id = db.makeId(configurationId)
        }
        configuration.createdDate = new Date()
        configuration.lastUpdatedDate = new Date()
        let configurations_count =  await db
        .collection('configurations').count();
        //console.log("configurations_count" ,configurations_count);
        if(configurations_count >= 1){
            // return "Can not add more than one configurations you can update exsisting configurations"
            return makeHttpError({
                statusCode: 400,
                errorMessage:"Can not add more than one configurations you can update exsisting configurations"
            })
        }
        const { result, ops } = await db
            .collection('configurations')
            .insertOne(configuration)
            .catch(mongoError => {
                const [errorCode] = mongoError.message.split(' ')
                if (errorCode === 'E11000') {
                    const [_, mongoIndex] = mongoError.message.split(':')[2].split(' ')
                    throw new UniqueConstraintError(
                        mongoIndex === 'rateChargeEmailIndex' ? 'emailAddress' : 'rateChargeId'
                    )
                }
                throw mongoError
            })
        return {
            success: result.ok === 1,
            created: documentConfiguration(ops[0])
        }
    }

    async function findById({ configurationId }) {
        const db = await database
        const found = await db
            .collection('configurations')
            .findOne({ _id: db.makeId(configurationId) })
        if (found) {
            return documentConfiguration(found)
        }
        return null
    }

    async function findByEmail({ emailAddress }) {
        const db = await database
        const results = await db
            .collection('configurations')
            .find({ emailAddress })
            .toArray()
        return results.map(documentConfiguration)
    }

    async function remove({ configurationId, ...configuration }) {
        const db = await database
        if (configuration) {
            configuration._id = db.makeId(configurationId)
        }

        const { result } = await db.collection('configurations').deleteMany(configuration)
        return result.n
    }

    // todo:
    async function replace(rateCharge) { }

    // todo:
    async function update({configurationId, configuration}) {
        const db = await database
        //console.log(configurationId)
        //console.log(configuration)

        configuration.lastUpdatedDate = new Date()

        var q = {};

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

        const query = {
            $set: q
        }

        //console.log(query)

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

        //console.log(result)

        if (result.nModified != 1) {
            return {
                success: false,
                error: "Something went wrong when performing this operation."
            }
        }

        return {
            success: true,
            configuration: configuration
        };
    }

    function documentConfiguration({ ...doc }) {
        return makeConfiguration({ ...doc })
    }
}