| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | const path = require('path'); | 
					
						
							| 
									
										
										
										
											2018-10-07 08:51:58 +01:00
										 |  |  | const fs = require('fs'); | 
					
						
							| 
									
										
										
										
											2018-10-11 20:41:05 -06:00
										 |  |  | require('dotenv').config({ path: path.resolve(__dirname, '../../../.env') }); | 
					
						
							| 
									
										
										
										
											2018-10-28 06:18:13 +00:00
										 |  |  | const { MongoClient, ObjectID } = require('mongodb'); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | const { flatten } = require('lodash'); | 
					
						
							| 
									
										
										
										
											2018-10-07 08:51:58 +01:00
										 |  |  | const debug = require('debug'); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-16 18:22:52 +00:00
										 |  |  | const { getChallengesForLang } = require('../../../curriculum/getChallenges'); | 
					
						
							| 
									
										
										
										
											2018-10-07 08:51:58 +01:00
										 |  |  | const { createPathMigrationMap } = require('./createPathMigrationMap'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const log = debug('fcc:tools:seedChallenges'); | 
					
						
							| 
									
										
										
										
											2018-10-28 06:18:13 +00:00
										 |  |  | const { MONGOHQ_URL, LOCALE: lang = 'english' } = process.env; | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							| 
									
										
										
										
											2015-08-10 12:14:38 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  | MongoClient.connect(MONGOHQ_URL, { useNewUrlParser: true }, function( | 
					
						
							|  |  |  |   err, | 
					
						
							|  |  |  |   client | 
					
						
							|  |  |  | ) { | 
					
						
							|  |  |  |   handleError(err, client); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |   log('Connected successfully to mongo at %s', MONGOHQ_URL); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |   const db = client.db('freecodecamp'); | 
					
						
							|  |  |  |   const challengeCollection = db.collection('challenge'); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |   challengeCollection.deleteMany({}, async err => { | 
					
						
							|  |  |  |     handleError(err, client); | 
					
						
							| 
									
										
										
										
											2018-10-28 06:18:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |     log('deleted all the challenges'); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |     const curriculum = await getChallengesForLang(lang); | 
					
						
							| 
									
										
										
										
											2018-10-06 02:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |     const allChallenges = Object.keys(curriculum) | 
					
						
							|  |  |  |       .map(key => curriculum[key].blocks) | 
					
						
							|  |  |  |       .reduce((challengeArray, superBlock) => { | 
					
						
							|  |  |  |         const challengesForBlock = Object.keys(superBlock).map( | 
					
						
							|  |  |  |           key => superBlock[key].challenges | 
					
						
							| 
									
										
										
										
											2018-10-28 06:18:13 +00:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2019-02-18 19:32:49 +00:00
										 |  |  |         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'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |