v3 migration: fixes

This commit is contained in:
Matteo Pagliazzi
2016-05-01 23:54:58 +02:00
parent 60eefde15f
commit fbce7e65ab
5 changed files with 54 additions and 19 deletions

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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++;
});

View File

@@ -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};

View File

@@ -18,6 +18,7 @@ export let schema = new mongoose.Schema({
schema.plugin(baseModel, {
noSet: ['_id'],
timestamps: true,
});
export let model = mongoose.model('EmailUnsubscription', schema);