function migrateDomain()

in modules/backend/migrations/1516948939797-migrate-configs.js [249:317]


function migrateDomain(clustersModel, cachesModel, domainsModel, domain) {
    const cachesCnt = _.size(domain.caches);

    if (cachesCnt < 1) {
        if (_debug)
            log(`Found domain model not linked to cache [domain=${domain._id}]`);

        return getClusterForMigration(clustersModel, domain.space)
            .then((clusterLostFound) => linkDomainToCluster(clustersModel, clusterLostFound, domainsModel, domain))
            .then(() => getCacheForMigration(clustersModel, cachesModel, domain.space))
            .then((cacheLostFound) => linkDomainToCache(cachesModel, cacheLostFound, domainsModel, domain))
            .catch((err) => error(`Failed to migrate not linked domain [domain=${domain._id}]`, err));
    }

    if (_.isEmpty(domain.clusters)) {
        const cachesCnt = _.size(domain.caches);

        if (_debug)
            log(`Found domain model without cluster: [domain=${domain._id}, cachesCnt=${cachesCnt}]`);

        const grpByClusters = {};

        return cachesModel.find({_id: {$in: domain.caches}}).lean().exec()
            .then((caches) => {
                if (caches) {
                    _.forEach(caches, (cache) => {
                        const c = _.get(grpByClusters, cache.clusters[0]);

                        if (c)
                            c.push(cache._id);
                        else
                            grpByClusters[cache.clusters[0]] = [cache._id];
                    });

                    return _.reduce(_.keys(grpByClusters), (start, cluster, idx) => start.then(() => {
                        const domainId = domain._id;

                        const clusterCaches = grpByClusters[cluster];

                        if (idx > 0) {
                            delete domain._id;
                            domain.caches = clusterCaches;

                            return domainsModel.create(domain)
                                .then((clonedDomain) => {
                                    return cachesModel.updateOne({_id: {$in: clusterCaches}}, {$addToSet: {domains: clonedDomain._id}}).exec()
                                        .then(() => clonedDomain);
                                })
                                .then((clonedDomain) => linkDomainToCluster(clustersModel, {_id: cluster, name: `stub${idx}`}, domainsModel, clonedDomain))
                                .then(() => {
                                    return cachesModel.updateMany({_id: {$in: clusterCaches}}, {$pull: {domains: domainId}}).exec();
                                });
                        }

                        return domainsModel.updateOne({_id: domainId}, {caches: clusterCaches}).exec()
                            .then(() => linkDomainToCluster(clustersModel, {_id: cluster, name: `stub${idx}`}, domainsModel, domain));
                    }), Promise.resolve());
                }

                error(`Found domain with orphaned caches: [domain=${domain._id}, caches=${domain.caches}]`);

                return Promise.resolve();
            })
            .catch((err) => error(`Failed to migrate domain [domain=${domain._id}]`, err));
    }

    // Nothing to migrate, other domains will be migrated with caches.
    return Promise.resolve();
}