Add certification page
This commit is contained in:
131
server/boot/certificate.js
Normal file
131
server/boot/certificate.js
Normal file
@@ -0,0 +1,131 @@
|
||||
import _ from 'lodash';
|
||||
import dedent from 'dedent';
|
||||
import { Observable } from 'rx';
|
||||
import debugFactory from 'debug';
|
||||
|
||||
import {
|
||||
ifNoUser401,
|
||||
ifNoUserSend
|
||||
} from '../utils/middleware';
|
||||
|
||||
import {
|
||||
saveUser,
|
||||
observeQuery
|
||||
} from '../utils/rx';
|
||||
|
||||
const frontEndChallangeId = '561add10cb82ac38a17513be';
|
||||
const fullStackChallangeId = '660add10cb82ac38a17513be';
|
||||
const debug = debugFactory('freecc:certification');
|
||||
const sendMessageToNonUser = ifNoUserSend(
|
||||
'must be logged in to complete.'
|
||||
);
|
||||
|
||||
function isCertified(frontEndIds, { completedChallenges, isFrontEndCert }) {
|
||||
if (isFrontEndCert) {
|
||||
return true;
|
||||
}
|
||||
return _.every(frontEndIds, ({ id }) => _.some(completedChallenges, { id }));
|
||||
}
|
||||
|
||||
export default function certificate(app) {
|
||||
const router = app.loopback.Router();
|
||||
const { Challenge } = app.models;
|
||||
|
||||
const frontEndChallangeIds$ = observeQuery(
|
||||
Challenge,
|
||||
'findById',
|
||||
frontEndChallangeId,
|
||||
{
|
||||
tests: true
|
||||
}
|
||||
)
|
||||
.map(({ tests = [] }) => tests)
|
||||
.shareReplay();
|
||||
|
||||
const fullStackChallangeIds$ = observeQuery(
|
||||
Challenge,
|
||||
'findById',
|
||||
fullStackChallangeId,
|
||||
{
|
||||
tests: true
|
||||
}
|
||||
)
|
||||
.map(({ tests = [] }) => tests)
|
||||
.shareReplay();
|
||||
|
||||
router.post(
|
||||
'/certificate/verify/front-end',
|
||||
ifNoUser401,
|
||||
verifyCert
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/certificate/verify/full-stack',
|
||||
ifNoUser401,
|
||||
verifyCert
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/certificate/honest',
|
||||
sendMessageToNonUser,
|
||||
postHonest
|
||||
);
|
||||
|
||||
app.use(router);
|
||||
|
||||
function verifyCert(req, res, next) {
|
||||
const isFront = req.path.split('/').pop() === 'front-end';
|
||||
Observable.just({})
|
||||
.flatMap(() => {
|
||||
if (isFront) {
|
||||
return frontEndChallangeIds$;
|
||||
}
|
||||
return fullStackChallangeIds$;
|
||||
})
|
||||
.flatMap((tests) => {
|
||||
const { user } = req;
|
||||
if (
|
||||
isFront && !user.isFrontEndCert && isCertified(tests, user) ||
|
||||
!isFront && !user.isFullStackCert && isCertified(tests, user)
|
||||
) {
|
||||
debug('certified');
|
||||
if (isFront) {
|
||||
user.isFrontEndCert = true;
|
||||
} else {
|
||||
user.isFullStackCert = true;
|
||||
}
|
||||
return saveUser(user);
|
||||
}
|
||||
return Observable.just(user);
|
||||
})
|
||||
.subscribe(
|
||||
user => {
|
||||
if (
|
||||
isFront && user.isFrontEndCert ||
|
||||
!isFront && user.isFullStackCert
|
||||
) {
|
||||
return res.status(200).send(true);
|
||||
}
|
||||
return res.status(200).send(
|
||||
dedent`
|
||||
Looks like you have not completed the neccessary steps,
|
||||
Please return the map
|
||||
`
|
||||
);
|
||||
},
|
||||
next
|
||||
);
|
||||
}
|
||||
|
||||
function postHonest(req, res, next) {
|
||||
const { user } = req;
|
||||
user.isHonest = true;
|
||||
saveUser(user)
|
||||
.subscribe(
|
||||
(user) => {
|
||||
res.status(200).send(!!user.isHonest);
|
||||
},
|
||||
next
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user