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;
|
||||
|
||||
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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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++;
|
||||
});
|
||||
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -18,6 +18,7 @@ export let schema = new mongoose.Schema({
|
||||
|
||||
schema.plugin(baseModel, {
|
||||
noSet: ['_id'],
|
||||
timestamps: true,
|
||||
});
|
||||
|
||||
export let model = mongoose.model('EmailUnsubscription', schema);
|
||||
|
||||
Reference in New Issue
Block a user