| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | var _ = require('lodash'), | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |     debug = require('debug')('freecc:cntr:courseware'), | 
					
						
							|  |  |  |     Courseware = require('./../models/Courseware'), | 
					
						
							|  |  |  |     User = require('./../models/User'), | 
					
						
							|  |  |  |     resources = require('./resources'), | 
					
						
							|  |  |  |     R = require('ramda'), | 
					
						
							|  |  |  |     moment = require('moment'); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2015-02-01 23:35:27 -08:00
										 |  |  |  * Courseware controller | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-22 18:23:50 +09:00
										 |  |  | exports.showAllCoursewares = function(req, res) { | 
					
						
							| 
									
										
										
										
											2015-03-30 13:09:24 -07:00
										 |  |  |   var completedList = []; | 
					
						
							|  |  |  |   if(req.user) { | 
					
						
							| 
									
										
										
										
											2015-03-30 16:30:12 -07:00
										 |  |  |     completedList = req.user.completedCoursewares.map(function (elem) { | 
					
						
							| 
									
										
										
										
											2015-03-30 13:09:24 -07:00
										 |  |  |       return elem._id; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-03-30 16:30:12 -07:00
										 |  |  |   var noDuplicatedCoursewares = R.uniq(completedList); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var data = {}; | 
					
						
							|  |  |  |   data.coursewareList = resources.allCoursewareNames(); | 
					
						
							|  |  |  |   data.completedList = noDuplicatedCoursewares; | 
					
						
							|  |  |  |   res.send(data); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  | exports.returnNextCourseware = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   if (!req.user) { | 
					
						
							|  |  |  |     return res.redirect('../challenges/learn-how-free-code-camp-works'); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-04-24 02:02:02 -07:00
										 |  |  |   if (req.user.finishedWaypoints && req.user.uncompletedBonfires.length > 0) { | 
					
						
							|  |  |  |     return res.redirect('../bonfires') | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var completed = req.user.completedCoursewares.map(function (elem) { | 
					
						
							|  |  |  |     return elem._id; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   req.user.uncompletedCoursewares = resources.allCoursewareIds() | 
					
						
							|  |  |  |     .filter(function (elem) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     if (completed.indexOf(elem) === -1) { | 
					
						
							|  |  |  |       return elem; | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   }); | 
					
						
							|  |  |  |   req.user.save(); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 18:41:04 -04:00
										 |  |  |   var uncompletedCoursewares = req.user.uncompletedCoursewares[0]; | 
					
						
							| 
									
										
										
										
											2015-02-22 18:23:50 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares}); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   displayedCoursewares.exec(function(err, courseware) { | 
					
						
							|  |  |  |     if (err) { | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |       return next(err); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-22 19:35:55 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     courseware = courseware.pop(); | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     if (typeof courseware === 'undefined') { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       req.flash('errors', { | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |         msg: "It looks like you've completed all the courses we have " + | 
					
						
							|  |  |  |         "available. Good job!" | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       }); | 
					
						
							|  |  |  |       return res.redirect('../challenges/learn-how-free-code-camp-works'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     var nameString = courseware.name.toLowerCase().replace(/\s/g, '-'); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     return res.redirect('../challenges/' + nameString); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-01 23:35:27 -08:00
										 |  |  | exports.returnIndividualCourseware = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var dashedName = req.params.coursewareName; | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   var coursewareName = dashedName.replace(/\-/g, ' '); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   Courseware.find({'name': new RegExp(coursewareName, 'i')}, | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     function(err, coursewareFromMongo) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     if (err) { | 
					
						
							|  |  |  |       next(err); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // Handle not found
 | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     if (coursewareFromMongo.length < 1) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       req.flash('errors', { | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |         msg: "404: We couldn't find a challenge with that name. " + | 
					
						
							|  |  |  |         "Please double check the name." | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       }); | 
					
						
							|  |  |  |       return res.redirect('/challenges'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     var courseware = coursewareFromMongo.pop(); | 
					
						
							| 
									
										
										
										
											2015-02-06 12:36:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     // Redirect to full name if the user only entered a partial
 | 
					
						
							|  |  |  |     var dashedNameFull = courseware.name.toLowerCase().replace(/\s/g, '-'); | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     if (dashedNameFull !== dashedName) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       return res.redirect('../challenges/' + dashedNameFull); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     var challengeType = { | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |       0: function() { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         res.render('coursewares/showHTML', { | 
					
						
							|  |  |  |           title: courseware.name, | 
					
						
							|  |  |  |           dashedName: dashedName, | 
					
						
							|  |  |  |           name: courseware.name, | 
					
						
							|  |  |  |           brief: courseware.description[0], | 
					
						
							|  |  |  |           details: courseware.description.slice(1), | 
					
						
							|  |  |  |           tests: courseware.tests, | 
					
						
							|  |  |  |           challengeSeed: courseware.challengeSeed, | 
					
						
							|  |  |  |           verb: resources.randomVerb(), | 
					
						
							|  |  |  |           phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |           compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |           coursewareHash: courseware._id, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |           environment: resources.whichEnvironment(), | 
					
						
							|  |  |  |           challengeType: courseware.challengeType | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         }); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |       1: function() { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         res.render('coursewares/showJS', { | 
					
						
							|  |  |  |           title: courseware.name, | 
					
						
							|  |  |  |           dashedName: dashedName, | 
					
						
							|  |  |  |           name: courseware.name, | 
					
						
							|  |  |  |           brief: courseware.description[0], | 
					
						
							|  |  |  |           details: courseware.description.slice(1), | 
					
						
							|  |  |  |           tests: courseware.tests, | 
					
						
							|  |  |  |           challengeSeed: courseware.challengeSeed, | 
					
						
							|  |  |  |           verb: resources.randomVerb(), | 
					
						
							|  |  |  |           phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |           compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |           coursewareHash: courseware._id, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |           challengeType: courseware.challengeType | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         }); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       2: function() { | 
					
						
							|  |  |  |         res.render('coursewares/showVideo', { | 
					
						
							|  |  |  |           title: courseware.name, | 
					
						
							|  |  |  |           dashedName: dashedName, | 
					
						
							|  |  |  |           name: courseware.name, | 
					
						
							|  |  |  |           details: courseware.description, | 
					
						
							|  |  |  |           tests: courseware.tests, | 
					
						
							|  |  |  |           video: courseware.challengeSeed[0], | 
					
						
							|  |  |  |           verb: resources.randomVerb(), | 
					
						
							|  |  |  |           phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |           compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |           coursewareHash: courseware._id, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |           challengeType: courseware.challengeType | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         }); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       3: function() { | 
					
						
							| 
									
										
										
										
											2015-03-29 00:09:50 +09:00
										 |  |  |         res.render('coursewares/showZiplineOrBasejump', { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |           title: courseware.name, | 
					
						
							|  |  |  |           dashedName: dashedName, | 
					
						
							|  |  |  |           name: courseware.name, | 
					
						
							|  |  |  |           details: courseware.description, | 
					
						
							|  |  |  |           video: courseware.challengeSeed[0], | 
					
						
							|  |  |  |           verb: resources.randomVerb(), | 
					
						
							|  |  |  |           phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |           compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |           coursewareHash: courseware._id, | 
					
						
							| 
									
										
										
										
											2015-03-29 00:09:50 +09:00
										 |  |  |           challengeType: courseware.challengeType | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-03-29 18:13:04 -07:00
										 |  |  |       }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       4: function() { | 
					
						
							|  |  |  |           res.render('coursewares/showZiplineOrBasejump', { | 
					
						
							|  |  |  |               title: courseware.name, | 
					
						
							|  |  |  |               dashedName: dashedName, | 
					
						
							|  |  |  |               name: courseware.name, | 
					
						
							|  |  |  |               details: courseware.description, | 
					
						
							|  |  |  |               video: courseware.challengeSeed[0], | 
					
						
							|  |  |  |               verb: resources.randomVerb(), | 
					
						
							|  |  |  |               phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |               compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |               coursewareHash: courseware._id, | 
					
						
							|  |  |  |               challengeType: courseware.challengeType | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-02-13 20:55:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     return challengeType[courseware.challengeType](); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-01 23:35:27 -08:00
										 |  |  | exports.testCourseware = function(req, res) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var coursewareName = req.body.name, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |       coursewareTests = req.body.tests, | 
					
						
							|  |  |  |       coursewareDifficulty = req.body.difficulty, | 
					
						
							|  |  |  |       coursewareDescription = req.body.description, | 
					
						
							|  |  |  |       coursewareEntryPoint = req.body.challengeEntryPoint, | 
					
						
							|  |  |  |       coursewareChallengeSeed = req.body.challengeSeed; | 
					
						
							|  |  |  |       coursewareTests = coursewareTests.split('\r\n'); | 
					
						
							|  |  |  |       coursewareDescription = coursewareDescription.split('\r\n'); | 
					
						
							|  |  |  |       coursewareTests.filter(getRidOfEmpties); | 
					
						
							|  |  |  |       coursewareDescription.filter(getRidOfEmpties); | 
					
						
							|  |  |  |       coursewareChallengeSeed = coursewareChallengeSeed.replace('\r', ''); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   res.render('courseware/show', { | 
					
						
							|  |  |  |     completedWith: null, | 
					
						
							|  |  |  |     title: coursewareName, | 
					
						
							|  |  |  |     name: coursewareName, | 
					
						
							|  |  |  |     difficulty: +coursewareDifficulty, | 
					
						
							|  |  |  |     brief: coursewareDescription[0], | 
					
						
							|  |  |  |     details: coursewareDescription.slice(1), | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |     tests: coursewareTests, | 
					
						
							|  |  |  |     challengeSeed: coursewareChallengeSeed, | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     challengeEntryPoint: coursewareEntryPoint, | 
					
						
							|  |  |  |     cc: req.user ? req.user.coursewaresHash : undefined, | 
					
						
							|  |  |  |     progressTimestamps: req.user ? req.user.progressTimestamps : undefined, | 
					
						
							|  |  |  |     verb: resources.randomVerb(), | 
					
						
							|  |  |  |     phrase: resources.randomPhrase(), | 
					
						
							|  |  |  |     compliment: resources.randomCompliment(), | 
					
						
							|  |  |  |     coursewares: [], | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |     coursewareHash: 'test' | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getRidOfEmpties(elem) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   if (elem.length > 0) { | 
					
						
							|  |  |  |     return elem; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | exports.publicGenerator = function(req, res) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   res.render('courseware/public-generator'); | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-02-01 14:22:34 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | exports.generateChallenge = function(req, res) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var coursewareName = req.body.name, | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   coursewareTests = req.body.tests, | 
					
						
							|  |  |  |   coursewareDifficulty = req.body.difficulty, | 
					
						
							|  |  |  |   coursewareDescription = req.body.description, | 
					
						
							|  |  |  |   coursewareEntryPoint = req.body.challengeEntryPoint, | 
					
						
							|  |  |  |   coursewareChallengeSeed = req.body.challengeSeed; | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   coursewareTests = coursewareTests.split('\r\n'); | 
					
						
							|  |  |  |   coursewareDescription = coursewareDescription.split('\r\n'); | 
					
						
							|  |  |  |   coursewareTests.filter(getRidOfEmpties); | 
					
						
							|  |  |  |   coursewareDescription.filter(getRidOfEmpties); | 
					
						
							|  |  |  |   coursewareChallengeSeed = coursewareChallengeSeed.replace('\r', ''); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var response = { | 
					
						
							|  |  |  |     _id: randomString(), | 
					
						
							|  |  |  |     name: coursewareName, | 
					
						
							|  |  |  |     difficulty: coursewareDifficulty, | 
					
						
							|  |  |  |     description: coursewareDescription, | 
					
						
							|  |  |  |     challengeEntryPoint: coursewareEntryPoint, | 
					
						
							|  |  |  |     challengeSeed: coursewareChallengeSeed, | 
					
						
							|  |  |  |     tests: coursewareTests | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   res.send(response); | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  | exports.completedCourseware = function (req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var isCompletedDate = Math.round(+new Date()); | 
					
						
							|  |  |  |   var coursewareHash = req.body.coursewareInfo.coursewareHash; | 
					
						
							| 
									
										
										
										
											2015-04-24 02:02:02 -07:00
										 |  |  |   if (coursewareHash === "bd7139d8c441eddfaeb5bdef") { | 
					
						
							|  |  |  |     req.user.finishedWaypoints = true; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-03-21 15:44:18 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   req.user.completedCoursewares.push({ | 
					
						
							|  |  |  |     _id: coursewareHash, | 
					
						
							|  |  |  |     completedDate: isCompletedDate, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |     name: req.body.coursewareInfo.coursewareName, | 
					
						
							|  |  |  |     solution: null, | 
					
						
							| 
									
										
										
										
											2015-04-02 14:07:00 -07:00
										 |  |  |     githubLink: null, | 
					
						
							|  |  |  |     verified: true | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-04-22 18:41:04 -04:00
										 |  |  |   var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-17 01:40:32 -04:00
										 |  |  |   if (index > -1) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     req.user.progressTimestamps.push(Date.now() || 0); | 
					
						
							|  |  |  |     req.user.uncompletedCoursewares.splice(index, 1); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-02-01 22:39:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   req.user.save(function (err, user) { | 
					
						
							|  |  |  |     if (err) { | 
					
						
							|  |  |  |       return next(err); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (user) { | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |       res.sendStatus(200); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-03-28 23:42:07 +09:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2015-03-21 15:44:18 +09:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | exports.completedZiplineOrBasejump = function (req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |   debug('Inside controller for completed zipline or basejump with data %s', | 
					
						
							|  |  |  |     req.body.coursewareInfo); | 
					
						
							|  |  |  |   var isCompletedWith = req.body.coursewareInfo.completedWith || false; | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   var isCompletedDate = Math.round(+new Date()); | 
					
						
							|  |  |  |   var coursewareHash = req.body.coursewareInfo.coursewareHash; | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |   var solutionLink = req.body.coursewareInfo.publicURL; | 
					
						
							| 
									
										
										
										
											2015-03-29 18:13:04 -07:00
										 |  |  |   var githubLink = req.body.coursewareInfo.challengeType === '4' | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |   ? req.body.coursewareInfo.githubURL : true; | 
					
						
							|  |  |  |   if (!solutionLink || !githubLink) { | 
					
						
							|  |  |  |     req.flash('errors', { | 
					
						
							|  |  |  |       msg: 'You haven\'t supplied the necessary URLs for us to inspect ' + | 
					
						
							|  |  |  |       'your work.' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     return res.sendStatus(403); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (isCompletedWith) { | 
					
						
							|  |  |  |     var paired = User.find({'profile.username': isCompletedWith.toLowerCase()}).limit(1); | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |     paired.exec(function (err, pairedWithFromMongo) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       if (err) { | 
					
						
							|  |  |  |         return next(err); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); | 
					
						
							|  |  |  |         if (index > -1) { | 
					
						
							|  |  |  |           req.user.progressTimestamps.push(Date.now() || 0); | 
					
						
							|  |  |  |           req.user.uncompletedCoursewares.splice(index, 1); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-04-24 13:15:15 -04:00
										 |  |  |         var pairedWith = pairedWithFromMongo.pop(); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         req.user.completedCoursewares.push({ | 
					
						
							|  |  |  |           _id: coursewareHash, | 
					
						
							| 
									
										
										
										
											2015-04-05 00:01:51 -07:00
										 |  |  |           name: req.body.coursewareInfo.coursewareName, | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |           completedWith: pairedWith._id, | 
					
						
							|  |  |  |           completedDate: isCompletedDate, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |           solution: solutionLink, | 
					
						
							| 
									
										
										
										
											2015-04-02 14:07:00 -07:00
										 |  |  |           githubLink: githubLink, | 
					
						
							|  |  |  |           verified: false | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |         req.user.save(function (err, user) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |           if (err) { | 
					
						
							|  |  |  |             return next(err); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2015-03-29 21:15:18 +09:00
										 |  |  |           debug('this is the user object returned %s,' + | 
					
						
							|  |  |  |           ' this is the req.user._id %s, ' + | 
					
						
							|  |  |  |           'this is the pairedWith._id %s', user, req.user._id, pairedWith._id); | 
					
						
							|  |  |  |           debug(req.user._id.toString() === pairedWith._id.toString()); | 
					
						
							|  |  |  |           if (req.user._id.toString() === pairedWith._id.toString()) { | 
					
						
							|  |  |  |             return res.sendStatus(200); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           index = pairedWith.uncompletedCoursewares.indexOf(coursewareHash); | 
					
						
							|  |  |  |           if (index > -1) { | 
					
						
							|  |  |  |             pairedWith.progressTimestamps.push(Date.now() || 0); | 
					
						
							|  |  |  |             pairedWith.uncompletedCoursewares.splice(index, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           pairedWith.completedCoursewares.push({ | 
					
						
							|  |  |  |             _id: coursewareHash, | 
					
						
							| 
									
										
										
										
											2015-04-05 00:01:51 -07:00
										 |  |  |             name: req.body.coursewareInfo.coursewareName, | 
					
						
							| 
									
										
										
										
											2015-03-29 21:15:18 +09:00
										 |  |  |             completedWith: req.user._id, | 
					
						
							|  |  |  |             completedDate: isCompletedDate, | 
					
						
							|  |  |  |             solution: solutionLink, | 
					
						
							| 
									
										
										
										
											2015-04-02 14:07:00 -07:00
										 |  |  |             githubLink: githubLink, | 
					
						
							|  |  |  |             verified: false | 
					
						
							| 
									
										
										
										
											2015-03-29 21:15:18 +09:00
										 |  |  |           }); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |           pairedWith.save(function (err, paired) { | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |             if (err) { | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |               return next(err); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |             if (user && paired) { | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |               return res.sendStatus(200); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |           }); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     req.user.completedCoursewares.push({ | 
					
						
							|  |  |  |       _id: coursewareHash, | 
					
						
							| 
									
										
										
										
											2015-04-05 00:01:51 -07:00
										 |  |  |       name: req.body.coursewareInfo.coursewareName, | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       completedWith: null, | 
					
						
							|  |  |  |       completedDate: isCompletedDate, | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |       solution: solutionLink, | 
					
						
							| 
									
										
										
										
											2015-04-02 14:07:00 -07:00
										 |  |  |       githubLink: githubLink, | 
					
						
							|  |  |  |       verified: false | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |     var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |     if (index > -1) { | 
					
						
							|  |  |  |       req.user.progressTimestamps.push(Date.now() || 0); | 
					
						
							|  |  |  |       req.user.uncompletedCoursewares.splice(index, 1); | 
					
						
							| 
									
										
										
										
											2015-03-27 14:36:17 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     req.user.save(function (err, user) { | 
					
						
							|  |  |  |       if (err) { | 
					
						
							|  |  |  |         return next(err); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (user) { | 
					
						
							| 
									
										
										
										
											2015-03-29 20:39:41 +09:00
										 |  |  |         return res.sendStatus(200); | 
					
						
							| 
									
										
										
										
											2015-03-28 17:38:11 +09:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; |