mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-10-26 10:42:52 +01:00
98 lines
3.2 KiB
JavaScript
98 lines
3.2 KiB
JavaScript
/*
|
|
const migrationName = 'AchievementRestore';
|
|
const authorName = 'TheHollidayInn'; // in case script author needs to know when their ...
|
|
const authorUuid = ''; // ... own data is done
|
|
*/
|
|
|
|
/*
|
|
* This migraition will copy user data from prod to test
|
|
*/
|
|
|
|
import monk from 'monk'; // eslint-disable-line import/no-extraneous-dependencies
|
|
|
|
const connectionString = 'mongodb://localhost/new-habit';
|
|
const Users = monk(connectionString).get('users', { castIds: false });
|
|
|
|
const oldConnectionSting = 'mongodb://localhost/old-habit';
|
|
const UsersOld = monk(oldConnectionSting).get('users', { castIds: false });
|
|
|
|
function getAchievementUpdate (newUser, oldUser) {
|
|
const oldAchievements = oldUser.achievements;
|
|
const newAchievements = newUser.achievements;
|
|
|
|
const achievementsUpdate = { ...newAchievements };
|
|
|
|
// ultimateGearSets
|
|
if (!achievementsUpdate.ultimateGearSets && oldAchievements.ultimateGearSets) {
|
|
achievementsUpdate.ultimateGearSets = oldAchievements.ultimateGearSets;
|
|
} else if (oldAchievements.ultimateGearSets) {
|
|
Object.keys(oldAchievements.ultimateGearSets).forEach(index => {
|
|
if (oldAchievements.ultimateGearSets[index]) {
|
|
achievementsUpdate.ultimateGearSets[index] = true;
|
|
}
|
|
});
|
|
}
|
|
|
|
// challenges
|
|
if (!newAchievements.challenges) newAchievements.challenges = [];
|
|
if (!oldAchievements.challenges) oldAchievements.challenges = [];
|
|
achievementsUpdate.challenges = newAchievements.challenges.concat(oldAchievements.challenges);
|
|
|
|
// Quests
|
|
if (!achievementsUpdate.quests) achievementsUpdate.quests = {};
|
|
Object.keys(oldAchievements.quests).forEach(index => {
|
|
if (!achievementsUpdate.quests[index]) {
|
|
achievementsUpdate.quests[index] = oldAchievements.quests[index];
|
|
} else {
|
|
achievementsUpdate.quests[index] += oldAchievements.quests[index];
|
|
}
|
|
});
|
|
|
|
// Rebirth level
|
|
if (achievementsUpdate.rebirthLevel) {
|
|
achievementsUpdate.rebirthLevel = Math.max(
|
|
achievementsUpdate.rebirthLevel,
|
|
oldAchievements.rebirthLevel,
|
|
);
|
|
} else if (oldAchievements.rebirthLevel) {
|
|
achievementsUpdate.rebirthLevel = oldAchievements.rebirthLevel;
|
|
}
|
|
|
|
// All others
|
|
const indexsToIgnore = ['ultimateGearSets', 'challenges', 'quests', 'rebirthLevel'];
|
|
Object.keys(oldAchievements).forEach(index => {
|
|
if (indexsToIgnore.indexOf(index) !== -1) return;
|
|
|
|
if (!achievementsUpdate[index]) {
|
|
achievementsUpdate[index] = oldAchievements[index];
|
|
return;
|
|
}
|
|
|
|
if (Number.isInteger(oldAchievements[index])) {
|
|
achievementsUpdate[index] += oldAchievements[index];
|
|
} else if (oldAchievements[index] === true) achievementsUpdate[index] = true;
|
|
});
|
|
|
|
return achievementsUpdate;
|
|
}
|
|
|
|
export default async function achievementRestore () {
|
|
const userIds = [
|
|
];
|
|
|
|
await Promise.all(userIds.map(userId => (async () => {
|
|
const oldUser = await UsersOld.findOne({ _id: userId }, 'achievements');
|
|
const newUser = await Users.findOne({ _id: userId }, 'achievements');
|
|
const achievementUpdate = getAchievementUpdate(newUser, oldUser);
|
|
await Users.update(
|
|
{ _id: userId },
|
|
{
|
|
$set: {
|
|
achievements: achievementUpdate,
|
|
},
|
|
},
|
|
);
|
|
console.log(`Updated ${userId}`);
|
|
})()));
|
|
}
|