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); }
 | |
|         );
 | |
|     }
 | |
|   };
 | |
| }
 |