From fbce7e65ab18b60b3eb040e0442924fa3a3eab92 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sun, 1 May 2016 23:54:58 +0200 Subject: [PATCH] v3 migration: fixes --- migrations/api_v3/challenges.js | 3 +- migrations/api_v3/groups.js | 37 +++++++++++++++++------ migrations/api_v3/users.js | 24 +++++++++++++-- website/src/models/coupon.js | 8 ++--- website/src/models/emailUnsubscription.js | 1 + 5 files changed, 54 insertions(+), 19 deletions(-) diff --git a/migrations/api_v3/challenges.js b/migrations/api_v3/challenges.js index e2a88df0c4..a650e26188 100644 --- a/migrations/api_v3/challenges.js +++ b/migrations/api_v3/challenges.js @@ -114,7 +114,8 @@ function processChallenges (afterId) { newChallenge.createdAt = createdAt; oldTasks.forEach(function (oldTask) { - oldTask._id = oldTask.id; // keep the old uuid unless duplicated + oldTask._id = uuid.v4(); // TODO keep the old uuid unless duplicated + oldTask.legacyId = oldTask.id; // store the old task id delete oldTask.id; oldTask.tags = _.map(oldTask.tags || {}, function (tagPresent, tagId) { diff --git a/migrations/api_v3/groups.js b/migrations/api_v3/groups.js index 0a75261a22..2fa465c67e 100644 --- a/migrations/api_v3/groups.js +++ b/migrations/api_v3/groups.js @@ -42,6 +42,8 @@ mongoose.Promise = Q.Promise; // otherwise mongoose models won't work // Load new models var NewGroup = require('../../website/src/models/group').model; +var TAVERN_ID = require('../../website/src/models/group').TAVERN_ID; + // To be defined later when MongoClient connects var mongoDbOldInstance; var oldGroupCollection; @@ -100,26 +102,37 @@ function processGroups (afterId) { } oldGroups.forEach(function (oldGroup) { - if (!oldGroup.members || oldGroup.members.length === 0) return; // delete empty groups - oldGroup.memberCount = oldGroup.members.length; - if (oldGroup.challenges) oldGroup.challengeCount = oldGroup.challenges.length; + if ((!oldGroup.privacy || oldGroup.privacy === 'private') && (!oldGroup.members || oldGroup.members.length === 0)) return; // delete empty private groups + oldGroup.memberCount = oldGroup.members ? oldGroup.members.length : 0; + oldGroup.memberCount = oldGroup.challenges ? oldGroup.challenges.length : 0; if (!oldGroup.balance <= 0) oldGroup.balance = 0; if (!oldGroup.name) oldGroup.name = 'group name'; if (!oldGroup.leaderOnly) oldGroup.leaderOnly = {}; if (!oldGroup.leaderOnly.challenges) oldGroup.leaderOnly.challenges = false; + // Tavern + if (oldGroup._id === 'habitrpg') { + oldGroup._id = TAVERN_ID; + oldGroup.leader = '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0'; // Siena Leslie + } + if (!oldGroup.type) { - //console.log(oldGroup); - console.error('group.type is required'); + // throw new Error('group.type is required'); + oldGroup.type = 'guild'; } + if (!oldGroup.leader) { - //console.log(oldGroup); - console.error('group.leader is required'); + if (oldGroup.members && oldGroup.members.length > 0) { + oldGroup.leader = oldGroup.members[0]; + } else { + throw new Error('group.leader is required and no member available!'); + } } + if (!oldGroup.privacy) { - //console.log(oldGroup); - console.error('group.privacy is required'); + // throw new Error('group.privacy is required'); + group.privacy = 'private'; } var updateMembers = {}; @@ -130,7 +143,7 @@ function processGroups (afterId) { updateMembers.$set = {'party._id': oldGroup._id}; } - if (oldGroup.type) { + if (oldGroup.members) { promises.push(newUserCollection.updateMany({ _id: {$in: oldGroup.members}, }, updateMembers, {multi: true})); @@ -177,6 +190,10 @@ Q.all([ console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); + // First delete the tavern group created by having required the group model + return newGroupCollection.deleteOne({_id: TAVERN_ID}); +}) +.then(function () { return processGroups(); }) .catch(function (err) { diff --git a/migrations/api_v3/users.js b/migrations/api_v3/users.js index 21a35c70ac..ecc502025e 100644 --- a/migrations/api_v3/users.js +++ b/migrations/api_v3/users.js @@ -18,6 +18,7 @@ var mongoose = require('mongoose'); var _ = require('lodash'); var uuid = require('uuid'); var consoleStamp = require('console-stamp'); +var common = require('../../common'); // Add timestamps to console messages consoleStamp(console); @@ -28,6 +29,7 @@ require('../../website/src/libs/api-v3/setupNconf')(); var MONGODB_OLD = nconf.get('MONGODB_OLD'); var MONGODB_NEW = nconf.get('MONGODB_NEW'); +var taskDefaults = common.taskDefaults; var MongoClient = MongoDB.MongoClient; mongoose.Promise = Q.Promise; // otherwise mongoose models won't work @@ -116,6 +118,10 @@ function processUsers (afterId) { }; }); + if (oldUser._id === '9') { // Tyler Renelle + oldUser._id = '00000000-0000-4000-9000-000000000000'; + } + var newUser = new NewUser(oldUser); oldTasks.forEach(function (oldTask) { @@ -129,6 +135,8 @@ function processUsers (afterId) { oldTask.challenge.taskId = oldTask.legacyId; } + oldTask.createdAt = old.dateCreated; + if (!oldTask.text) oldTask.text = 'task text'; // required oldTask.tags = _.map(oldTask.tags, function (tagPresent, tagId) { return tagPresent && tagId; @@ -138,9 +146,21 @@ function processUsers (afterId) { newUser.tasksOrder[`${oldTask.type}s`].push(oldTask._id); } - var newTask = new NewTasks[oldTask.type](oldTask); + var allTasksFields = ['_id', 'type', 'text', 'notes', 'tags', 'value', 'priority', 'attribute', 'challenge', 'reminders']; + // using mongoose models is too slow + if (oldTask.type === 'habit') { + oldTask = _.pick(oldTask, allTasksFields.concat(['history', 'up', 'down'])); + } else if (oldTask.type === 'daily') { + oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'history', 'frequency', 'everyX', 'startDate', 'repeat', 'streak'])); + } else if (oldTask.type === 'todo') { + oldTask = _.pick(oldTask, allTasksFields.concat(['completed', 'collapseChecklist', 'checklist', 'date', 'dateCompleted'])); + } else if (oldTask.type === 'reward') { + oldTask = _.pick(oldTask, allTasksFields); + } else { + throw new Error('Task with no or invalid type!'); + } - batchInsertTasks.insert(newTask.toObject()); + batchInsertTasks.insert(taskDefaults(oldTask)); processedTasks++; }); diff --git a/website/src/models/coupon.js b/website/src/models/coupon.js index 5215f64888..af9953aba0 100644 --- a/website/src/models/coupon.js +++ b/website/src/models/coupon.js @@ -11,6 +11,7 @@ import { } from '../libs/api-v3/errors'; export let schema = new mongoose.Schema({ + _id: {type: String, default: couponCode.generate}, event: {type: String, enum: ['wondercon', 'google_6mo']}, user: {type: String, ref: 'User'}, }, { @@ -20,14 +21,9 @@ export let schema = new mongoose.Schema({ schema.plugin(baseModel, { timestamps: true, + _id: false, }); -// Add _id field after plugin to override default _id format -schema.add({ - _id: {type: String, default: couponCode.generate}, -}); - - schema.statics.generate = async function generateCoupons (event, count = 1) { let coupons = _.times(count, () => { return {event}; diff --git a/website/src/models/emailUnsubscription.js b/website/src/models/emailUnsubscription.js index d26c993bb1..fe30e5d608 100644 --- a/website/src/models/emailUnsubscription.js +++ b/website/src/models/emailUnsubscription.js @@ -18,6 +18,7 @@ export let schema = new mongoose.Schema({ schema.plugin(baseModel, { noSet: ['_id'], + timestamps: true, }); export let model = mongoose.model('EmailUnsubscription', schema);