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; newChallenge.createdAt = createdAt;
oldTasks.forEach(function (oldTask) { 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; delete oldTask.id;
oldTask.tags = _.map(oldTask.tags || {}, function (tagPresent, tagId) { 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 // Load new models
var NewGroup = require('../../website/src/models/group').model; 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 // To be defined later when MongoClient connects
var mongoDbOldInstance; var mongoDbOldInstance;
var oldGroupCollection; var oldGroupCollection;
@@ -100,26 +102,37 @@ function processGroups (afterId) {
} }
oldGroups.forEach(function (oldGroup) { oldGroups.forEach(function (oldGroup) {
if (!oldGroup.members || oldGroup.members.length === 0) return; // delete empty groups if ((!oldGroup.privacy || oldGroup.privacy === 'private') && (!oldGroup.members || oldGroup.members.length === 0)) return; // delete empty private groups
oldGroup.memberCount = oldGroup.members.length; oldGroup.memberCount = oldGroup.members ? oldGroup.members.length : 0;
if (oldGroup.challenges) oldGroup.challengeCount = oldGroup.challenges.length; oldGroup.memberCount = oldGroup.challenges ? oldGroup.challenges.length : 0;
if (!oldGroup.balance <= 0) oldGroup.balance = 0; if (!oldGroup.balance <= 0) oldGroup.balance = 0;
if (!oldGroup.name) oldGroup.name = 'group name'; if (!oldGroup.name) oldGroup.name = 'group name';
if (!oldGroup.leaderOnly) oldGroup.leaderOnly = {}; if (!oldGroup.leaderOnly) oldGroup.leaderOnly = {};
if (!oldGroup.leaderOnly.challenges) oldGroup.leaderOnly.challenges = false; 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) { if (!oldGroup.type) {
//console.log(oldGroup); // throw new Error('group.type is required');
console.error('group.type is required'); oldGroup.type = 'guild';
} }
if (!oldGroup.leader) { if (!oldGroup.leader) {
//console.log(oldGroup); if (oldGroup.members && oldGroup.members.length > 0) {
console.error('group.leader is required'); oldGroup.leader = oldGroup.members[0];
} else {
throw new Error('group.leader is required and no member available!');
}
} }
if (!oldGroup.privacy) { if (!oldGroup.privacy) {
//console.log(oldGroup); // throw new Error('group.privacy is required');
console.error('group.privacy is required'); group.privacy = 'private';
} }
var updateMembers = {}; var updateMembers = {};
@@ -130,7 +143,7 @@ function processGroups (afterId) {
updateMembers.$set = {'party._id': oldGroup._id}; updateMembers.$set = {'party._id': oldGroup._id};
} }
if (oldGroup.type) { if (oldGroup.members) {
promises.push(newUserCollection.updateMany({ promises.push(newUserCollection.updateMany({
_id: {$in: oldGroup.members}, _id: {$in: oldGroup.members},
}, updateMembers, {multi: true})); }, updateMembers, {multi: true}));
@@ -177,6 +190,10 @@ Q.all([
console.log(`Connected with MongoClient to ${MONGODB_OLD} and ${MONGODB_NEW}.`); 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(); return processGroups();
}) })
.catch(function (err) { .catch(function (err) {

View File

@@ -18,6 +18,7 @@ var mongoose = require('mongoose');
var _ = require('lodash'); var _ = require('lodash');
var uuid = require('uuid'); var uuid = require('uuid');
var consoleStamp = require('console-stamp'); var consoleStamp = require('console-stamp');
var common = require('../../common');
// Add timestamps to console messages // Add timestamps to console messages
consoleStamp(console); consoleStamp(console);
@@ -28,6 +29,7 @@ require('../../website/src/libs/api-v3/setupNconf')();
var MONGODB_OLD = nconf.get('MONGODB_OLD'); var MONGODB_OLD = nconf.get('MONGODB_OLD');
var MONGODB_NEW = nconf.get('MONGODB_NEW'); var MONGODB_NEW = nconf.get('MONGODB_NEW');
var taskDefaults = common.taskDefaults;
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work 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); var newUser = new NewUser(oldUser);
oldTasks.forEach(function (oldTask) { oldTasks.forEach(function (oldTask) {
@@ -129,6 +135,8 @@ function processUsers (afterId) {
oldTask.challenge.taskId = oldTask.legacyId; oldTask.challenge.taskId = oldTask.legacyId;
} }
oldTask.createdAt = old.dateCreated;
if (!oldTask.text) oldTask.text = 'task text'; // required if (!oldTask.text) oldTask.text = 'task text'; // required
oldTask.tags = _.map(oldTask.tags, function (tagPresent, tagId) { oldTask.tags = _.map(oldTask.tags, function (tagPresent, tagId) {
return tagPresent && tagId; return tagPresent && tagId;
@@ -138,9 +146,21 @@ function processUsers (afterId) {
newUser.tasksOrder[`${oldTask.type}s`].push(oldTask._id); 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++; processedTasks++;
}); });

View File

@@ -11,6 +11,7 @@ import {
} from '../libs/api-v3/errors'; } from '../libs/api-v3/errors';
export let schema = new mongoose.Schema({ export let schema = new mongoose.Schema({
_id: {type: String, default: couponCode.generate},
event: {type: String, enum: ['wondercon', 'google_6mo']}, event: {type: String, enum: ['wondercon', 'google_6mo']},
user: {type: String, ref: 'User'}, user: {type: String, ref: 'User'},
}, { }, {
@@ -20,14 +21,9 @@ export let schema = new mongoose.Schema({
schema.plugin(baseModel, { schema.plugin(baseModel, {
timestamps: true, 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) { schema.statics.generate = async function generateCoupons (event, count = 1) {
let coupons = _.times(count, () => { let coupons = _.times(count, () => {
return {event}; return {event};

View File

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