diff --git a/migrations/tasks/tasks-set-yesterdailies.js b/migrations/tasks/tasks-set-yesterdailies.js new file mode 100644 index 0000000000..8ce87b1046 --- /dev/null +++ b/migrations/tasks/tasks-set-yesterdailies.js @@ -0,0 +1,83 @@ +var migrationName = 'tasks-set-yesterdaily'; +var authorName = 'TheHollidayInn'; // in case script author needs to know when their ... +var authorUuid = ''; //... own data is done + +/* + * Iterates over all tasks and sets the yseterDaily field to True + */ + +import monk from 'monk'; + +var connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE +var dbTasks = monk(connectionString).get('tasks', { castIds: false }); + +function processTasks(lastId) { + // specify a query to limit the affected tasks (empty for all tasks): + var query = { + yesterDaily: false, + }; + + if (lastId) { + query._id = { + $gt: lastId + } + } + + dbTasks.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + ], + }) + .then(updateTasks) + .catch(function (err) { + console.log(err); + return exiting(1, 'ERROR! ' + err); + }); +} + +var progressCount = 1000; +var count = 0; + +function updateTasks (tasks) { + if (!tasks || tasks.length === 0) { + console.warn('All appropriate tasks found and modified.'); + displayData(); + return; + } + + var taskPromises = tasks.map(updatetask); + var lasttask = tasks[tasks.length - 1]; + + return Promise.all(taskPromises) + .then(function () { + processtasks(lasttask._id); + }); +} + +function updatetask (task) { + count++; + var set = {'yesterDaily': true}; + + dbTasks.update({_id: task._id}, {$set:set}); + + if (count % progressCount == 0) console.warn(count + ' ' + task._id); + if (task._id == authorUuid) console.warn(authorName + ' processed'); +} + +function displayData() { + console.warn('\n' + count + ' tasks 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 = processtasks; diff --git a/website/server/models/task.js b/website/server/models/task.js index 8c5c3aa87a..226a364408 100644 --- a/website/server/models/task.js +++ b/website/server/models/task.js @@ -245,6 +245,7 @@ export let DailySchema = new Schema(_.defaults({ weeksOfMonth: {type: [Number], default: []}, // Weeks of the month that the daily should repeat on isDue: {type: Boolean}, nextDue: [{type: String}], + yesterDaily: {type: Boolean, default: true, required: true}, }, habitDailySchema(), dailyTodoSchema()), subDiscriminatorOptions); export let daily = Task.discriminator('daily', DailySchema);