| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  | import debug from 'debug'; | 
					
						
							|  |  |  | import { Observable } from 'rx'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 06:12:05 +01:00
										 |  |  | import { cachedMap } from '../utils/map'; | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | const log = debug('fcc:services:mapUi'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  | export default function mapUiService(app) { | 
					
						
							|  |  |  |   const challengeMap = cachedMap(app.models); | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     name: 'map-ui', | 
					
						
							| 
									
										
										
										
											2018-05-15 06:12:05 +01:00
										 |  |  |     read: function readMapUi(req, resource, _, config, cb) { | 
					
						
							|  |  |  |       return challengeMap | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  |         .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]) | 
					
						
							| 
									
										
										
										
											2018-02-27 14:29:37 +00:00
										 |  |  |             .reduce( | 
					
						
							|  |  |  |               (map, { dashedName, title, time, challenges, superBlock }) => { | 
					
						
							|  |  |  |                 map[dashedName] = { | 
					
						
							|  |  |  |                   dashedName, | 
					
						
							|  |  |  |                   title, | 
					
						
							|  |  |  |                   time, | 
					
						
							|  |  |  |                   challenges, | 
					
						
							|  |  |  |                   superBlock | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |                 return map; | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |               {} | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  |           const challengeMap = Object.keys(fullChallengeMap) | 
					
						
							|  |  |  |             .map(challenge => fullChallengeMap[challenge]) | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  |             .reduce((map, challenge) => { | 
					
						
							|  |  |  |               const { | 
					
						
							|  |  |  |                 dashedName, | 
					
						
							|  |  |  |                 id, | 
					
						
							|  |  |  |                 title, | 
					
						
							|  |  |  |                 name, | 
					
						
							|  |  |  |                 block, | 
					
						
							|  |  |  |                 isLocked, | 
					
						
							|  |  |  |                 isComingSoon, | 
					
						
							| 
									
										
										
										
											2018-03-02 12:06:58 +00:00
										 |  |  |                 isBeta, | 
					
						
							|  |  |  |                 challengeType | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  |               } = challenge; | 
					
						
							|  |  |  |               map[dashedName] = { | 
					
						
							|  |  |  |                 dashedName, | 
					
						
							|  |  |  |                 id, | 
					
						
							|  |  |  |                 title, | 
					
						
							|  |  |  |                 name, | 
					
						
							|  |  |  |                 block, | 
					
						
							|  |  |  |                 isLocked, | 
					
						
							|  |  |  |                 isComingSoon, | 
					
						
							| 
									
										
										
										
											2018-03-02 12:06:58 +00:00
										 |  |  |                 isBeta, | 
					
						
							|  |  |  |                 challengeType | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  |               }; | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  |               return map; | 
					
						
							|  |  |  |             }, {}); | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  |           const mapUi = { | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  |             result: { superBlocks }, | 
					
						
							|  |  |  |             entities: { | 
					
						
							|  |  |  |               superBlock: superBlockMap, | 
					
						
							|  |  |  |               block: blockMap, | 
					
						
							|  |  |  |               challenge: challengeMap | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-02-23 12:20:13 +00:00
										 |  |  |           }; | 
					
						
							|  |  |  |           return Observable.of(mapUi); | 
					
						
							| 
									
										
										
										
											2018-02-20 13:07:32 +00:00
										 |  |  |         }).subscribe( | 
					
						
							|  |  |  |           mapUi => cb(null, mapUi ), | 
					
						
							|  |  |  |           err => { log(err); return cb(err); } | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } |