4minitz/4minitz

View on GitHub
server/migrations/migrate_v7.js

Summary

Maintainability
C
7 hrs
Test Coverage
import { Random} from 'meteor/random';
import { MinutesSchema } from '/imports/collections/minutes.schema';
import { MeetingSeriesSchema } from '/imports/collections/meetingseries.schema';
import { GlobalSettings } from '/imports/config/GlobalSettings';

// adds the label field to meeting series, topics and info items
export class MigrateV7 {

    static _upgradeTopics(topics) {
        // add new empty field labels for each infoItem in each topic
        topics.forEach(topic => {
            topic.infoItems.forEach(infoItem => {
                if (infoItem.labels === undefined) {
                    infoItem.labels = [];
                }
            });
            if (topic.labels === undefined) {
                topic.labels = [];
            }
        });
    }

    static _downgradeTopics(topics) {
        // remove field labels for each infoItem in each topic
        topics.forEach(topic => {
            topic.infoItems.forEach(infoItem => {
                delete infoItem.labels;
            });
            delete topic.labels;
        });
    }


    static up() {

        MinutesSchema.getCollection().find().forEach(minute => {
            MigrateV7._upgradeTopics(minute.topics);

            // We use getCollection() here to skip .clean & .validate to allow empty string values
            MinutesSchema.getCollection().update(
                minute._id, {
                    $set: {
                        'topics': minute.topics
                    }
                });
        });

        MeetingSeriesSchema.getCollection().find().forEach(series => {
            MigrateV7._upgradeTopics(series.openTopics);
            MigrateV7._upgradeTopics(series.topics);

            let defaultLabels = GlobalSettings.getDefaultLabels();
            defaultLabels.forEach((label) => {
                label._id = Random.id();
                label.isDefaultLabel = true;
                label.isDisabled = false;
            });

            // We use getCollection() here to skip .clean & .validate to allow empty string values
            MeetingSeriesSchema.getCollection().update(
                series._id, {
                    $set: {
                        'topics': series.topics,
                        'openTopics': series.openTopics,
                        'availableLabels': defaultLabels
                    }
                });
        });
    }

    static down() {
        MinutesSchema.getCollection().find().forEach(minute => {
            MigrateV7._downgradeTopics(minute.topics);

            // We use getCollection() here to skip .clean & .validate to allow empty string values
            MinutesSchema.getCollection().update(
                minute._id, {
                    $set: {
                        'topics': minute.topics
                    }
                });
        });

        MeetingSeriesSchema.getCollection().find().forEach(series => {
            MigrateV7._downgradeTopics(series.openTopics);
            MigrateV7._downgradeTopics(series.topics);

            // We use getCollection() here to skip .clean & .validate to allow empty string values
            MeetingSeriesSchema.getCollection().update(
                series._id, {
                    $set: {
                        'topics': series.topics,
                        'openTopics': series.openTopics
                    },
                    $unset: {
                        'availableLabels' : ''
                    }
                });
        });
    }
}