2015-02-01 22:22:34 +00:00
|
|
|
var _ = require('lodash'),
|
2015-02-02 07:35:27 +00:00
|
|
|
debug = require('debug')('freecc:cntr:courseware'),
|
|
|
|
Courseware = require('./../models/Courseware'),
|
2015-02-01 22:22:34 +00:00
|
|
|
User = require('./../models/User'),
|
2015-02-22 09:23:50 +00:00
|
|
|
resources = require('./resources'),
|
|
|
|
R = require('ramda');
|
2015-02-01 22:22:34 +00:00
|
|
|
|
|
|
|
/**
|
2015-02-02 07:35:27 +00:00
|
|
|
* Courseware controller
|
2015-02-01 22:22:34 +00:00
|
|
|
*/
|
|
|
|
|
2015-02-22 09:23:50 +00:00
|
|
|
exports.showAllCoursewares = function(req, res) {
|
|
|
|
var completedCoursewares = req.user.completedCoursewares.map(function(elem) {
|
|
|
|
return elem._id;
|
2015-02-01 22:22:34 +00:00
|
|
|
});
|
2015-02-22 09:23:50 +00:00
|
|
|
|
|
|
|
var noDuplicatedCoursewares = R.uniq(completedCoursewares);
|
|
|
|
var data = {};
|
|
|
|
data.coursewareList = resources.allCoursewareNames();
|
|
|
|
data.completedList = noDuplicatedCoursewares;
|
|
|
|
res.send(data);
|
2015-02-01 22:22:34 +00:00
|
|
|
};
|
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
exports.returnNextCourseware = function(req, res) {
|
2015-02-01 22:22:34 +00:00
|
|
|
if (!req.user) {
|
2015-02-09 19:29:03 +00:00
|
|
|
return res.redirect('../coursewares/start-our-challenges');
|
2015-02-02 06:39:59 +00:00
|
|
|
}
|
2015-02-02 07:35:27 +00:00
|
|
|
var completed = req.user.completedCoursewares.map(function (elem) {
|
|
|
|
return elem._id;
|
|
|
|
});
|
2015-02-01 22:22:34 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
req.user.uncompletedCoursewares = resources.allCoursewareIds().filter(function (elem) {
|
|
|
|
if (completed.indexOf(elem) === -1) {
|
|
|
|
return elem;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
req.user.save();
|
2015-02-01 22:22:34 +00:00
|
|
|
|
2015-02-22 09:23:50 +00:00
|
|
|
var uncompletedCoursewares = req.user.uncompletedCoursewares.shift();
|
|
|
|
|
2015-02-02 06:39:59 +00:00
|
|
|
|
2015-02-22 09:23:50 +00:00
|
|
|
var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares});
|
2015-02-02 07:35:27 +00:00
|
|
|
displayedCoursewares.exec(function(err, courseware) {
|
2015-02-01 22:22:34 +00:00
|
|
|
if (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
2015-02-22 10:35:55 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
courseware = courseware.pop();
|
2015-02-05 02:28:10 +00:00
|
|
|
if (courseware === undefined) {
|
2015-02-05 04:27:57 +00:00
|
|
|
req.flash('errors', {
|
|
|
|
msg: "It looks like you've completed all the courses we have available. Good job!"
|
2015-02-22 10:35:55 +00:00
|
|
|
});
|
2015-02-08 05:57:37 +00:00
|
|
|
return res.redirect('../coursewares/start-our-challenges');
|
2015-02-05 02:28:10 +00:00
|
|
|
}
|
2015-02-02 07:35:27 +00:00
|
|
|
nameString = courseware.name.toLowerCase().replace(/\s/g, '-');
|
2015-02-05 04:27:57 +00:00
|
|
|
return res.redirect('../coursewares/' + nameString);
|
2015-02-01 22:22:34 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
exports.returnIndividualCourseware = function(req, res, next) {
|
|
|
|
var dashedName = req.params.coursewareName;
|
2015-02-01 22:22:34 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
coursewareName = dashedName.replace(/\-/g, ' ');
|
2015-02-01 22:22:34 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
Courseware.find({"name" : new RegExp(coursewareName, 'i')}, function(err, courseware) {
|
2015-02-01 22:22:34 +00:00
|
|
|
if (err) {
|
|
|
|
next(err);
|
|
|
|
}
|
2015-02-06 17:36:55 +00:00
|
|
|
// Handle not found
|
|
|
|
if (courseware.length < 1) {
|
|
|
|
req.flash('errors', {
|
|
|
|
msg: "404: We couldn't find a challenge with that name. Please double check the name."
|
|
|
|
});
|
|
|
|
return res.redirect('/coursewares')
|
|
|
|
}
|
2015-02-06 19:28:28 +00:00
|
|
|
courseware = courseware.pop();
|
2015-02-06 17:36:55 +00:00
|
|
|
|
|
|
|
// Redirect to full name if the user only entered a partial
|
2015-02-05 04:27:57 +00:00
|
|
|
var dashedNameFull = courseware.name.toLowerCase().replace(/\s/g, '-');
|
|
|
|
if (dashedNameFull != dashedName) {
|
|
|
|
return res.redirect('../coursewares/' + dashedNameFull);
|
|
|
|
}
|
2015-02-01 22:22:34 +00:00
|
|
|
|
2015-02-14 01:55:49 +00:00
|
|
|
var challengeType = {
|
|
|
|
0 : function() {
|
2015-02-14 02:40:39 +00:00
|
|
|
res.render('coursewares/showHTML', {
|
2015-02-14 01:55:49 +00:00
|
|
|
title: courseware.name,
|
|
|
|
dashedName: dashedName,
|
|
|
|
name: courseware.name,
|
|
|
|
brief: courseware.description[0],
|
|
|
|
details: courseware.description.slice(1),
|
|
|
|
tests: courseware.tests,
|
|
|
|
challengeSeed: courseware.challengeSeed,
|
|
|
|
cc: !!req.user,
|
2015-02-23 02:16:26 +00:00
|
|
|
progressTimestamps: req.user ? req.user.progressTimestamps : undefined,
|
2015-02-14 01:55:49 +00:00
|
|
|
verb: resources.randomVerb(),
|
|
|
|
phrase: resources.randomPhrase(),
|
|
|
|
compliment: resources.randomCompliment(),
|
|
|
|
coursewareHash: courseware._id,
|
|
|
|
environment: resources.whichEnvironment()
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
1 : function() {
|
|
|
|
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,
|
|
|
|
cc: !!req.user,
|
2015-02-23 02:16:26 +00:00
|
|
|
progressTimestamps: req.user ? req.user.progressTimestamps : undefined,
|
2015-02-14 01:55:49 +00:00
|
|
|
verb: resources.randomVerb(),
|
|
|
|
phrase: resources.randomPhrase(),
|
|
|
|
compliment: resources.randomCompliment(),
|
|
|
|
coursewareHash: courseware._id,
|
2015-02-14 02:40:39 +00:00
|
|
|
environment: resources.whichEnvironment()
|
2015-02-14 01:55:49 +00: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],
|
|
|
|
cc: !!req.user,
|
2015-02-23 02:16:26 +00:00
|
|
|
progressTimestamps: req.user ? req.user.progressTimestamps : undefined,
|
2015-02-14 01:55:49 +00:00
|
|
|
verb: resources.randomVerb(),
|
|
|
|
phrase: resources.randomPhrase(),
|
|
|
|
compliment: resources.randomCompliment(),
|
|
|
|
coursewareHash: courseware._id,
|
|
|
|
environment: resources.whichEnvironment()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return challengeType[courseware.challengeType]();
|
|
|
|
|
2015-02-01 22:22:34 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
exports.testCourseware = function(req, res) {
|
|
|
|
var coursewareName = req.body.name,
|
|
|
|
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', '');
|
|
|
|
res.render('courseware/show', {
|
2015-02-01 22:22:34 +00:00
|
|
|
completedWith: null,
|
2015-02-02 07:35:27 +00:00
|
|
|
title: coursewareName,
|
|
|
|
name: coursewareName,
|
|
|
|
difficulty: +coursewareDifficulty,
|
|
|
|
brief: coursewareDescription[0],
|
|
|
|
details: coursewareDescription.slice(1),
|
|
|
|
tests: coursewareTests,
|
|
|
|
challengeSeed: coursewareChallengeSeed,
|
|
|
|
challengeEntryPoint: coursewareEntryPoint,
|
|
|
|
cc: req.user ? req.user.coursewaresHash : undefined,
|
2015-02-23 02:16:26 +00:00
|
|
|
progressTimestamps: req.user ? req.user.progressTimestamps : undefined,
|
2015-02-01 22:22:34 +00:00
|
|
|
verb: resources.randomVerb(),
|
|
|
|
phrase: resources.randomPhrase(),
|
|
|
|
compliment: resources.randomCompliment(),
|
2015-02-02 07:35:27 +00:00
|
|
|
coursewares: [],
|
|
|
|
coursewareHash: "test"
|
2015-02-01 22:22:34 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
function getRidOfEmpties(elem) {
|
|
|
|
if (elem.length > 0) {
|
|
|
|
return elem;
|
|
|
|
}
|
2015-02-02 06:39:59 +00:00
|
|
|
};
|
2015-02-01 22:22:34 +00:00
|
|
|
|
|
|
|
exports.publicGenerator = function(req, res) {
|
2015-02-02 07:35:27 +00:00
|
|
|
res.render('courseware/public-generator');
|
2015-02-02 06:39:59 +00:00
|
|
|
};
|
2015-02-01 22:22:34 +00:00
|
|
|
|
|
|
|
exports.generateChallenge = function(req, res) {
|
2015-02-02 07:35:27 +00:00
|
|
|
var coursewareName = req.body.name,
|
|
|
|
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-02-01 22:22:34 +00:00
|
|
|
|
|
|
|
var response = {
|
|
|
|
_id: randomString(),
|
2015-02-02 07:35:27 +00:00
|
|
|
name: coursewareName,
|
|
|
|
difficulty: coursewareDifficulty,
|
|
|
|
description: coursewareDescription,
|
|
|
|
challengeEntryPoint: coursewareEntryPoint,
|
|
|
|
challengeSeed: coursewareChallengeSeed,
|
|
|
|
tests: coursewareTests
|
2015-02-01 22:22:34 +00:00
|
|
|
};
|
|
|
|
res.send(response);
|
2015-02-02 06:39:59 +00:00
|
|
|
};
|
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
exports.completedCourseware = function (req, res) {
|
2015-02-02 06:39:59 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
var isCompletedDate = Math.round(+new Date() / 1000);
|
|
|
|
var coursewareHash = req.body.coursewareInfo.coursewareHash;
|
2015-03-21 05:28:00 +00:00
|
|
|
debug('this is the coursewarehash we got', coursewareHash);
|
2015-02-02 06:39:59 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
req.user.completedCoursewares.push({
|
|
|
|
_id: coursewareHash,
|
2015-02-05 02:28:10 +00:00
|
|
|
completedDate: isCompletedDate
|
2015-02-02 07:35:27 +00:00
|
|
|
});
|
2015-02-02 06:39:59 +00:00
|
|
|
|
2015-03-21 05:28:00 +00:00
|
|
|
var index = req.user.completedCoursewares.indexOf(coursewareHash);
|
|
|
|
debug('this is the index of the found courseware', index);
|
|
|
|
if (index === -1) {
|
2015-02-23 02:16:26 +00:00
|
|
|
req.user.progressTimestamps.push(Date.now() / 1000 | 0);
|
2015-03-21 05:28:00 +00:00
|
|
|
req.user.uncompletedCoursewares.splice(index, 1);
|
2015-02-02 07:35:27 +00:00
|
|
|
}
|
2015-02-02 06:39:59 +00:00
|
|
|
|
2015-02-02 07:35:27 +00:00
|
|
|
req.user.save(function (err, user) {
|
|
|
|
if (err) {
|
|
|
|
throw err;
|
2015-02-02 06:39:59 +00:00
|
|
|
}
|
2015-02-02 07:35:27 +00:00
|
|
|
if (user) {
|
2015-03-21 05:28:00 +00:00
|
|
|
res.send(true);
|
2015-02-02 07:35:27 +00:00
|
|
|
}
|
|
|
|
});
|
2015-02-02 06:39:59 +00:00
|
|
|
};
|