4minitz/4minitz

View on GitHub
imports/server/exportimport/expImpMinutes.js

Summary

Maintainability
C
1 day
Test Coverage
const fs = require('fs');
const EJSON = require('mongodb-extended-json');
let ExpImpTopics = require('./expImpTopics');

class ExpImpMinutes {
    static get FILENAME_POSTFIX() {
        return '_minutes.json';
    }

    static doExport (db, msID, userIDs) {
        return new Promise((resolve, reject) => {
            db.collection('minutes')
                .find({meetingSeries_id: msID})
                .toArray()
                .then(allMinutesDoc => {
                    if (allMinutesDoc) {
                        const minFile = msID + ExpImpMinutes.FILENAME_POSTFIX;
                        fs.writeFileSync(minFile, EJSON.stringify(allMinutesDoc,null,2));
                        console.log('Saved: '+minFile + ' with '+allMinutesDoc.length+' minutes');

                        // Collect additional invited / informed users from older minutes
                        allMinutesDoc.map(min => {
                            min.visibleFor && min.visibleFor.map(userID => {      // should be identical to meeting series
                                userIDs[userID] = 1;
                            });
                            min.informedUsers && min.informedUsers.map(userID => {   // should be identical to meeting series
                                userIDs[userID] = 1;
                            });
                            min.participants && min.participants.map(part => {      // might differ from meeting series users!
                                userIDs[part.userId] = 1;
                            });
                            min.topics && min.topics.map(top => { // iterate topics
                                top.responsibles && top.responsibles.map(resp => {  // topic-responsibles
                                    userIDs[resp] = 1;
                                });
                                top.infoItems && top.infoItems.map(item => {     // topic-actionitem-responsibles
                                    item.responsibles && item.responsibles.map(resp => {
                                        userIDs[resp] = 1;
                                    });
                                });
                            });
                        });

                        resolve({db, userIDs});
                    } else {
                        return reject ('Unknown meeting series ID: '+ msID);
                    }
                });
        });
    }

    static doImport (db, msID, usrMap) {
        return new Promise((resolve, reject) => {
            const minFile = msID + ExpImpMinutes.FILENAME_POSTFIX;
            let minDoc = undefined;
            try {
                minDoc = EJSON.parse(fs.readFileSync(minFile, 'utf8'));
                if (!minDoc) {
                    return reject('Could not read minutes file '+minFile);
                }
            } catch (e) {
                return reject('Could not read minutes file '+minFile+'\n'+e);
            }

            // Replace old user IDs with new users IDs
            let minIDs;
            ({minIDs, minDoc} = ExpImpMinutes.patchUsers(minDoc, usrMap));

            return db.collection('minutes')
                .deleteMany({ _id : { $in : minIDs } })     // delete existing minutes with same IDs
                .then(function (res) {
                    if (res.result && ! res.result.ok) {
                        console.log(res);
                    }
                    return db.collection('minutes')
                        .insertMany(minDoc)                         // insert imported minutes
                        .then(function (res) {
                            if (res.result.ok === 1 && res.result.n === minDoc.length) {
                                console.log('OK, inserted '+res.result.n+' meeting minutes.');
                                resolve({db, usrMap});
                            } else {
                                reject('Could not insert meeting minutes');
                            }
                        });
                });
        });
    }


    static patchUsers(minDoc, usrMap) {
        let minIDs = [];
        for (let m = 0; m<minDoc.length; m++) {                 // iterate all minutes
            minIDs.push(minDoc[m]._id);
            for (let i=0; minDoc[m].visibleFor&&i<minDoc[m].visibleFor.length; i++) {
                minDoc[m].visibleFor[i] = usrMap[minDoc[m].visibleFor[i]];
            }
            for (let i=0; minDoc[m].informedUsers&&i<minDoc[m].informedUsers.length; i++) {
                minDoc[m].informedUsers[i] = usrMap[minDoc[m].informedUsers[i]];
            }
            for (let i=0; minDoc[m].participants&&i<minDoc[m].participants.length; i++) {
                minDoc[m].participants[i].userId = usrMap[minDoc[m].participants[i].userId];
            }

            // iterate topics
            for (let t=0; minDoc[m].topics && t<minDoc[m].topics.length; t++) {
                minDoc[m].topics[t] = ExpImpTopics.patchUsers(minDoc[m].topics[t], usrMap);
            }
        }

        return ({minIDs, minDoc});
    }
}

module.exports = ExpImpMinutes;