e-ucm/rage-analytics-backend

View on GitHub
bin/upgrade/transformers/mongo/transformToVersion3.js

Summary

Maintainability
B
4 hrs
Test Coverage
/*
 * Copyright 2016 e-UCM (http://www.e-ucm.es/)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * This project has received funding from the European Union’s Horizon
 * 2020 research and innovation programme under grant agreement No 644187.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0 (link is external)
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'use strict';

function backup(config, callback) {
    callback(null, config);
}

function upgrade(config, callback) {
    // Transformers
    var classesCollection = config.mongodb.db.collection('classes');
    var sessionsCollection = config.mongodb.db.collection('sessions');
    var activitiesCollection = config.mongodb.db.collection('activities');

    var cleanClasses = function() {
        // Remove the unnecesary fields from class
        classesCollection.updateMany({},
            { $unset: { gameId: '', versionId: ''} }
        ).then(function() {
            sessionsCollection.find({}, function(err, iterator) {
                iterator.toArray(function(err, docs) {
                    if (docs.length > 0) {
                        // Rename activities collection to activities
                        sessionsCollection.rename('activities', function(err, newColl) {
                            if (err) {
                                return callback(err);
                            }
                            callback(null, config);
                        });
                    }else {
                        sessionsCollection.drop(function(err, result) {
                            config.mongodb.db.db.createCollection('activities', function(err, result) {
                                callback(null, config);
                            });
                        });
                    }
                });
            });
        });
    };

    activitiesCollection.find({}, function(err, iterator) {
        iterator.toArray(function(err, docs) {
            if (docs.length > 0) {
                var ts = new Date().getTime();
                console.log('WARNING MongoTransformerTo3: Activities collection already exists, creating backup in "activities_' + ts + '"');
                activitiesCollection.rename('activities_' + ts, function(err, newColl) {
                    if (err) {
                        console.log('WARNING MongoTransformerTo3: Cant create backup, aborting');
                        return callback(err);
                    }
                    console.log('MongoTransformerTo3: Activities collection backup created');

                    cleanClasses();
                });
            }else {
                activitiesCollection.drop(function(err, result) {
                    cleanClasses();
                });
            }
        });
    });
}


function check(config, callback) {

    config.mongodb.db.db.listCollections().toArray(function(err, collections) {
        if (err) {
            console.log('Unexpected error while checking collections names!', err);
            return callback(err);
        }

        var activitiesExists = false;

        for (var key in collections) {
            var collection = collections[key];
            if (collection.name === 'activities') {
                activitiesExists = true;
            }
            if (collection.name === 'sessions') {
                return callback(new Error('Sessions collection found!'));
            }
        }

        if (!activitiesExists) {
            return callback(new Error('Activities collection not found!'));
        }


        var classesCollection = config.mongodb.db.collection('classes');

        classesCollection.find().forEach(function(classDoc) {
            if (classDoc.gameId) {
                return callback(new Error('A class contains a gameId'));
            }
            if (classDoc.versionId) {
                return callback(new Error('A class contains a versionId'));
            }
        });


        var activitiesCollection = config.mongodb.db.collection('activities');
        activitiesCollection.find().forEach(function(activity) {
            if (!activity.gameId) {
                return callback(new Error('An activity does not contain a gameId'));
            }
            if (!activity.versionId) {
                return callback(new Error('An activity does not contain a versionId'));
            }
        });
        callback(null, config);
    });
}

function clean(config, callback) {
    // TODO exceptions
    callback(null, config);
}

function restore(config, callback) {
    // TODO exceptions
    callback(null, config);
}

module.exports = {
    backup: backup,
    upgrade: upgrade,
    check: check,
    clean: clean,
    restore: restore,
    requires: {}, // Depends on nothing
    version: {
        origin: '2',
        destination: '3'
    }
};