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'); }); } }); });