4minitz/4minitz

View on GitHub
server/migrations/migrate_v20.js

Summary

Maintainability
A
3 hrs
Test Coverage
import { TopicSchema } from '/imports/collections/topic.schema';
import { MinutesSchema } from '/imports/collections/minutes.schema';

function saveMinutes(minutes) {
    minutes.forEach(min => {
        MinutesSchema.getCollection().update(
            min._id, {
                $set: {
                    'topics': min.topics,
                }
            },
            {bypassCollection2: true}
        );
    });
}

function saveTopics(topics) {
    topics.forEach(topic => {
        TopicSchema.getCollection().update(
            topic._id, {
                $set: {
                    'infoItems': topic.infoItems,
                }
            },
            {bypassCollection2: true}
        );
    });
}

function forEachDetailInTopics(topics, operation){
    topics.forEach(topic =>{
        topic.infoItems.forEach(infoItem => {
            if(infoItem.details) {
                infoItem.details.forEach(operation);
            }
        });
    });
}

function forEachDetailInMinutes(minutes, operation) {
    minutes.forEach(min => {
        forEachDetailInTopics(min.topics, operation);
    });
}

// Details: add field: isNew
export class MigrateV20 {

    static up() {
        let allTopics = TopicSchema.getCollection().find();
        forEachDetailInTopics(allTopics, detail => {
            detail.isNew = false;
        });
        saveTopics(allTopics);

        let allMinutes = MinutesSchema.getCollection().find();
        allMinutes.forEach(min => {
            forEachDetailInTopics(min.topics, detail => {
                detail.isNew = (detail.createdInMinute === min._id);
            });
        });
        saveMinutes(allMinutes);
    }

    static down() {
        let allTopics = TopicSchema.getCollection().find();
        forEachDetailInTopics(allTopics, detail => {
            delete detail.isNew;
        });
        saveTopics(allTopics);

        let allMinutes = MinutesSchema.getCollection().find();
        forEachDetailInMinutes(allMinutes, detail => {
            delete detail.isNew;
        });
        saveMinutes(allMinutes);
    }
}