mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
v3 migration: fixes
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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++;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user