freeCodeCamp/controllers/courseware.js

230 lines
8.0 KiB
JavaScript
Raw Normal View History

var _ = require('lodash'),
2015-02-02 07:35:27 +00:00
debug = require('debug')('freecc:cntr:courseware'),
Courseware = require('./../models/Courseware'),
User = require('./../models/User'),
resources = require('./resources');
/**
2015-02-02 07:35:27 +00:00
* Courseware controller
*/
2015-02-02 07:35:27 +00:00
exports.coursewareNames = function(req, res) {
res.render('coursewares/showList', {
coursewareList: resources.allCoursewareNames()
});
};
2015-02-02 07:35:27 +00:00
exports.returnNextCourseware = function(req, res) {
if (!req.user) {
return res.redirect('../coursewares/start-our-challenges');
}
2015-02-02 07:35:27 +00:00
var completed = req.user.completedCoursewares.map(function (elem) {
return elem._id;
});
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-02 07:35:27 +00:00
var uncompletedCoursewares = req.user.uncompletedCoursewares;
2015-02-02 07:35:27 +00:00
var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares[0]});
displayedCoursewares.exec(function(err, courseware) {
if (err) {
next(err);
}
2015-02-02 07:35:27 +00:00
courseware = courseware.pop();
if (courseware === undefined) {
req.flash('errors', {
msg: "It looks like you've completed all the courses we have available. Good job!"
})
2015-02-08 05:57:37 +00:00
return res.redirect('../coursewares/start-our-challenges');
}
2015-02-02 07:35:27 +00:00
nameString = courseware.name.toLowerCase().replace(/\s/g, '-');
return res.redirect('../coursewares/' + nameString);
});
};
2015-02-02 07:35:27 +00:00
exports.returnIndividualCourseware = function(req, res, next) {
var dashedName = req.params.coursewareName;
2015-02-02 07:35:27 +00:00
coursewareName = dashedName.replace(/\-/g, ' ');
2015-02-02 07:35:27 +00:00
Courseware.find({"name" : new RegExp(coursewareName, 'i')}, function(err, courseware) {
if (err) {
next(err);
}
// 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();
// Redirect to full name if the user only entered a partial
var dashedNameFull = courseware.name.toLowerCase().replace(/\s/g, '-');
if (dashedNameFull != dashedName) {
return res.redirect('../coursewares/' + dashedNameFull);
}
var challengeType = {
0 : function() {
2015-02-14 02:40:39 +00: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,
cc: !!req.user,
points: req.user ? req.user.points : undefined,
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,
points: req.user ? req.user.points : undefined,
verb: resources.randomVerb(),
phrase: resources.randomPhrase(),
compliment: resources.randomCompliment(),
coursewareHash: courseware._id,
2015-02-14 02:40:39 +00:00
environment: resources.whichEnvironment()
});
},
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,
points: req.user ? req.user.points : undefined,
verb: resources.randomVerb(),
phrase: resources.randomPhrase(),
compliment: resources.randomCompliment(),
coursewareHash: courseware._id,
environment: resources.whichEnvironment()
});
}
};
return challengeType[courseware.challengeType]();
});
};
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', {
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,
points: req.user ? req.user.points : undefined,
verb: resources.randomVerb(),
phrase: resources.randomPhrase(),
compliment: resources.randomCompliment(),
2015-02-02 07:35:27 +00:00
coursewares: [],
coursewareHash: "test"
});
};
function getRidOfEmpties(elem) {
if (elem.length > 0) {
return elem;
}
};
exports.publicGenerator = function(req, res) {
2015-02-02 07:35:27 +00:00
res.render('courseware/public-generator');
};
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', '');
var response = {
_id: randomString(),
2015-02-02 07:35:27 +00:00
name: coursewareName,
difficulty: coursewareDifficulty,
description: coursewareDescription,
challengeEntryPoint: coursewareEntryPoint,
challengeSeed: coursewareChallengeSeed,
tests: coursewareTests
};
res.send(response);
};
2015-02-02 07:35:27 +00:00
exports.completedCourseware = function (req, res) {
2015-02-02 07:35:27 +00:00
var isCompletedDate = Math.round(+new Date() / 1000);
var coursewareHash = req.body.coursewareInfo.coursewareHash;
2015-02-02 07:35:27 +00:00
req.user.completedCoursewares.push({
_id: coursewareHash,
completedDate: isCompletedDate
2015-02-02 07:35:27 +00:00
});
2015-02-02 07:35:27 +00:00
var index = req.user.uncompletedCoursewares.indexOf(coursewareHash);
if (index > -1) {
req.user.points++;
2015-02-02 07:35:27 +00:00
req.user.uncompletedCoursewares.splice(index, 1)
}
2015-02-02 07:35:27 +00:00
req.user.save(function (err, user) {
if (err) {
throw err;
}
2015-02-02 07:35:27 +00:00
if (user) {
res.send(true)
}
});
};