Commit uses challengeMap

This commit is contained in:
Berkeley Martinez
2016-02-09 20:54:49 -08:00
parent 76cfbdf752
commit dc27f53ecb

View File

@ -1,17 +1,14 @@
import _ from 'lodash'; import _ from 'lodash';
import dedent from 'dedent'; import dedent from 'dedent';
import { Observable } from 'rx'; import { Observable } from 'rx';
import debugFactory from 'debug'; import debug from 'debug';
import { import {
ifNoUser401, ifNoUser401,
ifNoUserSend ifNoUserSend
} from '../utils/middleware'; } from '../utils/middleware';
import { import { observeQuery } from '../utils/rx';
saveUser,
observeQuery
} from '../utils/rx';
import { import {
frontEndChallengeId, frontEndChallengeId,
@ -25,17 +22,13 @@ import {
import certTypes from '../utils/certTypes.json'; import certTypes from '../utils/certTypes.json';
const debug = debugFactory('freecc:certification'); const log = debug('freecc:certification');
const sendMessageToNonUser = ifNoUserSend( const sendMessageToNonUser = ifNoUserSend(
'must be logged in to complete.' 'must be logged in to complete.'
); );
function isCertified(ids, { completedChallenges }) { function isCertified(ids, challengeMap = {}) {
return _.every(ids, ({ id }) => { return _.every(ids, ({ id }) => challengeMap[id]);
return _.some(completedChallenges, (challenge) => {
return challenge.id === id || challenge._id === id;
});
});
} }
function getIdsForCert$(id, Challenge) { function getIdsForCert$(id, Challenge) {
@ -90,12 +83,9 @@ export default function certificate(app) {
app.use(router); app.use(router);
function verifyCert(certType, req, res, next) { function verifyCert(certType, req, res, next) {
Observable.just({})
.flatMap(() => {
return certTypeIds[certType];
})
.flatMap(challenge => {
const { user } = req; const { user } = req;
return certTypeIds[certType]()
.flatMap(challenge => {
const { const {
id, id,
tests, tests,
@ -104,38 +94,39 @@ export default function certificate(app) {
} = challenge; } = challenge;
if ( if (
!user[certType] && !user[certType] &&
isCertified(tests, user) isCertified(tests, user.challengeMap)
) { ) {
user[certType] = true; const updateData = {
user.completedChallenges.push({ $set: {
[`challengeMap.${id}`]: {
id, id,
name, name,
completedDate: new Date(), completedDate: new Date(),
challengeType challengeType
}); },
[certType]: true
}
};
return saveUser(user) return req.user.udate$(updateData)
// If user has commited to nonprofit, // If user has commited to nonprofit,
// this will complete his pledge // this will complete his pledge
.flatMap( .flatMap(
user => completeCommitment$(user), () => completeCommitment$(user),
(user, pledgeOrMessage) => { ({ count }, pledgeOrMessage) => {
if (typeof pledgeOrMessage === 'string') { if (typeof pledgeOrMessage === 'string') {
debug(pledgeOrMessage); log(pledgeOrMessage);
} }
// we are only interested in the user object log(`${count} documents updated`);
// so we ignore return from completeCommitment$ return true;
return user;
} }
); );
} }
return Observable.just(user); return Observable.just(false);
}) })
.subscribe( .subscribe(
user => { (didCertify) => {
if ( if (didCertify) {
user[certType]
) {
return res.status(200).send(true); return res.status(200).send(true);
} }
return res.status(200).send( return res.status(200).send(
@ -150,13 +141,8 @@ export default function certificate(app) {
} }
function postHonest(req, res, next) { function postHonest(req, res, next) {
const { user } = req; return req.user.update$({ $set: { isHonest: true } }).subscribe(
user.isHonest = true; () => res.status(200).send(true),
saveUser(user)
.subscribe(
(user) => {
res.status(200).send(!!user.isHonest);
},
next next
); );
} }