Feature(routing): add current-challenge redirect logic

This commit is contained in:
Berkeley Martinez
2016-08-04 10:49:37 -07:00
parent 8f14076f35
commit 8121ada14c

View File

@ -4,8 +4,10 @@ import debug from 'debug';
import accepts from 'accepts'; import accepts from 'accepts';
import { ifNoUserSend } from '../utils/middleware'; import { ifNoUserSend } from '../utils/middleware';
import { cachedMap } from '../utils/map';
import createNameIdMap from '../../common/utils/create-name-id-map';
const log = debug('fcc:challenges'); const log = debug('fcc:boot:challenges');
function buildUserUpdate( function buildUserUpdate(
user, user,
@ -58,11 +60,14 @@ function buildUserUpdate(
return { alreadyCompleted, updateData }; return { alreadyCompleted, updateData };
} }
module.exports = function(app) { export default function(app) {
const router = app.loopback.Router();
const send200toNonUser = ifNoUserSend(true); const send200toNonUser = ifNoUserSend(true);
const api = app.loopback.Router();
const router = app.loopback.Router();
const Block = app.models.Block;
const map$ = cachedMap(Block);
router.post( api.post(
'/modern-challenge-completed', '/modern-challenge-completed',
send200toNonUser, send200toNonUser,
modernChallengeCompleted modernChallengeCompleted
@ -70,13 +75,13 @@ module.exports = function(app) {
// deprecate endpoint // deprecate endpoint
// remove once new endpoint is live // remove once new endpoint is live
router.post( api.post(
'/completed-challenge', '/completed-challenge',
send200toNonUser, send200toNonUser,
completedChallenge completedChallenge
); );
router.post( api.post(
'/challenge-completed', '/challenge-completed',
send200toNonUser, send200toNonUser,
completedChallenge completedChallenge
@ -84,19 +89,25 @@ module.exports = function(app) {
// deprecate endpoint // deprecate endpoint
// remove once new endpoint is live // remove once new endpoint is live
router.post( api.post(
'/completed-zipline-or-basejump', '/completed-zipline-or-basejump',
send200toNonUser, send200toNonUser,
projectCompleted projectCompleted
); );
router.post( api.post(
'/project-completed', '/project-completed',
send200toNonUser, send200toNonUser,
projectCompleted projectCompleted
); );
app.use(router); router.get(
'/challenges/current-challenge',
redirectToCurrentChallenge
);
app.use(api);
app.use('/:lang', router);
function modernChallengeCompleted(req, res, next) { function modernChallengeCompleted(req, res, next) {
const type = accepts(req).type('html', 'json', 'text'); const type = accepts(req).type('html', 'json', 'text');
@ -255,4 +266,53 @@ module.exports = function(app) {
}) })
.subscribe(() => {}, next); .subscribe(() => {}, next);
} }
};
function redirectToCurrentChallenge(req, res, next) {
const { user } = req;
return map$
.map(({ entities, result }) => ({
result,
entities: createNameIdMap(entities)
}))
.map(({
result,
entities: {
challenge: challengeMap,
block: blockMap,
superBlock: superBlockMap,
challengeIdToName
}
}) => {
let finalChallenge;
const dashedName = challengeIdToName[user && user.currentChallengeId];
finalChallenge = challengeMap[dashedName];
if (
!challengeMap ||
!blockMap ||
!superBlockMap ||
!result ||
!result.length
) {
throw new Error(
'entities not found, db may not be properly seeded. Crashing hard'
);
}
// redirect to first challenge
if (!finalChallenge) {
finalChallenge = challengeMap[
block[
superBlockMap[
result[0]
].blocks[0]
].challenges[0]
];
}
const { block, dashedName: finalDashedName } = finalChallenge || {};
return `/challenges/${block}/${finalDashedName}`;
})
.subscribe(
redirect => res.redirect(redirect || '/map'),
next
);
}
}