Permalink
Cannot retrieve contributors at this time
Fetching contributors…

import _ from 'lodash'; | |
import dedent from 'dedent'; | |
import { Observable } from 'rx'; | |
import debug from 'debug'; | |
import { | |
ifNoUser401, | |
ifNoUserSend | |
} from '../utils/middleware'; | |
import { observeQuery } from '../utils/rx'; | |
import { | |
frontEndChallengeId, | |
dataVisChallengeId, | |
backEndChallengeId | |
} from '../utils/constantStrings.json'; | |
import { | |
completeCommitment$ | |
} from '../utils/commit'; | |
import certTypes from '../utils/certTypes.json'; | |
const log = debug('fcc:certification'); | |
const sendMessageToNonUser = ifNoUserSend( | |
'must be logged in to complete.' | |
); | |
function isCertified(ids, challengeMap = {}) { | |
return _.every(ids, ({ id }) => challengeMap[id]); | |
} | |
function getIdsForCert$(id, Challenge) { | |
return observeQuery( | |
Challenge, | |
'findById', | |
id, | |
{ | |
id: true, | |
tests: true, | |
name: true, | |
challengeType: true | |
} | |
) | |
.shareReplay(); | |
} | |
export default function certificate(app) { | |
const router = app.loopback.Router(); | |
const { Challenge } = app.models; | |
const certTypeIds = { | |
[certTypes.frontEnd]: getIdsForCert$(frontEndChallengeId, Challenge), | |
[certTypes.dataVis]: getIdsForCert$(dataVisChallengeId, Challenge), | |
[certTypes.backEnd]: getIdsForCert$(backEndChallengeId, Challenge) | |
}; | |
router.post( | |
'/certificate/verify/front-end', | |
ifNoUser401, | |
verifyCert.bind(null, certTypes.frontEnd) | |
); | |
router.post( | |
'/certificate/verify/back-end', | |
ifNoUser401, | |
verifyCert.bind(null, certTypes.backEnd) | |
); | |
router.post( | |
'/certificate/verify/data-visualization', | |
ifNoUser401, | |
verifyCert.bind(null, certTypes.dataVis) | |
); | |
router.post( | |
'/certificate/honest', | |
sendMessageToNonUser, | |
postHonest | |
); | |
app.use(router); | |
function verifyCert(certType, req, res, next) { | |
const { user } = req; | |
return certTypeIds[certType] | |
.flatMap(challenge => { | |
const { | |
id, | |
tests, | |
name, | |
challengeType | |
} = challenge; | |
if ( | |
!user[certType] && | |
isCertified(tests, user.challengeMap) | |
) { | |
const updateData = { | |
$set: { | |
[`challengeMap.${id}`]: { | |
id, | |
name, | |
completedDate: new Date(), | |
challengeType | |
}, | |
[certType]: true | |
} | |
}; | |
return req.user.update$(updateData) | |
// If user has commited to nonprofit, | |
// this will complete his pledge | |
.flatMap( | |
() => completeCommitment$(user), | |
({ count }, pledgeOrMessage) => { | |
if (typeof pledgeOrMessage === 'string') { | |
log(pledgeOrMessage); | |
} | |
log(`${count} documents updated`); | |
return true; | |
} | |
); | |
} | |
return Observable.just(false); | |
}) | |
.subscribe( | |
(didCertify) => { | |
if (didCertify) { | |
return res.status(200).send(true); | |
} | |
return res.status(200).send( | |
dedent` | |
Looks like you have not completed the neccessary steps. | |
Please return to the challenge map. | |
` | |
); | |
}, | |
next | |
); | |
} | |
function postHonest(req, res, next) { | |
return req.user.update$({ $set: { isHonest: true } }).subscribe( | |
() => res.status(200).send(true), | |
next | |
); | |
} | |
} |