codecombat/scripts/mongodb/migrations/migratePrepaidsToV2.js
2015-08-13 11:13:15 -07:00

116 lines
2.8 KiB
JavaScript

// Update existing prepaids to v2
// Usage:
// mongo <address>:<port>/<database> <script file> -u <username> -p <password>
//
// - Add 'redeemers' property (redeemed date set to prepaid creation date)
// - Add 'maxRedeemers' property
// - Remove 'status' property
// - Remove 'redeemer' property
var host = db.getMongo().host;
if (host === 'localhost' || host === '127.0.0.1') {
insertTestData();
}
migratePrepaidsToV2();
function migratePrepaidsToV2() {
print("Migrating prepaids to V2...");
var cursor = db.prepaids.find({'status': {$exists: true}});
print("V1 prepaids found: " + cursor.count());
while (cursor.hasNext()) {
var doc = cursor.next();
var conditions = {_id: doc._id};
var operations = {
$set: {
maxRedeemers: NumberInt(1)
},
$unset: {
status: "",
redeemer: ""
}
};
if (doc.redeemer && (!doc.redeemers || doc.redeemers.length < 1)) {
operations.$set.redeemers = [{userID: doc.redeemer, date: doc._id.getTimestamp()}]
}
// printjson(conditions);
// printjson(operations);
var writeResult = db.prepaids.update(conditions, operations);
// printjson(writeResult)
}
cursor = db.prepaids.find({'status': {$exists: true}});
if (cursor.count()) {
print("Error: still have prepaids with status property: " + cursor.count());
}
else {
print("Done.");
}
}
function insertTestData() {
var host = db.getMongo().host;
if (host !== 'localhost' && host !== '127.0.0.1') {
print("Do NOT insert test data on a non-local mongo instance!");
return;
}
for (var i = 0; i < 10; i++) {
createPrepaid();
}
}
// Copied from createBulkPrepaids.js and updated to V1 schema
function createPrepaid()
{
print("Inserting prepaid:");
generateNewCode(function(code) {
if (!code) {
print("ERROR: no code");
return;
}
var criteria = {
creator: ObjectId('512ef4805a67a8c507000001'),
type: 'subscription',
status: 'active',
code: code,
properties: {
couponID: 'free'
},
__v: 0
};
if (Math.random() > 0.5) {
criteria.redeemer = ObjectId('52f94443fcb334581466a992');
criteria.status = 'used';
}
printjson(criteria);
var writeResult = db.prepaids.insert(criteria);
printjson(writeResult);
});
}
function generateNewCode(done)
{
function tryCode() {
code = createCode(8);
criteria = {code: code};
if (db.prepaids.findOne(criteria)) {
return tryCode();
}
return done(code);
}
tryCode();
}
function createCode(length)
{
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < length; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}