Update user migration script to ensure user model validity.

pull/320/head
terakilobyte 2015-04-15 00:53:36 -04:00
parent ddb88643e0
commit 3748356079
1 changed files with 95 additions and 63 deletions

View File

@ -1,6 +1,5 @@
require('dotenv').load(); require('dotenv').load();
var mongodb = require('mongodb'), var mongodb = require('mongodb'),
User = require('../models/User.js'), User = require('../models/User.js'),
newChallenges = require('./challengeMapping.json'), newChallenges = require('./challengeMapping.json'),
secrets = require('../config/secrets'); secrets = require('../config/secrets');
@ -8,69 +7,102 @@ var mongodb = require('mongodb'),
mongoose.connect(secrets.db); mongoose.connect(secrets.db);
var i = 1; function userModelAssurity(cb) {
var stream = User.find({}).skip(0).limit(0).stream(); console.log('userModelAssurity');
var i = 1;
var stream = User.find({}).skip(0).limit(0).batchSize(20000).stream();
stream.on('data', function(user) { stream.on('data', function (user) {
console.log(i++); console.log(i++);
user.save() this.pause();
}) user.needsMigration = true;
.on('error', function (err) { user.save(function (err) {
console.log(err); if (err) {
}).on('close', function () { console.log('woops');
}
this.resume();
}.bind(this));
})
.on('error', function (err) {
console.log(err);
}).on('close', function () {
console.log('done with set');
stream.destroy();
cb();
});
}
function migrateIt() {
console.log('migrateIt');
var dones = 0;
var done = function() {
dones++;
if (dones === 2) {
process.exit(0);
}
if (dones === 1) {
userModelMigration(done);
}
};
console.log('calling userModelAssurity');
userModelAssurity(done);
}
function userModelMigration(cb) {
var i = 1;
var stream = User.find({needsMigration: true}).skip(0).limit(0)
.batchSize(20000).stream();
stream.on('data', function (user) {
console.log(i++);
if (user.challengesHash) {
this.pause();
user.needsMigration = false;
var oldChallenges = Object.keys(user.challengesHash).filter(function (key) {
if (user.challengesHash[key]) {
user.progressTimestamps.push(user.challengesHash[key] * 1000);
}
return user.challengesHash[key];
});
newChallenges.forEach(function (challenge) {
if (oldChallenges.indexOf(challenge.oldNumber) !== -1 && challenge.newId) {
user.completedCoursewares.push({
_id: challenge.newId,
completedDate: user.challengesHash[challenge.oldNumber] * 1000
});
}
});
user.completedCoursewares.forEach(function (course) {
var indexOfCourse = user.uncompletedCoursewares.indexOf(course._id) !== -1;
if (indexOfCourse !== -1) {
user.uncompletedCoursewares.splice(indexOfCourse, 1);
}
});
user.completedBonfires.forEach(function (bonfire) {
bonfire.completedDate = bonfire.completedDate * 1000;
user.progressTimestamps.push(bonfire.completedDate);
});
}
var self = this;
user.save(function (err) {
if (err) {
console.log('woops');
}
self.resume();
});
}).on('error', function (err) {
console.log(err);
}).on('close', function () {
console.log('done with set'); console.log('done with set');
stream.destroy(); stream.destroy();
}); cb();
i = 1;
var stream = User.find({'user.needsMigration': true}).skip(0).limit(0).stream();
stream.on('data', function (user) {
if (user.challengesHash) {
this.pause();
console.log(i++);
user.needsMigration = false;
var oldChallenges = Object.keys(user.challengesHash).filter(function (key) {
if (user.challengesHash[key]) {
user.progressTimestamps.push(user.challengesHash[key] * 1000);
}
return user.challengesHash[key];
});
newChallenges.forEach(function (challenge) {
if (oldChallenges.indexOf(challenge.oldNumber) !== -1 && challenge.newId) {
user.completedCoursewares.push({
_id: challenge.newId,
completedDate: user.challengesHash[challenge.oldNumber] * 1000
});
}
});
user.completedCoursewares.forEach(function (course) {
var indexOfCourse = user.uncompletedCoursewares.indexOf(course._id) !== -1;
if (indexOfCourse !== -1) {
user.uncompletedCoursewares.splice(indexOfCourse, 1);
}
});
user.completedBonfires.forEach(function (bonfire) {
bonfire.completedDate = bonfire.completedDate * 1000;
user.progressTimestamps.push(bonfire.completedDate);
});
}
var self = this;
user.save(function(err) {
if (err) {
console.log('woops');
}
self.resume();
}); });
}).on('error', function (err) { }
console.log(err);
}).on('close', function () { migrateIt();
console.log('done with set');
stream.destroy();
process.exit(0);
});