87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const path = require('path');
 | |
| const fs = require('fs');
 | |
| require('dotenv').config({ path: path.resolve(__dirname, '../../../.env') });
 | |
| const { MongoClient, ObjectID } = require('mongodb');
 | |
| const { flatten } = require('lodash');
 | |
| const debug = require('debug');
 | |
| 
 | |
| const { getChallengesForLang } = require('../../../curriculum/getChallenges');
 | |
| const { createPathMigrationMap } = require('./createPathMigrationMap');
 | |
| 
 | |
| const log = debug('fcc:tools:seedChallenges');
 | |
| const { MONGOHQ_URL, LOCALE: lang = 'english' } = process.env;
 | |
| 
 | |
| function handleError(err, client) {
 | |
|   if (err) {
 | |
|     console.error('Oh noes!!');
 | |
|     console.error(err);
 | |
|     try {
 | |
|       client.close();
 | |
|     } catch (e) {
 | |
|       // no-op
 | |
|     } finally {
 | |
|       /* eslint-disable-next-line no-process-exit */
 | |
|       process.exit(1);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| MongoClient.connect(MONGOHQ_URL, { useNewUrlParser: true }, function(
 | |
|   err,
 | |
|   client
 | |
| ) {
 | |
|   handleError(err, client);
 | |
| 
 | |
|   log('Connected successfully to mongo at %s', MONGOHQ_URL);
 | |
| 
 | |
|   const db = client.db('freecodecamp');
 | |
|   const challengeCollection = db.collection('challenge');
 | |
| 
 | |
|   challengeCollection.deleteMany({}, async err => {
 | |
|     handleError(err, client);
 | |
| 
 | |
|     log('deleted all the challenges');
 | |
| 
 | |
|     const curriculum = await getChallengesForLang(lang);
 | |
| 
 | |
|     const allChallenges = Object.keys(curriculum)
 | |
|       .map(key => curriculum[key].blocks)
 | |
|       .reduce((challengeArray, superBlock) => {
 | |
|         const challengesForBlock = Object.keys(superBlock).map(
 | |
|           key => superBlock[key].challenges
 | |
|         );
 | |
|         return [...challengeArray, ...flatten(challengesForBlock)];
 | |
|       }, [])
 | |
|       .map(challenge => {
 | |
|         const currentId = challenge.id.slice(0);
 | |
|         challenge._id = ObjectID(currentId);
 | |
|         delete challenge.id;
 | |
|         return challenge;
 | |
|       });
 | |
| 
 | |
|     try {
 | |
|       challengeCollection.insertMany(allChallenges, { ordered: false }, err => {
 | |
|         handleError(err, client);
 | |
|         log('challenge seed complete');
 | |
|         client.close();
 | |
|       });
 | |
|     } catch (e) {
 | |
|       handleError(e, client);
 | |
|     } finally {
 | |
|       log('generating path migration map');
 | |
|       const pathMap = createPathMigrationMap(curriculum);
 | |
|       const outputDir = path.resolve(
 | |
|         __dirname,
 | |
|         '../../../api-server/server/resources/pathMigration.json'
 | |
|       );
 | |
|       fs.writeFile(outputDir, JSON.stringify(pathMap), err => {
 | |
|         if (err) {
 | |
|           console.error('Oh noes!!');
 | |
|           console.error(err);
 | |
|         }
 | |
|         log('path migration map generated');
 | |
|       });
 | |
|     }
 | |
|   });
 | |
| });
 |