diff --git a/app.js b/app.js index 43c341246b..c475713f88 100644 --- a/app.js +++ b/app.js @@ -32,6 +32,7 @@ var express = require('express'), userController = require('./controllers/user'), contactController = require('./controllers/contact'), bonfireController = require('./controllers/bonfire'), + coursewareController = require('./controllers/courseware'), /** * User model @@ -270,7 +271,6 @@ app.get('/account/api', userController.getAccountAngular); */ app.get('/playground', bonfireController.index); app.get('/bonfires', bonfireController.returnNextBonfire); -//app.get('/courseware', bonfireController.courseware); app.get('/bonfire-json-generator', bonfireController.returnGenerator); app.post('/bonfire-json-generator', bonfireController.generateChallenge); app.get('/bonfire-challenge-generator', bonfireController.publicGenerator); @@ -285,6 +285,17 @@ app.get('/bonfire', function(req, res) { app.post('/completed-bonfire/', bonfireController.completedBonfire); +/** + * Courseware related routes + */ + +app.get('/coursewares', coursewareController.returnNextCourseware); +app.get( + '/coursewares/:coursewareName', + coursewareController.returnIndividualCourseware +); +app.post('/completed-courseware/', coursewareController.completedCourseware); + // Unique Check API route app.get('/api/checkUniqueUsername/:username', userController.checkUniqueUsername); app.get('/api/checkExistingUsername/:username', userController.checkExistingUsername); diff --git a/controllers/bonfire.js b/controllers/bonfire.js index 0a47210439..e7c7bd84d0 100644 --- a/controllers/bonfire.js +++ b/controllers/bonfire.js @@ -36,29 +36,23 @@ exports.index = function(req, res) { }); }; -exports.returnNextBonfire = function(req, res, next) { +exports.returnNextBonfire = function(req, res) { if (!req.user) { return res.redirect('bonfires/meet-bonfire'); } - var currentTime = parseInt(+new Date() / 1000); - if (currentTime - req.user.lastContentSync > 10) { - req.user.lastContentSync = currentTime; - var completed = req.user.completedBonfires.map(function (elem) { - return elem._id; - }); - - req.user.uncompletedBonfires = resources.allBonfireIds().filter(function (elem) { - if (completed.indexOf(elem) === -1) { - return elem; - } - }); - req.user.save(); - } + var completed = req.user.completedBonfires.map(function (elem) { + return elem._id; + }); + req.user.uncompletedBonfires = resources.allBonfireIds().filter(function (elem) { + if (completed.indexOf(elem) === -1) { + return elem; + } + }); + req.user.save(); var uncompletedBonfires = req.user.uncompletedBonfires; - var displayedBonfires = Bonfire.find({'_id': uncompletedBonfires[0]}); displayedBonfires.exec(function(err, bonfire) { if (err) { diff --git a/controllers/courseware.js b/controllers/courseware.js index 0a47210439..deb6230c86 100644 --- a/controllers/courseware.js +++ b/controllers/courseware.js @@ -1,180 +1,113 @@ var _ = require('lodash'), - debug = require('debug')('freecc:cntr:bonfires'), - Bonfire = require('./../models/Bonfire'), + debug = require('debug')('freecc:cntr:courseware'), + Courseware = require('./../models/Courseware'), User = require('./../models/User'), resources = require('./resources'); /** - * Bonfire controller + * Courseware controller */ -exports.bonfireNames = function(req, res) { - res.render('bonfires/showList', { - bonfireList: resources.allBonfireNames() +exports.coursewareNames = function(req, res) { + res.render('coursewares/showList', { + coursewareList: resources.allCoursewareNames() }); }; -exports.index = function(req, res) { - res.render('bonfire/show.jade', { - completedWith: null, - title: 'Bonfire Playground', - name: 'Bonfire Playground', - difficulty: 0, - brief: 'Feel free to play around!', - details: '', - tests: [], - challengeSeed: '', - challengeEntryPoint: '', - cc: req.user ? req.user.bonfiresHash : undefined, - points: req.user ? req.user.points : undefined, - verb: resources.randomVerb(), - phrase: resources.randomPhrase(), - compliments: resources.randomCompliment(), - bonfires: [], - bonfireHash: 'test' - - }); -}; - -exports.returnNextBonfire = function(req, res, next) { +exports.returnNextCourseware = function(req, res) { if (!req.user) { - return res.redirect('bonfires/meet-bonfire'); + return res.redirect('coursewares/intro'); } - var currentTime = parseInt(+new Date() / 1000); - if (currentTime - req.user.lastContentSync > 10) { - req.user.lastContentSync = currentTime; - var completed = req.user.completedBonfires.map(function (elem) { - return elem._id; - }); + var completed = req.user.completedCoursewares.map(function (elem) { + return elem._id; + }); - req.user.uncompletedBonfires = resources.allBonfireIds().filter(function (elem) { - if (completed.indexOf(elem) === -1) { - return elem; - } - }); - req.user.save(); - } + req.user.uncompletedCoursewares = resources.allCoursewareIds().filter(function (elem) { + if (completed.indexOf(elem) === -1) { + return elem; + } + }); + req.user.save(); + var uncompletedCoursewares = req.user.uncompletedCoursewares; - var uncompletedBonfires = req.user.uncompletedBonfires; - - - var displayedBonfires = Bonfire.find({'_id': uncompletedBonfires[0]}); - displayedBonfires.exec(function(err, bonfire) { + var displayedCoursewares = Courseware.find({'_id': uncompletedCoursewares[0]}); + displayedCoursewares.exec(function(err, courseware) { if (err) { next(err); } - bonfire = bonfire.pop(); - nameString = bonfire.name.toLowerCase().replace(/\s/g, '-'); - return res.redirect('/bonfires/' + nameString); + courseware = courseware.pop(); + nameString = courseware.name.toLowerCase().replace(/\s/g, '-'); + return res.redirect('/coursewares/' + nameString); }); }; -exports.returnIndividualBonfire = function(req, res, next) { - var dashedName = req.params.bonfireName; +exports.returnIndividualCourseware = function(req, res, next) { + var dashedName = req.params.coursewareName; - bonfireName = dashedName.replace(/\-/g, ' '); + coursewareName = dashedName.replace(/\-/g, ' '); - Bonfire.find({"name" : new RegExp(bonfireName, 'i')}, function(err, bonfire) { + Courseware.find({"name" : new RegExp(coursewareName, 'i')}, function(err, courseware) { if (err) { next(err); } - if (bonfire.length < 1) { + if (courseware.length < 1) { req.flash('errors', { - msg: "404: We couldn't find a bonfire with that name. Please double check the name." + msg: "404: We couldn't find a challenge with that name. Please double check the name." }); - return res.redirect('/bonfires') + return res.redirect('/coursewares') } else { - bonfire = bonfire.pop(); - res.render('bonfire/show', { - completedWith: null, - title: bonfire.name, + courseware = courseware.pop(); + res.render('coursewares/show', { + title: courseware.name, dashedName: dashedName, - name: bonfire.name, - difficulty: Math.floor(+bonfire.difficulty), - brief: bonfire.description[0], - details: bonfire.description.slice(1), - tests: bonfire.tests, - challengeSeed: bonfire.challengeSeed, - challengeEntryPoint: bonfire.challengeEntryPoint, + name: courseware.name, + brief: courseware.description[0], + details: courseware.description.slice(1), + tests: courseware.tests, + challengeSeed: courseware.challengeSeed, + challengeEntryPoint: courseware.challengeEntryPoint, cc: !!req.user, points: req.user ? req.user.points : undefined, verb: resources.randomVerb(), phrase: resources.randomPhrase(), compliment: resources.randomCompliment(), - bonfires: bonfire, - bonfireHash: bonfire._id + coursewareHash: courseware._id }); } }); }; -/** - * Bonfire generator - */ -exports.returnGenerator = function(req, res) { - res.render('bonfire/generator', { - title: null, - name: null, - difficulty: null, - brief: null, - details: null, - tests: null, - challengeSeed: null, - challengeEntryPoint: null, - bonfireHash: randomString() - }); -}; - -/** - * Post for bonfire generation - */ - -function randomString() { - var chars = "0123456789abcdef"; - var string_length = 23; - var randomstring = 'a'; - for (var i=0; i -1) { - req.user.uncompletedBonfires.splice(index, 1) - } - pairedWith = pairedWith.pop(); - - index = pairedWith.uncompletedBonfires.indexOf(bonfireHash); - if (index > -1) { - pairedWith.uncompletedBonfires.splice(index, 1) - } - - pairedWith.completedBonfires.push({ - _id: bonfireHash, - completedWith: req.user._id, - completedDate: isCompletedDate, - solution: isSolution - }) - - req.user.completedBonfires.push({ - _id: bonfireHash, - completedWith: pairedWith._id, - completedDate: isCompletedDate, - solution: isSolution - }) - - req.user.save(function (err, user) { - pairedWith.save(function (err, paired) { - if (err) { - throw err; - } - if (user && paired) { - res.send(true); - } - }) - }); - } - }) - } else { - - req.user.completedBonfires.push({ - _id: bonfireHash, - completedWith: null, - completedDate: isCompletedDate, - solution: isSolution - }); - - var index = req.user.uncompletedBonfires.indexOf(bonfireHash); - if (index > -1) { - req.user.uncompletedBonfires.splice(index, 1) - } - - req.user.save(function (err, user) { - if (err) { - throw err; - } - if (user) { - debug('Saving user'); - res.send(true) - } - }); + var index = req.user.uncompletedCoursewares.indexOf(coursewareHash); + if (index > -1) { + req.user.uncompletedCoursewares.splice(index, 1) } + + req.user.save(function (err, user) { + if (err) { + throw err; + } + if (user) { + debug('Saving user'); + res.send(true) + } + }); }; \ No newline at end of file diff --git a/controllers/resources.js b/controllers/resources.js index 92fa9e9bcf..9887cc7979 100644 --- a/controllers/resources.js +++ b/controllers/resources.js @@ -5,6 +5,7 @@ var User = require('../models/User'), secrets = require('./../config/secrets'), Challenge = require('./../models/Challenge'), bonfires = require('../seed_data/bonfires.json'); + coursewares = require('../seed_data/coursewares.json'); Client = require('node-rest-client').Client, client = new Client(), debug = require('debug')('freecc:cntr:bonfires'); @@ -217,7 +218,37 @@ module.exports = { .map(function(elem) { return elem.name; }); + }, + + allCoursewareIds: function() { + return coursewares.map(function(elem) { + return { + _id: elem._id, + difficulty: elem.difficulty + } + }) + .sort(function(a, b) { + return a.difficulty - b.difficulty; + }) + .map(function(elem) { + return elem._id; + }); + }, + allCoursewareNames: function() { + return coursewares.map(function(elem) { + return { + name: elem.name, + difficulty: elem.difficulty + } + }) + .sort(function(a, b) { + return a.difficulty - b.difficulty; + }) + .map(function(elem) { + return elem.name; + }); } + }; diff --git a/models/Courseware.js b/models/Courseware.js index d2055aab26..68e816a01c 100644 --- a/models/Courseware.js +++ b/models/Courseware.js @@ -14,8 +14,7 @@ var coursewareSchema = new mongoose.Schema({ difficulty: String, description: Array, tests: Array, - challengeSeed: String, - challengeEntryPoint: String + challengeSeed: String }); module.exports = mongoose.model('Courseware', coursewareSchema); \ No newline at end of file diff --git a/models/User.js b/models/User.js index d35020b0ad..5ad54fd610 100644 --- a/models/User.js +++ b/models/User.js @@ -355,10 +355,8 @@ var userSchema = new mongoose.Schema({ resetPasswordExpires: Date, uncompletedBonfires: Array, completedBonfires: Array, - lastContentSync: { - type: Number, - default: 0 - } + uncompletedCoursewares: Array, + completedCoursewares: Array }); /** diff --git a/views/coursewares/show.jade b/views/coursewares/show.jade index 4a6ba082a7..0ab3032f74 100644 --- a/views/coursewares/show.jade +++ b/views/coursewares/show.jade @@ -18,11 +18,11 @@ block content script(src='/js/lib/codemirror/mode/css/css.js') script(src='/js/lib/codemirror/mode/htmlmixed/htmlmixed.js') .row - .col-xs-12.col-sm-12.col-md-3.bonfire-top - h2.text-center= name + .col-xs-12.col-sm-12.col-md-3 .well .row .col-xs-12 + h2.text-center= name .bonfire-instructions p= brief #brief-instructions @@ -38,9 +38,9 @@ block content button#less-info.btn.btn-info span.ion-help-circled | Less information - #submitButton.btn.btn-primary.btn-big.btn-block Run code (ctrl + enter) - br - form.code + //#submitButton.btn.btn-primary.btn-big.btn-block Run code (ctrl + enter) + //br + //form.code .form-group.codeMirrorView textarea#codeOutput br @@ -49,8 +49,7 @@ block content script(type="text/javascript"). var tests = !{JSON.stringify(tests)}; var challengeSeed = !{JSON.stringify(challengeSeed)}; - var challengeEntryPoint = !{JSON.stringify(challengeEntryPoint)}; - var passedBonfireHash = !{JSON.stringify(bonfireHash)}; + var passedCoursewareHash = !{JSON.stringify(coursewareHash)}; .col-xs-12.col-sm-12.col-md-5 #mainEditorPanel form.code