|
const config = require('config'); |
|
const mongodb = require('mongodb'); |
|
const async = require('async'); |
|
const _ = require('lodash'); |
|
const MongoClient = mongodb.MongoClient; |
|
|
|
MongoClient.connect(config.src, (err, _src) => { |
|
if (err) { |
|
return console.log(`Could not connect to source database ${config.src}`); |
|
} |
|
|
|
const srcDb = _src.db(_src.s.options.dbName); |
|
const src = { |
|
db: srcDb, |
|
projects: srcDb.collection('projects'), |
|
forms: srcDb.collection('forms'), |
|
submissions: srcDb.collection('submissions'), |
|
roles: srcDb.collection('roles'), |
|
actions: srcDb.collection('actions'), |
|
formrevisions: srcDb.collection('formrevisions'), |
|
tags: srcDb.collection('tags') |
|
}; |
|
|
|
MongoClient.connect(config.dest, (err, _dest) => { |
|
if (err) { |
|
return console.log(`Could not connect to destination database ${config.src}`); |
|
} |
|
|
|
const destDb = _dest.db(_dest.s.options.dbName); |
|
const dest = { |
|
db: destDb, |
|
projects: destDb.collection('projects'), |
|
forms: destDb.collection('forms'), |
|
submissions: destDb.collection('submissions'), |
|
roles: destDb.collection('roles'), |
|
actions: destDb.collection('actions'), |
|
formrevisions: destDb.collection('formrevisions'), |
|
tags: destDb.collection('tags') |
|
}; |
|
|
|
const upsertAll = function(collection, query, each, done) { |
|
src[collection].find(query).toArray((err, items) => { |
|
if (err) { |
|
console.error(`Cannot load source ${collection}`, err); |
|
return done(err); |
|
} |
|
|
|
async.eachSeries(items, (item, nextItem) => { |
|
dest[collection].update({_id: item._id}, item, {upsert: true}, (err) => { |
|
if (err) { |
|
console.error(`Error updating ${collection} ${item._id}`, err); |
|
return nextItem(); |
|
} |
|
|
|
console.log(`Upserting ${collection} - ${item._id}`); |
|
if (each) { |
|
each(item, nextItem); |
|
} |
|
else { |
|
nextItem(); |
|
} |
|
}); |
|
}, done); |
|
}); |
|
}; |
|
|
|
upsertAll('projects', {_id: mongodb.ObjectID(config.project)}, (project, nextProject) => { |
|
upsertAll('forms', {project: project._id, deleted: {$eq: null}}, (form, nextForm) => { |
|
upsertAll('submissions', {form: form._id, deleted: {$eq: null}}, null, () => { |
|
upsertAll('actions', {form: form._id, deleted: {$eq: null}}, null, () => nextForm()); |
|
}); |
|
}, () => { |
|
upsertAll('roles', {project: project._id, deleted: {$eq: null}}, null, () => { |
|
upsertAll('tags', {project: project._id, deleted: {$eq: null}}, null, () => { |
|
upsertAll('formrevisions', {project: project._id, deleted: {$eq: null}}, null, () => nextProject()); |
|
}); |
|
}); |
|
}); |
|
}, () => { |
|
console.log('DONE!'); |
|
}); |
|
}); |
|
}); |