59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import debug from 'debug';
 | 
						|
import { pickBy } from 'lodash';
 | 
						|
import { Observable } from 'rx';
 | 
						|
 | 
						|
import { cachedMap, getChallenge } from '../utils/map';
 | 
						|
import { shapeChallenges } from '../../common/app/redux/utils';
 | 
						|
 | 
						|
const log = debug('fcc:services:challenge');
 | 
						|
const isDev = debug.enabled('fcc:*');
 | 
						|
 | 
						|
export default function getChallengesForBlock(app) {
 | 
						|
  const challengeMap = cachedMap(app.models);
 | 
						|
  return {
 | 
						|
    name: 'challenge',
 | 
						|
    read: function readChallengesForBlock(
 | 
						|
        req,
 | 
						|
        resource,
 | 
						|
        { dashedName, blockName} = {},
 | 
						|
        config,
 | 
						|
        cb
 | 
						|
      ) {
 | 
						|
      const getChallengeBlock$ = challengeMap
 | 
						|
        .flatMap(({
 | 
						|
          result: { superBlocks },
 | 
						|
          entities: {
 | 
						|
            block: fullBlockMap,
 | 
						|
            challenge: challengeMap
 | 
						|
          }
 | 
						|
        }) => {
 | 
						|
          log(`sourcing challenges for the ${blockName} block`);
 | 
						|
          const requestedChallenges = pickBy(
 | 
						|
            challengeMap,
 | 
						|
            ch => ch.block === blockName
 | 
						|
          );
 | 
						|
          const entities = {
 | 
						|
            block: {
 | 
						|
              [blockName]: fullBlockMap[blockName]
 | 
						|
            },
 | 
						|
            challenge: requestedChallenges
 | 
						|
          };
 | 
						|
          const { challenge, block } = shapeChallenges(entities, isDev);
 | 
						|
          return Observable.of({
 | 
						|
            result: { superBlocks },
 | 
						|
            entities: { challenge, block }
 | 
						|
          });
 | 
						|
        });
 | 
						|
      return Observable.if(
 | 
						|
        () => !!dashedName,
 | 
						|
        getChallenge(dashedName, blockName, challengeMap, 'en'),
 | 
						|
        getChallengeBlock$
 | 
						|
      )
 | 
						|
        .subscribe(
 | 
						|
          result => cb(null, result),
 | 
						|
          cb
 | 
						|
        );
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 |