mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-10-28 03:32:29 +01:00
102 lines
3.4 KiB
JavaScript
102 lines
3.4 KiB
JavaScript
// %mongo server:27017/dbname underscore.js my_commands.js
|
|
// %mongo server:27017/dbname underscore.js --shell
|
|
|
|
//db.users.find({'auth.facebook.email': 'tylerrenelle@gmail.com'}).forEach(function(user){
|
|
db.users.find().forEach(function(user){
|
|
|
|
if (!user._id) {
|
|
print("User has null _id");
|
|
return; // need to figure out how to delete these buggers if they don't have an id to delete from
|
|
}
|
|
|
|
if (!!user.idLists) {
|
|
print("User " + user._id + " has already been migrated")
|
|
return
|
|
}
|
|
|
|
if (user._id.indexOf("$") === 0) {
|
|
print("User id starts with $ (" + user._id + ")")
|
|
return;
|
|
}
|
|
|
|
// even though we're clobbering user later, sometimes these are undefined and crash the script
|
|
// this saves us some ternaries
|
|
user.stats = user.stats || {};
|
|
user.items = user.items || {};
|
|
user.preferences = user.preferences || {};
|
|
user.notifications = user.notifications || {};
|
|
user.flags = user.flags || {};
|
|
user.habitIds = user.habitIds || [];
|
|
user.dailyIds = user.dailyIds || [];
|
|
user.todoIds = user.todoIds || [];
|
|
user.rewardIds = user.rewardIds|| [];
|
|
|
|
_.each(user.tasks, function(task, key){
|
|
if (!task.type) {
|
|
delete user.tasks[key];
|
|
// idList will take care of itself on page-load
|
|
return
|
|
}
|
|
if (key == '$spec') {
|
|
print("$spec was found: " + user._id);
|
|
return
|
|
}
|
|
if (key.indexOf("$_") === 0) {
|
|
var newKey = key.replace("$_", ''),
|
|
index = user[task.type + "Ids"].indexOf(key)
|
|
user[task.type + "Ids"][index] = newKey;
|
|
task.id = newKey
|
|
user.tasks[newKey] = task
|
|
// TODO make sure this is ok, that we're not deleting the original
|
|
// Otherwise use lodash.cloneDeep
|
|
delete user.tasks[key]
|
|
}
|
|
});
|
|
|
|
// New user schema has public and private paths, so we can setup proper access control with racer
|
|
// Note 'public' and 'private' are reserved words
|
|
var newUser = {
|
|
auth: user.auth, // we need this top-level due to derby-auth
|
|
apiToken: user.preferences.api_token || null, // set on update, we need derby.uuid()
|
|
preferences: {
|
|
armorSet: user.preferences.armorSet || 'v1',
|
|
gender: user.preferences.gender || 'm'
|
|
},
|
|
balance: user.balance || 2,
|
|
lastCron: user.lastCron || +new Date,
|
|
history: user.history || [],
|
|
stats: {
|
|
gp: user.stats.money || 0,
|
|
hp: user.stats.hp || 50,
|
|
exp: user.stats.exp || 0,
|
|
lvl: user.stats.lvl || 1
|
|
},
|
|
items: {
|
|
armor: user.items.armor || 0,
|
|
weapon: user.items.weapon || 0
|
|
},
|
|
tasks: user.tasks || {},
|
|
idLists: {
|
|
habit: user.habitIds || [],
|
|
daily: user.dailyIds || [],
|
|
todo: user.todoIds || [],
|
|
reward: user.rewardIds || []
|
|
},
|
|
flags: {
|
|
partyEnabled: false,
|
|
itemsEnabled: user.items.itemsEnabled || false,
|
|
kickstarter: user.notifications.kickstarter || 'show',
|
|
ads: user.flags.ads || null // null because it's set on registration
|
|
},
|
|
party: {
|
|
current: null,
|
|
invitation: null
|
|
}
|
|
};
|
|
|
|
try {
|
|
db.users.update({_id:user._id}, newUser);
|
|
} catch(e) {
|
|
print(e);
|
|
}
|
|
}) |