diff --git a/migrations/20180110_nextPaymentProcessing.js b/migrations/20180110_nextPaymentProcessing.js new file mode 100644 index 0000000000..1e2afbd52e --- /dev/null +++ b/migrations/20180110_nextPaymentProcessing.js @@ -0,0 +1,82 @@ +var migrationName = '20180110_nextPaymentProcessing.js'; +var authorName = 'paglias'; // in case script author needs to know when their ... +var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done + +/* + * Convert purchased.plan.nextPaymentProcessing from a double to a date field + */ + +var monk = require('monk'); +var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +var dbUsers = monk(connectionString).get('users', { castIds: false }); + +function processUsers(lastId) { + // specify a query to limit the affected users (empty for all users): + var query = { + 'purchased.plan.paymentMethod': "Apple", + 'purchased.plan.nextPaymentProcessing': {$type: 'double'}, + }; + + if (lastId) { + query._id = { + $gt: lastId + } + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + }) + .then(updateUsers) + .catch(function (err) { + console.log(err); + return exiting(1, 'ERROR! ' + err); + }); +} + +var progressCount = 100; +var count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + var userPromises = users.map(updateUser); + var lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(function () { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + + var set = { + 'purchased.plan.nextPaymentProcessing': new Date(user.purchased.plan.nextPaymentProcessing), + }; + + dbUsers.update({_id: user._id}, {$set: set}); + + if (count % progressCount == 0) console.warn(count + ' ' + user._id); +} + +function displayData() { + console.warn('\n' + count + ' users processed\n'); + return exiting(0); +} + +function exiting(code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { msg = 'ERROR!'; } + if (msg) { + if (code) { console.error(msg); } + else { console.log( msg); } + } + process.exit(code); +} + +module.exports = processUsers;