87 lines
2.4 KiB
JavaScript
87 lines
2.4 KiB
JavaScript
import debug from 'debug';
|
|
import { Observable } from 'rx';
|
|
|
|
import { cachedMap } from '../utils/map';
|
|
|
|
const log = debug('fcc:services:mapUi');
|
|
|
|
|
|
export default function mapUiService(app) {
|
|
const challengeMap = cachedMap(app.models);
|
|
return {
|
|
name: 'map-ui',
|
|
read: function readMapUi(req, resource, _, config, cb) {
|
|
return challengeMap
|
|
.flatMap(({
|
|
result: { superBlocks },
|
|
entities: {
|
|
superBlock: fullSuperBlockMap,
|
|
block: fullBlockMap,
|
|
challenge: fullChallengeMap
|
|
}
|
|
}) => {
|
|
const superBlockMap = superBlocks
|
|
.map(superBlock => fullSuperBlockMap[superBlock])
|
|
.reduce((map, { dashedName, blocks, title }) => {
|
|
map[dashedName] = { blocks, title, dashedName};
|
|
return map;
|
|
}, {});
|
|
const blockMap = Object.keys(fullBlockMap)
|
|
.map(block => fullBlockMap[block])
|
|
.reduce(
|
|
(map, { dashedName, title, time, challenges, superBlock }) => {
|
|
map[dashedName] = {
|
|
dashedName,
|
|
title,
|
|
time,
|
|
challenges,
|
|
superBlock
|
|
};
|
|
return map;
|
|
},
|
|
{}
|
|
);
|
|
const challengeMap = Object.keys(fullChallengeMap)
|
|
.map(challenge => fullChallengeMap[challenge])
|
|
.reduce((map, challenge) => {
|
|
const {
|
|
dashedName,
|
|
id,
|
|
title,
|
|
name,
|
|
block,
|
|
isLocked,
|
|
isComingSoon,
|
|
isBeta,
|
|
challengeType
|
|
} = challenge;
|
|
map[dashedName] = {
|
|
dashedName,
|
|
id,
|
|
title,
|
|
name,
|
|
block,
|
|
isLocked,
|
|
isComingSoon,
|
|
isBeta,
|
|
challengeType
|
|
};
|
|
return map;
|
|
}, {});
|
|
const mapUi = {
|
|
result: { superBlocks },
|
|
entities: {
|
|
superBlock: superBlockMap,
|
|
block: blockMap,
|
|
challenge: challengeMap
|
|
}
|
|
};
|
|
return Observable.of(mapUi);
|
|
}).subscribe(
|
|
mapUi => cb(null, mapUi ),
|
|
err => { log(err); return cb(err); }
|
|
);
|
|
}
|
|
};
|
|
}
|