diff --git a/index.js b/index.js index bea266a763..b5f4e11dab 100644 --- a/index.js +++ b/index.js @@ -5,19 +5,34 @@ var adler32 = require('adler32'); var Rx = require('rx'), _ = require('lodash'), + utils = require('../server/utils'), getChallenges = require('./getChallenges'), app = require('../server/server'); +var dasherize = utils.dasherize; +var nameify = utils.nameify; +var Observable = Rx.Observable; var Challenge = app.models.Challenge; -var destroy = Rx.Observable.fromNodeCallback(Challenge.destroyAll, Challenge); -var create = Rx.Observable.fromNodeCallback(Challenge.create, Challenge); -destroy() - .flatMap(function() { return Rx.Observable.from(getChallenges()); }) +var destroyChallenges = + Observable.fromNodeCallback(Challenge.destroyAll, Challenge); +var createChallenges = + Observable.fromNodeCallback(Challenge.create, Challenge); + +var Block = app.models.Block; +var destroyBlocks = Observable.fromNodeCallback(Block.destroyAll, Block); +var createBlocks = Observable.fromNodeCallback(Block.create, Block); + +Observable.combineLatest( + destroyChallenges(), + destroyBlocks() +) + .last() + .flatMap(function() { return Observable.from(getChallenges()); }) .flatMap(function(challengeSpec) { var order = challengeSpec.order; - var block = challengeSpec.name; + var blockName = challengeSpec.name; var superBlock = challengeSpec.superBlock; var superOrder = challengeSpec.superOrder; var isBeta = !!challengeSpec.isBeta; @@ -25,48 +40,62 @@ destroy() var fileName = challengeSpec.fileName; var helpRoom = challengeSpec.helpRoom || 'Help'; - console.log('parsed %s successfully', block); + console.log('parsed %s successfully', blockName); // challenge file has no challenges... if (challengeSpec.challenges.length === 0) { - return Rx.Observable.just([{ block: 'empty ' + block }]); + return Rx.Observable.just([{ block: 'empty ' + blockName }]); } - var challenges = challengeSpec.challenges - .map(function(challenge, index) { - challenge.name = challenge.title.replace(/[^a-zA-Z0-9\s]/g, ''); + var block = { + title: blockName, + name: nameify(blockName), + dashedName: dasherize(blockName), + superOrder: superOrder, + superBlock: superBlock, + order: order + }; - challenge.dashedName = challenge.name - .toLowerCase() - .replace(/\:/g, '') - .replace(/\s/g, '-'); + return createBlocks(block) + .map(block => { + console.log('successfully created %s block', block.name); - challenge.checksum = adler32.sum( - Buffer(challenge.title + - JSON.stringify(challenge.description) + - JSON.stringify(challenge.challengeSeed) + - JSON.stringify(challenge.tests))); + return challengeSpec.challenges + .map(function(challenge, index) { + challenge.name = nameify(challenge.title); - challenge.fileName = fileName; - challenge.helpRoom = helpRoom; - challenge.order = order; - challenge.suborder = index + 1; - challenge.block = block; - challenge.isBeta = challenge.isBeta || isBeta; - challenge.isComingSoon = challenge.isComingSoon || isComingSoon; - challenge.time = challengeSpec.time; - challenge.superOrder = superOrder; - challenge.superBlock = superBlock - .split('-') - .map(function(word) { - return _.capitalize(word); - }) - .join(' '); + challenge.dashedName = dasherize(challenge.name); - return challenge; - }); + challenge.checksum = adler32.sum( + Buffer( + challenge.title + + JSON.stringify(challenge.description) + + JSON.stringify(challenge.challengeSeed) + + JSON.stringify(challenge.tests) + ) + ); - return create(challenges); + challenge.fileName = fileName; + challenge.helpRoom = helpRoom; + challenge.order = order; + challenge.suborder = index + 1; + challenge.block = blockName; + challenge.blockId = block.id; + challenge.isBeta = challenge.isBeta || isBeta; + challenge.isComingSoon = challenge.isComingSoon || isComingSoon; + challenge.time = challengeSpec.time; + challenge.superOrder = superOrder; + challenge.superBlock = superBlock + .split('-') + .map(function(word) { + return _.capitalize(word); + }) + .join(' '); + + return challenge; + }); + }) + .flatMap(challenges => createChallenges(challenges)); }) .subscribe( function(challenges) {