61 lines
1.4 KiB
JavaScript
61 lines
1.4 KiB
JavaScript
|
import { Observable, Scheduler } from 'rx';
|
||
|
import debug from 'debug';
|
||
|
|
||
|
const log = debug('freecc:migrate');
|
||
|
|
||
|
// buildChallengeMap(
|
||
|
// userId: String,
|
||
|
// completedChallenges: Object[],
|
||
|
// User: User
|
||
|
// ) => Observable
|
||
|
function buildChallengeMap(userId, completedChallenges = [], User) {
|
||
|
return Observable.from(
|
||
|
completedChallenges,
|
||
|
null,
|
||
|
null,
|
||
|
Scheduler.default
|
||
|
)
|
||
|
.reduce((challengeMap, challenge) => {
|
||
|
const id = challenge.id || challenge._id;
|
||
|
challenge = challenge && typeof challenge.toJSON === 'function' ?
|
||
|
challenge.toJSON() :
|
||
|
challenge;
|
||
|
|
||
|
challengeMap[id] = challenge;
|
||
|
return challengeMap;
|
||
|
}, {})
|
||
|
.flatMap(challengeMap => {
|
||
|
const updateData = {
|
||
|
'$set': {
|
||
|
challengeMap,
|
||
|
isChallengeMapMigrated: true
|
||
|
}
|
||
|
};
|
||
|
return Observable.fromNodeCallback(User.updateAll, User)(
|
||
|
{ id: userId },
|
||
|
updateData,
|
||
|
{ allowExtendedOperators: true }
|
||
|
);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export default function migrateCompletedChallenges() {
|
||
|
return ({ user, app }, res, next) => {
|
||
|
const User = app.models.User;
|
||
|
if (!user || user.isChallengeMapMigrated) {
|
||
|
return next();
|
||
|
}
|
||
|
return buildChallengeMap(
|
||
|
user.id.toString(),
|
||
|
user.completedChallenges,
|
||
|
User
|
||
|
)
|
||
|
.subscribe(
|
||
|
count => log('documents update', count),
|
||
|
// errors go here
|
||
|
next,
|
||
|
next
|
||
|
);
|
||
|
};
|
||
|
}
|