68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | const { from, of } = require('rxjs'); | ||
|  | const { switchMap, tap } = require('rxjs/operators'); | ||
|  | const debug = require('debug'); | ||
|  | 
 | ||
|  | const { getChallengesForLang } = require('../../../curriculum/getChallenges'); | ||
|  | const { chunkDocument, stripHTML, stripURLs } = require('../../utils'); | ||
|  | 
 | ||
|  | const log = debug('fcc:search:data-source:challenges'); | ||
|  | 
 | ||
|  | const { LOCALE: lang } = process.env; | ||
|  | 
 | ||
|  | module.exports = function getChallenges() { | ||
|  |   log('sourcing challenges'); | ||
|  |   return from(getChallengesForLang(lang)).pipe( | ||
|  |     tap(() => log('parsing curriculum')), | ||
|  |     switchMap(curriculum => { | ||
|  |       const superBlocks = Object.keys(curriculum).filter( | ||
|  |         x => x !== 'certificates' | ||
|  |       ); | ||
|  |       return from(superBlocks.map(superBlock => curriculum[superBlock])); | ||
|  |     }), | ||
|  |     switchMap(superBlock => { | ||
|  |       const { blocks } = superBlock; | ||
|  |       return from(Object.keys(blocks).map(block => blocks[block])); | ||
|  |     }), | ||
|  |     switchMap(block => { | ||
|  |       const { meta, challenges } = block; | ||
|  |       const { dashedName: blockDashedName } = meta; | ||
|  |       return of( | ||
|  |         challenges.map(challenge => ({ ...challenge, blockDashedName })) | ||
|  |       ); | ||
|  |     }), | ||
|  |     switchMap(challenges => { | ||
|  |       const formattedChallenges = challenges | ||
|  |         .filter(({ isPrivate }) => !isPrivate) | ||
|  |         .reduce((acc, current) => { | ||
|  |           const { | ||
|  |             id, | ||
|  |             title, | ||
|  |             description, | ||
|  |             instructions, | ||
|  |             dashedName, | ||
|  |             superBlock, | ||
|  |             blockDashedName, | ||
|  |             block | ||
|  |           } = current; | ||
|  |           const formattedChallenge = { | ||
|  |             blockName: block, | ||
|  |             id, | ||
|  |             title, | ||
|  |             description: stripURLs(stripHTML(description.concat(instructions))), | ||
|  |             url: `/${superBlock}/${blockDashedName}/${dashedName}` | ||
|  |           }; | ||
|  |           return [ | ||
|  |             ...acc, | ||
|  |             ...chunkDocument( | ||
|  |               formattedChallenge, | ||
|  |               ['title', 'id', 'blockName', 'url'], | ||
|  |               'description' | ||
|  |             ) | ||
|  |           ]; | ||
|  |         }, []); | ||
|  | 
 | ||
|  |       return of(formattedChallenges); | ||
|  |     }) | ||
|  |   ); | ||
|  | }; |