able to seed and view wiki content
This commit is contained in:
15
app.js
15
app.js
@ -42,6 +42,7 @@ var express = require('express'),
|
|||||||
nonprofitController = require('./controllers/nonprofits'),
|
nonprofitController = require('./controllers/nonprofits'),
|
||||||
bonfireController = require('./controllers/bonfire'),
|
bonfireController = require('./controllers/bonfire'),
|
||||||
coursewareController = require('./controllers/courseware'),
|
coursewareController = require('./controllers/courseware'),
|
||||||
|
wikiController = require('./controllers/wiki'),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stories
|
* Stories
|
||||||
@ -243,8 +244,6 @@ app.get('/guide-to-our-nonprofit-projects', resourcesController.guideToOurNonpro
|
|||||||
app.get('/chromebook', resourcesController.chromebook);
|
app.get('/chromebook', resourcesController.chromebook);
|
||||||
app.get('/deploy-a-website', resourcesController.deployAWebsite);
|
app.get('/deploy-a-website', resourcesController.deployAWebsite);
|
||||||
app.get('/gmail-shortcuts', resourcesController.gmailShortcuts);
|
app.get('/gmail-shortcuts', resourcesController.gmailShortcuts);
|
||||||
app.get('/control-shortcuts', resourcesController.controlShortcuts);
|
|
||||||
app.get('/control-shortcuts', resourcesController.deployAWebsite);
|
|
||||||
app.get('/nodeschool-challenges', resourcesController.nodeSchoolChallenges);
|
app.get('/nodeschool-challenges', resourcesController.nodeSchoolChallenges);
|
||||||
app.get('/stats', function(req, res) {
|
app.get('/stats', function(req, res) {
|
||||||
res.redirect(301, '/learn-to-code');
|
res.redirect(301, '/learn-to-code');
|
||||||
@ -425,7 +424,19 @@ app.get('/bonfire', function(req, res) {
|
|||||||
res.redirect(301, '/playground');
|
res.redirect(301, '/playground');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wiki related routes
|
||||||
|
*/
|
||||||
|
|
||||||
|
app.get(
|
||||||
|
'/wiki/:wikiName',
|
||||||
|
wikiController.returnIndividualWiki
|
||||||
|
);
|
||||||
|
|
||||||
|
app.get(
|
||||||
|
'/wiki',
|
||||||
|
wikiController.showAllWikis
|
||||||
|
);
|
||||||
|
|
||||||
app.post('/completed-bonfire/', bonfireController.completedBonfire);
|
app.post('/completed-bonfire/', bonfireController.completedBonfire);
|
||||||
|
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
var async = require('async'),
|
|
||||||
User = require('../models/User'),
|
|
||||||
Challenge = require('./../models/Challenge'),
|
|
||||||
Bonfire = require('./../models/Bonfire'),
|
|
||||||
Story = require('./../models/Story'),
|
|
||||||
Comment = require('./../models/Comment'),
|
|
||||||
resources = require('./resources.json'),
|
|
||||||
steps = resources.steps,
|
|
||||||
secrets = require('./../config/secrets'),
|
|
||||||
moment = require('moment'),
|
|
||||||
https = require('https'),
|
|
||||||
debug = require('debug')('freecc:cntr:resources'),
|
|
||||||
cheerio = require('cheerio'),
|
|
||||||
request = require('request'),
|
|
||||||
R = require('ramda');
|
|
||||||
|
|
||||||
nonprofitHome: function nonprofitHome(req, res) {
|
|
||||||
res.render('nonprofits/home', {
|
|
||||||
title: 'A guide to our Nonprofit Projects'
|
|
||||||
});
|
|
||||||
}
|
|
@ -3,7 +3,6 @@ var _ = require('lodash'),
|
|||||||
Bonfire = require('./../models/Bonfire'),
|
Bonfire = require('./../models/Bonfire'),
|
||||||
User = require('./../models/User'),
|
User = require('./../models/User'),
|
||||||
resources = require('./resources'),
|
resources = require('./resources'),
|
||||||
MDNlinks = require('./../seed_data/bonfireMDNlinks'),
|
|
||||||
R = require('ramda');
|
R = require('ramda');
|
||||||
MDNlinks = require('./../seed_data/bonfireMDNlinks');
|
MDNlinks = require('./../seed_data/bonfireMDNlinks');
|
||||||
|
|
||||||
|
@ -1,61 +0,0 @@
|
|||||||
/**
|
|
||||||
* GET /
|
|
||||||
* Challenges.
|
|
||||||
*/
|
|
||||||
var _ = require('lodash'),
|
|
||||||
debug = require('debug')('freecc:cntr:challenges'),
|
|
||||||
Challenge = require('./../models/Challenge'),
|
|
||||||
resources = require('./resources');
|
|
||||||
|
|
||||||
var highestChallengeNumber = 53;
|
|
||||||
|
|
||||||
|
|
||||||
exports.returnNextChallenge = function(req, res) {
|
|
||||||
if (req.user) {
|
|
||||||
ch = req.user.challengesHash;
|
|
||||||
if (req.user.challengesHash[0] > 0) {
|
|
||||||
var max = Object.keys(ch).reduce(function(max, key) {
|
|
||||||
return (max === undefined || ch[key] > ch[max]) ? +key : max;
|
|
||||||
});
|
|
||||||
nextChallenge = max + 1;
|
|
||||||
res.redirect('challenges/' + nextChallenge);
|
|
||||||
} else {
|
|
||||||
res.redirect('challenges/0');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return res.redirect('../challenges/0');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.returnChallenge = function(req, res) {
|
|
||||||
var challengeNumber = parseInt(req.params.challengeNumber) || 0;
|
|
||||||
if (challengeNumber === 2) {
|
|
||||||
return res.redirect('../challenges/3');
|
|
||||||
}
|
|
||||||
if (challengeNumber > highestChallengeNumber) {
|
|
||||||
req.flash('errors', {
|
|
||||||
msg: "It looks like you've either completed all the challenges we have available or requested a challenge we don't have."
|
|
||||||
});
|
|
||||||
return res.redirect('../challenges/0');
|
|
||||||
}
|
|
||||||
Challenge.find({}, null, { sort: { challengeNumber: 1 } }, function(err, c) {
|
|
||||||
if (err) {
|
|
||||||
debug('Challenge err: ', err);
|
|
||||||
next(err);
|
|
||||||
}
|
|
||||||
res.render('challenges/show', {
|
|
||||||
title: 'Challenge: ' + c[challengeNumber].name,
|
|
||||||
name: c[challengeNumber].name,
|
|
||||||
video: c[challengeNumber].video,
|
|
||||||
time: c[challengeNumber].time,
|
|
||||||
steps: c[challengeNumber].steps,
|
|
||||||
number: challengeNumber,
|
|
||||||
cc: req.user ? req.user.challengesHash : undefined,
|
|
||||||
points: req.user ? req.user.points : undefined,
|
|
||||||
verb: resources.randomVerb(),
|
|
||||||
phrase: resources.randomPhrase(),
|
|
||||||
compliment: resources.randomCompliment(),
|
|
||||||
challenges: c
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
@ -108,12 +108,6 @@ module.exports = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
controlShortcuts: function controlShortcuts(req, res) {
|
|
||||||
res.render('resources/control-shortcuts', {
|
|
||||||
title: 'These Control Shortcuts will save you Hours'
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
chromebook: function chromebook(req, res) {
|
chromebook: function chromebook(req, res) {
|
||||||
res.render('resources/chromebook', {
|
res.render('resources/chromebook', {
|
||||||
title: 'Win a Chromebook'
|
title: 'Win a Chromebook'
|
||||||
|
40
controllers/wiki.js
Normal file
40
controllers/wiki.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
var _ = require('lodash'),
|
||||||
|
debug = require('debug')('freecc:cntr:wiki'),
|
||||||
|
Wiki = require('./../models/Wiki'),
|
||||||
|
resources = require('./resources'),
|
||||||
|
R = require('ramda');
|
||||||
|
|
||||||
|
exports.returnIndividualWiki = function(req, res, next) {
|
||||||
|
var dashedName = req.params.wikiName;
|
||||||
|
|
||||||
|
var wikiName = dashedName.replace(/\-/g, ' ');
|
||||||
|
|
||||||
|
Wiki.find({'name': new RegExp(wikiName, 'i')}, function(err, wiki) {
|
||||||
|
if (err) {
|
||||||
|
next(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wiki.length < 1) {
|
||||||
|
req.flash('errors', {
|
||||||
|
msg: "404: We couldn't find a wiki entry with that name. Please double check the name."
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.redirect('/wiki');
|
||||||
|
}
|
||||||
|
|
||||||
|
wiki = wiki.pop();
|
||||||
|
var dashedNameFull = wiki.name.toLowerCase().replace(/\s/g, '-');
|
||||||
|
if (dashedNameFull != dashedName) {
|
||||||
|
return res.redirect('../wiki/' + dashedNameFull);
|
||||||
|
}
|
||||||
|
res.render('wiki/show', {
|
||||||
|
title: wiki.name,
|
||||||
|
description: wiki.description.join('')
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.showAllWikis = function(req, res) {
|
||||||
|
data.wikiList = resources.allWikiNames();
|
||||||
|
res.send(data);
|
||||||
|
};
|
@ -1,21 +0,0 @@
|
|||||||
var async = require('async'),
|
|
||||||
User = require('../models/User'),
|
|
||||||
Challenge = require('./../models/Challenge'),
|
|
||||||
Bonfire = require('./../models/Bonfire'),
|
|
||||||
Story = require('./../models/Story'),
|
|
||||||
Comment = require('./../models/Comment'),
|
|
||||||
resources = require('./resources.json'),
|
|
||||||
steps = resources.steps,
|
|
||||||
secrets = require('./../config/secrets'),
|
|
||||||
moment = require('moment'),
|
|
||||||
https = require('https'),
|
|
||||||
debug = require('debug')('freecc:cntr:resources'),
|
|
||||||
cheerio = require('cheerio'),
|
|
||||||
request = require('request'),
|
|
||||||
R = require('ramda');
|
|
||||||
|
|
||||||
nonprofitHome: function nonprofitHome(req, res) {
|
|
||||||
res.render('nonprofits/home', {
|
|
||||||
title: 'A guide to our Nonprofit Projects'
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
var mongoose = require('mongoose');
|
|
||||||
var secrets = require('../config/secrets');
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @type {exports.Schema}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
var basejumpSchema = new mongoose.Schema({
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
picture: String,
|
|
||||||
video: String,
|
|
||||||
gitHubLink: String,
|
|
||||||
demoLink: String,
|
|
||||||
details: Array
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = mongoose.model('Basejump', basejumpSchema);
|
|
@ -16,7 +16,7 @@ var coursewareSchema = new mongoose.Schema({
|
|||||||
tests: Array,
|
tests: Array,
|
||||||
challengeSeed: Array,
|
challengeSeed: Array,
|
||||||
completionMessage: String, // Congratulations! You've finished our HTML and CSS track!
|
completionMessage: String, // Congratulations! You've finished our HTML and CSS track!
|
||||||
challengeType: Number // 0 = html, 1 = javascript only, 2 = video
|
challengeType: Number // 0 = html, 1 = javascript only, 2 = video, 3 = bonfire, 4 = zipline, 5 = basejump
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = mongoose.model('Courseware', coursewareSchema);
|
module.exports = mongoose.model('Courseware', coursewareSchema);
|
||||||
|
@ -46,4 +46,4 @@ var storySchema = new mongoose.Schema({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = mongoose.model('Story', storySchema);
|
module.exports = mongoose.model('Story', storySchema);
|
||||||
|
15
models/Wiki.js
Normal file
15
models/Wiki.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
var mongoose = require('mongoose');
|
||||||
|
var secrets = require('../config/secrets');
|
||||||
|
|
||||||
|
var wikiSchema = new mongoose.Schema({
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
unique: false
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: Array,
|
||||||
|
unique: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('Wiki', wikiSchema);
|
@ -1,21 +0,0 @@
|
|||||||
var mongoose = require('mongoose');
|
|
||||||
var secrets = require('../config/secrets');
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @type {exports.Schema}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
var ziplineSchema = new mongoose.Schema({
|
|
||||||
name: {
|
|
||||||
type: String,
|
|
||||||
unique: true
|
|
||||||
},
|
|
||||||
picture: String,
|
|
||||||
video: String,
|
|
||||||
codepenLink: String,
|
|
||||||
details: Array
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = mongoose.model('Zipline', ziplineSchema);
|
|
@ -1,15 +1,17 @@
|
|||||||
require('dotenv').load();
|
require('dotenv').load();
|
||||||
var Bonfire = require('../models/Bonfire.js'),
|
var Bonfire = require('../models/Bonfire.js'),
|
||||||
Courseware = require('../models/Courseware.js'),
|
Courseware = require('../models/Courseware.js'),
|
||||||
|
Wiki = require('../models/Wiki.js'),
|
||||||
mongoose = require('mongoose'),
|
mongoose = require('mongoose'),
|
||||||
secrets = require('../config/secrets'),
|
secrets = require('../config/secrets'),
|
||||||
coursewares = require('./coursewares.json'),
|
coursewares = require('./coursewares.json'),
|
||||||
|
wikis = require('./wikis.json')
|
||||||
bonfires = require('./bonfires.json');
|
bonfires = require('./bonfires.json');
|
||||||
|
|
||||||
mongoose.connect(secrets.db);
|
mongoose.connect(secrets.db);
|
||||||
|
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
var offerings = 2;
|
var offerings = 3;
|
||||||
|
|
||||||
var CompletionMonitor = function() {
|
var CompletionMonitor = function() {
|
||||||
counter++;
|
counter++;
|
||||||
@ -56,3 +58,20 @@ Courseware.remove({}, function(err, data) {
|
|||||||
});
|
});
|
||||||
console.log('coursewares');
|
console.log('coursewares');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Wiki.remove({}, function(err, data) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
} else {
|
||||||
|
console.log('Deleted ', data);
|
||||||
|
}
|
||||||
|
Wiki.create(wikis, function(err, data) {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
} else {
|
||||||
|
console.log('Saved ', data);
|
||||||
|
}
|
||||||
|
CompletionMonitor();
|
||||||
|
});
|
||||||
|
console.log('wikis');
|
||||||
|
});
|
||||||
|
25
seed_data/wikis.json
Normal file
25
seed_data/wikis.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"_id": "bd7158d9c442eddfaeb5bdef",
|
||||||
|
"name": "Global Control Shortcuts for Mac",
|
||||||
|
"description": [
|
||||||
|
"<h2>These Global Control Shortcuts for Mac will save you hours by speeding up your typing</h2>",
|
||||||
|
"<div class=\"embed-responsive embed-responsive-16by9\"><iframe src=\"//player.vimeo.com/video/107073108\" class=\"embed-responsive-item\"></iframe></div>",
|
||||||
|
"<div class=\"text-left\">",
|
||||||
|
" <h3>These global shortcuts work everywhere on a Mac:",
|
||||||
|
" <ul>",
|
||||||
|
" <li>Control + F = Forward</li>",
|
||||||
|
" <li>Control + B = Backward</li>",
|
||||||
|
" <li>Control + N = Next Line</li>",
|
||||||
|
" <li>Control + P = Previous Line</li>",
|
||||||
|
" <li>Control + H = Backspace</li>",
|
||||||
|
" <li>Control + D = Delete</li>",
|
||||||
|
" <li>Control + A = Beginning of Line</li>",
|
||||||
|
" <li>Control + E = End of Line</li>",
|
||||||
|
" <li>Control + K = Kill line</li>",
|
||||||
|
" </ul>",
|
||||||
|
" </h3>",
|
||||||
|
"</div><a href=\"/login\" class=\"btn btn-cta signup-btn btn-primary\">Start learning to code (it's free)<br/></a>"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
@ -1,22 +0,0 @@
|
|||||||
extends ../layout
|
|
||||||
block content
|
|
||||||
.jumbotron.text-center
|
|
||||||
h1.hug-top Global Control Shortcuts for Mac
|
|
||||||
h2 These Global Control Shortcuts for Mac will save you hours by speeding up your typing
|
|
||||||
br
|
|
||||||
.embed-responsive.embed-responsive-16by9
|
|
||||||
iframe.embed-responsive-item(src='//player.vimeo.com/video/107073108')
|
|
||||||
.text-left
|
|
||||||
h3 These global shortcuts work everywhere on a Mac:
|
|
||||||
ul
|
|
||||||
li Control + F = Forward
|
|
||||||
li Control + B = Backward
|
|
||||||
li Control + N = Next Line
|
|
||||||
li Control + P = Previous Line
|
|
||||||
li Control + H = Backspace
|
|
||||||
li Control + D = Delete
|
|
||||||
li Control + A = Beginning of Line
|
|
||||||
li Control + E = End of Line
|
|
||||||
li Control + K = Kill line
|
|
||||||
a.btn.btn-cta.signup-btn.btn-primary(href="/login") Start learning to code (it's free)
|
|
||||||
br
|
|
10
views/wiki/show.jade
Normal file
10
views/wiki/show.jade
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
extends ../layout
|
||||||
|
block content
|
||||||
|
script.
|
||||||
|
var challengeName = 'Wiki View';
|
||||||
|
.col-xs-12.col-sm-12.col-md-12
|
||||||
|
.panel.panel-info
|
||||||
|
.panel-heading.text-center
|
||||||
|
h1= title
|
||||||
|
.panel-body
|
||||||
|
h1!= description
|
Reference in New Issue
Block a user