mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 22:27:26 +01:00
Aded challenge migration sync (#8492)
* Aded challenge migration sync * Fixed async grouping * Mapped promises and added error catching * Added placholders for syncing specific challenges * Prvented overriding of attribute and createdAt
This commit is contained in:
committed by
Sabe Jones
parent
db9befde17
commit
21ad808cc1
47
migrations/challenges/sync-all-challenges.js
Normal file
47
migrations/challenges/sync-all-challenges.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
import Bluebird from 'Bluebird';
|
||||||
|
|
||||||
|
import { model as Challenges } from '../../website/server/models/challenge';
|
||||||
|
import { model as User } from '../../website/server/models/user';
|
||||||
|
|
||||||
|
async function syncChallengeToMembers (challenges) {
|
||||||
|
let challengSyncPromises = challenges.map(async function (challenge) {
|
||||||
|
let users = await User.find({
|
||||||
|
// _id: '',
|
||||||
|
challenges: challenge._id,
|
||||||
|
}).exec();
|
||||||
|
|
||||||
|
let promises = [];
|
||||||
|
users.forEach(function (user) {
|
||||||
|
promises.push(challenge.syncToUser(user));
|
||||||
|
promises.push(challenge.save());
|
||||||
|
promises.push(user.save());
|
||||||
|
});
|
||||||
|
|
||||||
|
return Bluebird.all(promises);
|
||||||
|
});
|
||||||
|
|
||||||
|
return await Bluebird.all(challengSyncPromises);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function syncChallenges (lastChallengeDate) {
|
||||||
|
let query = {
|
||||||
|
// _id: '',
|
||||||
|
};
|
||||||
|
|
||||||
|
if (lastChallengeDate) {
|
||||||
|
query.createdOn = { $lte: lastChallengeDate };
|
||||||
|
}
|
||||||
|
|
||||||
|
let challengesFound = await Challenges.find(query)
|
||||||
|
.limit(10)
|
||||||
|
.sort('-createdAt')
|
||||||
|
.exec();
|
||||||
|
|
||||||
|
let syncedChallenges = await syncChallengeToMembers(challengesFound)
|
||||||
|
.catch(reason => console.error(reason));
|
||||||
|
let lastChallenge = challengesFound[challengesFound.length - 1];
|
||||||
|
if (lastChallenge) syncChallenges(lastChallenge.createdAt);
|
||||||
|
return syncedChallenges;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = syncChallenges;
|
||||||
@@ -1,24 +1,25 @@
|
|||||||
require("babel-register");
|
require("babel-register");
|
||||||
require("babel-polyfill");
|
require("babel-polyfill");
|
||||||
|
|
||||||
// This file must use ES5, everything required can be in ES6
|
// This file must use ES5, everything required can be in ES6
|
||||||
|
|
||||||
function setUpServer () {
|
function setUpServer () {
|
||||||
var nconf = require('nconf');
|
var nconf = require('nconf');
|
||||||
var mongoose = require('mongoose');
|
var mongoose = require('mongoose');
|
||||||
var Bluebird = require('bluebird');
|
var Bluebird = require('bluebird');
|
||||||
var setupNconf = require('../website/server/libs/setupNconf');
|
var setupNconf = require('../website/server/libs/setupNconf');
|
||||||
setupNconf();
|
setupNconf();
|
||||||
// We require src/server and npt src/index because
|
// We require src/server and npt src/index because
|
||||||
// 1. nconf is already setup
|
// 1. nconf is already setup
|
||||||
// 2. we don't need clustering
|
// 2. we don't need clustering
|
||||||
require('../website/server/server'); // eslint-disable-line global-require
|
require('../website/server/server'); // eslint-disable-line global-require
|
||||||
}
|
}
|
||||||
setUpServer();
|
setUpServer();
|
||||||
|
|
||||||
// Replace this with your migration
|
// Replace this with your migration
|
||||||
var processUsers = require('./groups/update-groups-with-group-plans');
|
var processUsers = require('./groups/update-groups-with-group-plans');
|
||||||
processUsers()
|
processUsers()
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,40 @@ describe('Challenge Model', () => {
|
|||||||
expect(updatedNewMember.tags[7].id).to.equal(challenge._id);
|
expect(updatedNewMember.tags[7].id).to.equal(challenge._id);
|
||||||
expect(updatedNewMember.tags[7].name).to.equal(challenge.shortName);
|
expect(updatedNewMember.tags[7].name).to.equal(challenge.shortName);
|
||||||
expect(syncedTask).to.exist;
|
expect(syncedTask).to.exist;
|
||||||
|
expect(syncedTask.attribute).to.eql('str');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('syncs a challenge to a user with the existing task', async () => {
|
||||||
|
await challenge.addTasks([task]);
|
||||||
|
|
||||||
|
let updatedLeader = await User.findOne({_id: leader._id});
|
||||||
|
let updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}});
|
||||||
|
let syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) {
|
||||||
|
return updatedLeadersTask.challenge.taskId === task._id;
|
||||||
|
});
|
||||||
|
|
||||||
|
let createdAtBefore = syncedTask.createdAt;
|
||||||
|
let attributeBefore = syncedTask.attribute;
|
||||||
|
|
||||||
|
let newTitle = 'newName';
|
||||||
|
task.text = newTitle;
|
||||||
|
task.attribute = 'int';
|
||||||
|
await task.save();
|
||||||
|
await challenge.syncToUser(leader);
|
||||||
|
|
||||||
|
updatedLeader = await User.findOne({_id: leader._id});
|
||||||
|
updatedLeadersTasks = await Tasks.Task.find({_id: { $in: updatedLeader.tasksOrder[`${taskType}s`]}});
|
||||||
|
|
||||||
|
syncedTask = find(updatedLeadersTasks, function findNewTask (updatedLeadersTask) {
|
||||||
|
return updatedLeadersTask.challenge.taskId === task._id;
|
||||||
|
});
|
||||||
|
|
||||||
|
let createdAtAfter = syncedTask.createdAt;
|
||||||
|
let attributeAfter = syncedTask.attribute;
|
||||||
|
|
||||||
|
expect(createdAtBefore).to.eql(createdAtAfter);
|
||||||
|
expect(attributeBefore).to.eql(attributeAfter);
|
||||||
|
expect(syncedTask.text).to.eql(newTitle);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('updates tasks to challenge and challenge members', async () => {
|
it('updates tasks to challenge and challenge members', async () => {
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ export async function getTasks (req, res, options = {}) {
|
|||||||
export function syncableAttrs (task) {
|
export function syncableAttrs (task) {
|
||||||
let t = task.toObject(); // lodash doesn't seem to like _.omit on Document
|
let t = task.toObject(); // lodash doesn't seem to like _.omit on Document
|
||||||
// only sync/compare important attrs
|
// only sync/compare important attrs
|
||||||
let omitAttrs = ['_id', 'userId', 'challenge', 'history', 'tags', 'completed', 'streak', 'notes', 'updatedAt', 'group', 'checklist'];
|
let omitAttrs = ['_id', 'userId', 'challenge', 'history', 'tags', 'completed', 'streak', 'notes', 'updatedAt', 'createdAt', 'group', 'checklist', 'attribute'];
|
||||||
if (t.type !== 'reward') omitAttrs.push('value');
|
if (t.type !== 'reward') omitAttrs.push('value');
|
||||||
return _.omit(t, omitAttrs);
|
return _.omit(t, omitAttrs);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user