start process of moving wiki over to field guide

This commit is contained in:
Michael Q Larson
2015-04-08 17:18:51 -07:00
parent 73b536de95
commit 7da6f69cd8
13 changed files with 153 additions and 154 deletions

30
app.js
View File

@ -42,7 +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'), fieldGuideController = require('./controllers/fieldGuide'),
challengeMapController = require('./controllers/challengeMap'), challengeMapController = require('./controllers/challengeMap'),
@ -238,11 +238,11 @@ app.use(express.static(__dirname + '/public', { maxAge: 86400000 }));
app.get('/', homeController.index); app.get('/', homeController.index);
app.get('/privacy', function(req, res) { app.get('/privacy', function(req, res) {
res.redirect(301, "/wiki/free-code-camp's-privacy-policy"); res.redirect(301, "/field-guide/free-code-camp's-privacy-policy");
}); });
app.get('/nonprofit-project-instructions', function(req, res) { app.get('/nonprofit-project-instructions', function(req, res) {
res.redirect(301, "/wiki/free-code-camp's-privacy-policy"); res.redirect(301, "/field-guide/free-code-camp's-privacy-policy");
}); });
app.get('/jquery-exercises', resourcesController.jqueryExercises); app.get('/jquery-exercises', resourcesController.jqueryExercises);
@ -254,31 +254,31 @@ app.get('/twitch', resourcesController.twitch);
app.get('/map', challengeMapController.challengeMap); app.get('/map', challengeMapController.challengeMap);
app.get('/live-pair-programming', function(req, res) { app.get('/live-pair-programming', function(req, res) {
res.redirect(301, '/wiki/live-stream-pair-programming-on-twitch.tv'); res.redirect(301, '/field-guide/live-stream-pair-programming-on-twitch.tv');
}); });
app.get('/install-screenhero', function(req, res) { app.get('/install-screenhero', function(req, res) {
res.redirect(301, '/wiki/install-screenhero'); res.redirect(301, '/field-guide/install-screenhero');
}); });
app.get('/guide-to-our-nonprofit-projects', function(req, res) { app.get('/guide-to-our-nonprofit-projects', function(req, res) {
res.redirect(301, '/wiki/a-guide-to-our-nonprofit-projects'); res.redirect(301, '/field-guide/a-guide-to-our-nonprofit-projects');
}); });
app.get('/chromebook', function(req, res) { app.get('/chromebook', function(req, res) {
res.redirect(301, '/wiki/chromebook'); res.redirect(301, '/field-guide/chromebook');
}); });
app.get('/deploy-a-website', function(req, res) { app.get('/deploy-a-website', function(req, res) {
res.redirect(301, '/wiki/deploy-a-website'); res.redirect(301, '/field-guide/deploy-a-website');
}); });
app.get('/gmail-shortcuts', function(req, res) { app.get('/gmail-shortcuts', function(req, res) {
res.redirect(301, '/wiki/gmail-shortcuts'); res.redirect(301, '/field-guide/gmail-shortcuts');
}); });
app.get('/nodeschool-challenges', function(req, res) { app.get('/nodeschool-challenges', function(req, res) {
res.redirect(301, '/wiki/nodeschool-challenges'); res.redirect(301, '/field-guide/nodeschool-challenges');
}); });
app.get('/stats', function(req, res) { app.get('/stats', function(req, res) {
@ -484,7 +484,7 @@ app.get('/api/trello', resourcesController.trelloCalls);
* Bonfire related routes * Bonfire related routes
*/ */
app.get('/wiki/getWikiList', wikiController.showAllWikis); app.get('/field-guide/getFieldGuideList', fieldGuideController.showAllFieldGuides);
app.get('/playground', bonfireController.index); app.get('/playground', bonfireController.index);
@ -510,15 +510,15 @@ app.get('/bonfire', function(req, res) {
app.post('/completed-bonfire/', bonfireController.completedBonfire); app.post('/completed-bonfire/', bonfireController.completedBonfire);
/** /**
* Wiki related routes * Field Guide related routes
*/ */
app.get('/wiki/:wikiName', wikiController.returnIndividualWiki); app.get('/field-guide/:fieldGuideName', fieldGuideController.returnIndividualFieldGuide);
app.get('/wiki', wikiController.returnNextWiki); app.get('/field-guide', fieldGuideController.returnNextFieldGuide);
app.post('/completed-wiki/', wikiController.completedWiki); app.post('/completed-field-guide/', fieldGuideController.completedFieldGuide);
/** /**

View File

@ -2,7 +2,6 @@ var async = require('async'),
User = require('../models/User'), User = require('../models/User'),
Bonfire = require('./../models/Bonfire'), Bonfire = require('./../models/Bonfire'),
Story = require('./../models/Story'), Story = require('./../models/Story'),
Wiki = require('./../models/Wiki'),
Nonprofit = require('./../models/Nonprofit'), Nonprofit = require('./../models/Nonprofit'),
Comment = require('./../models/Comment'), Comment = require('./../models/Comment'),
Courseware = require('./../models/Courseware'), Courseware = require('./../models/Courseware'),
@ -12,7 +11,6 @@ var async = require('async'),
bonfires = require('../seed_data/bonfires.json'), bonfires = require('../seed_data/bonfires.json'),
nonprofits = require('../seed_data/nonprofits.json'), nonprofits = require('../seed_data/nonprofits.json'),
coursewares = require('../seed_data/coursewares.json'), coursewares = require('../seed_data/coursewares.json'),
wikis = require('../seed_data/wikis.json'),
moment = require('moment'), moment = require('moment'),
https = require('https'), https = require('https'),
debug = require('debug')('freecc:cntr:resources'), debug = require('debug')('freecc:cntr:resources'),

99
controllers/fieldGuide.js Normal file
View File

@ -0,0 +1,99 @@
var _ = require('lodash'),
debug = require('debug')('freecc:cntr:fieldGuide'),
FieldGuide = require('./../models/FieldGuide'),
resources = require('./resources'),
R = require('ramda');
exports.returnIndividualFieldGuide = function(req, res, next) {
var dashedName = req.params.fieldGuideName;
var fieldGuideName = dashedName.replace(/\-/g, ' ');
FieldGuide.find({'name': new RegExp(fieldGuideName, 'i')}, function(err, fieldGuide) {
if (err) {
next(err);
}
if (fieldGuide.length < 1) {
req.flash('errors', {
msg: "404: We couldn't find a field guide entry with that name. Please double check the name."
});
return res.redirect('/field-guide');
}
fieldGuide = fieldGuide.pop();
var dashedNameFull = fieldGuide.name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, '');
if (dashedNameFull != dashedName) {
return res.redirect('../field-guide/' + dashedNameFull);
}
res.render('field-guide/show', {
title: fieldGuide.name,
fieldGuideId: fieldGuide._id,
description: fieldGuide.description.join('')
});
});
};
exports.showAllFieldGuides = function(req, res) {
var data = {};
data.fieldGuideList = resources.allFieldGuideNames();
data.fieldGuideIds = resources.allFieldGuideIds();
data.completedFieldGuides = req.user.completedFieldGuides;
res.send(data);
};
exports.returnNextFieldGuide = function(req, res, next) {
if (!req.user) {
return res.redirect('../field-guide/how-do-i-use-this-guide?');
}
var completed = req.user.completedFieldGuides;
req.user.uncompletedFieldGuides = resources.allFieldGuideIds().filter(function (elem) {
if (completed.indexOf(elem) === -1) {
return elem;
}
});
req.user.save();
var uncompletedFieldGuides = req.user.uncompletedFieldGuides;
var displayedFieldGuides = FieldGuide.find({'_id': uncompletedFieldGuides[0]});
displayedFieldGuides.exec(function(err, fieldGuide) {
if (err) {
return next(err);
}
fieldGuide = fieldGuide.pop();
if (fieldGuide === undefined) {
req.flash('success', {
msg: "You've read all our current Field Guide entries. You can contribute to our Field Guide <a href='https://github.com/FreeCodeCamp/freecodecamp/blob/nonprofit-show/seed_data/fieldGuides.json'>here</a>."
});
return res.redirect('../field-guide/how-do-i-use-this-guide?');
}
var nameString = fieldGuide.name.toLowerCase().replace(/\s/g, '-');
return res.redirect('../field-guide/' + nameString);
});
};
exports.completedFieldGuide = function (req, res, next) {
debug('params in completedFieldGuide', req.params);
var fieldGuideId = req.body.fieldGuideInfo.fieldGuideId;
req.user.completedFieldGuides.push(fieldGuideId);
var index = req.user.uncompletedFieldGuides.indexOf(fieldGuideId);
if (index > -1) {
req.user.progressTimestamps.push(Date.now() || 0);
req.user.uncompletedFieldGuides.splice(index, 1);
}
req.user.save(function (err, user) {
if (err) {
return next(err);
}
if (user) {
res.send(true);
}
});
};

View File

@ -3,7 +3,7 @@ var async = require('async'),
Challenge = require('./../models/Challenge'), Challenge = require('./../models/Challenge'),
Bonfire = require('./../models/Bonfire'), Bonfire = require('./../models/Bonfire'),
Story = require('./../models/Story'), Story = require('./../models/Story'),
Wiki = require('./../models/Wiki'), FieldGuide = require('./../models/FieldGuide'),
Nonprofit = require('./../models/Nonprofit'), Nonprofit = require('./../models/Nonprofit'),
Comment = require('./../models/Comment'), Comment = require('./../models/Comment'),
resources = require('./resources.json'), resources = require('./resources.json'),
@ -12,7 +12,7 @@ var async = require('async'),
bonfires = require('../seed_data/bonfires.json'), bonfires = require('../seed_data/bonfires.json'),
nonprofits = require('../seed_data/nonprofits.json'), nonprofits = require('../seed_data/nonprofits.json'),
coursewares = require('../seed_data/coursewares.json'), coursewares = require('../seed_data/coursewares.json'),
wikis = require('../seed_data/wikis.json'), fieldGuides = require('../seed_data/field-guides.json'),
moment = require('moment'), moment = require('moment'),
https = require('https'), https = require('https'),
debug = require('debug')('freecc:cntr:resources'), debug = require('debug')('freecc:cntr:resources'),
@ -259,8 +259,8 @@ module.exports = {
}); });
}, },
allWikiIds: function() { allFieldGuideIds: function() {
return wikis.map(function(elem) { return fieldGuides.map(function(elem) {
return { return {
_id: elem._id, _id: elem._id,
} }
@ -289,8 +289,8 @@ module.exports = {
}); });
}, },
allWikiNames: function() { allFieldGuideNames: function() {
return wikis.map(function(elem) { return fieldGuides.map(function(elem) {
return { return {
name: elem.name name: elem.name
} }

View File

@ -1,99 +0,0 @@
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, '-').replace(/\?/g, '');
if (dashedNameFull != dashedName) {
return res.redirect('../wiki/' + dashedNameFull);
}
res.render('wiki/show', {
title: wiki.name,
wikiId: wiki._id,
description: wiki.description.join('')
});
});
};
exports.showAllWikis = function(req, res) {
var data = {};
data.wikiList = resources.allWikiNames();
data.wikiIds = resources.allWikiIds();
data.completedWikis = req.user.completedWikis;
res.send(data);
};
exports.returnNextWiki = function(req, res, next) {
if (!req.user) {
return res.redirect('../wiki/how-do-i-use-this-guide?');
}
var completed = req.user.completedWikis;
req.user.uncompletedWikis = resources.allWikiIds().filter(function (elem) {
if (completed.indexOf(elem) === -1) {
return elem;
}
});
req.user.save();
var uncompletedWikis = req.user.uncompletedWikis;
var displayedWikis = Wiki.find({'_id': uncompletedWikis[0]});
displayedWikis.exec(function(err, wiki) {
if (err) {
return next(err);
}
wiki = wiki.pop();
if (wiki === undefined) {
req.flash('success', {
msg: "You've read all our current Wiki entries. You can contribute to our Wiki <a href='https://github.com/FreeCodeCamp/freecodecamp/blob/nonprofit-show/seed_data/wikis.json'>here</a>."
});
return res.redirect('../wiki/how-do-i-use-this-guide?');
}
var nameString = wiki.name.toLowerCase().replace(/\s/g, '-');
return res.redirect('../wiki/' + nameString);
});
};
exports.completedWiki = function (req, res, next) {
debug('params in completedWiki', req.params);
var wikiId = req.body.wikiInfo.wikiId;
req.user.completedWikis.push(wikiId);
var index = req.user.uncompletedWikis.indexOf(wikiId);
if (index > -1) {
req.user.progressTimestamps.push(Date.now() || 0);
req.user.uncompletedWikis.splice(index, 1);
}
req.user.save(function (err, user) {
if (err) {
return next(err);
}
if (user) {
res.send(true);
}
});
};

View File

@ -1,7 +1,7 @@
var mongoose = require('mongoose'); var mongoose = require('mongoose');
var secrets = require('../config/secrets'); var secrets = require('../config/secrets');
var wikiSchema = new mongoose.Schema({ var fieldGuideSchema = new mongoose.Schema({
name: { name: {
type: String, type: String,
unique: false unique: false
@ -12,4 +12,4 @@ var wikiSchema = new mongoose.Schema({
} }
}); });
module.exports = mongoose.model('Wiki', wikiSchema); module.exports = mongoose.model('FieldGuide', fieldGuideSchema);

View File

@ -127,8 +127,8 @@ var userSchema = new mongoose.Schema({
verified: Boolean verified: Boolean
} }
], ],
completedWikis: [], completedFieldGuides: [],
uncompletedWikis: [], uncompletedFieldGuides: [],
currentStreak: { currentStreak: {
type: Number, type: Number,
default: 0 default: 0

View File

@ -52,18 +52,18 @@ $(document).ready(function() {
} }
} }
function completedWiki(wikiId) { function completedFieldGuide(fieldGuideId) {
if ($('.signup-btn-nav').length < 1) { if ($('.signup-btn-nav').length < 1) {
$.post( $.post(
'/completed-wiki', '/completed-field-guide',
{ {
wikiInfo: { fieldGuideInfo: {
wikiId: wikiId fieldGuideId: fieldGuideId
} }
}, },
function(res) { function(res) {
if (res) { if (res) {
window.location.href = '/wiki' window.location.href = '/field-guide'
} }
}); });
} }
@ -78,9 +78,10 @@ $(document).ready(function() {
}); });
$('.next-wiki-button').on('click', function() { $('.next-field-guide-button').on('click', function() {
var wikiId = $('#wikiId').text(); console.log('click');
completedWiki(wikiId); var fieldGuideId = $('#fieldGuideId').text();
completedFieldGuide(fieldGuideId);
}); });
$("img").error(function () { $("img").error(function () {

View File

@ -1,12 +1,12 @@
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'), FieldGuide = require('../models/FieldGuide.js'),
Nonprofit = require('../models/Nonprofit.js'), Nonprofit = require('../models/Nonprofit.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'), fieldGuides = require('./field-guides.json'),
nonprofits = require('./nonprofits.json'), nonprofits = require('./nonprofits.json'),
bonfires = require('./bonfires.json'); bonfires = require('./bonfires.json');
@ -61,13 +61,13 @@ Courseware.remove({}, function(err, data) {
console.log('coursewares'); console.log('coursewares');
}); });
Wiki.remove({}, function(err, data) { FieldGuide.remove({}, function(err, data) {
if (err) { if (err) {
console.error(err); console.error(err);
} else { } else {
console.log('Deleted ', data); console.log('Deleted ', data);
} }
Wiki.create(wikis, function(err, data) { FieldGuide.create(fieldGuides, function(err, data) {
if (err) { if (err) {
console.log(err); console.log(err);
} else { } else {
@ -75,7 +75,7 @@ Wiki.remove({}, function(err, data) {
} }
CompletionMonitor(); CompletionMonitor();
}); });
console.log('wikis'); console.log('field guides');
}); });
Nonprofit.remove({}, function(err, data) { Nonprofit.remove({}, function(err, data) {

View File

@ -1,7 +1,7 @@
extends ../layout extends ../layout
block content block content
script. script.
var challengeName = 'Wiki View'; var challengeName = 'Field Guide View';
.col-xs-12.col-sm-12.col-md-12 .col-xs-12.col-sm-12.col-md-12
.panel.panel-info .panel.panel-info
.panel-heading.text-center .panel-heading.text-center
@ -15,7 +15,7 @@ block content
.spacer .spacer
.col-xs-12.col-sm-6.col-sm-offset-3 .col-xs-12.col-sm-6.col-sm-offset-3
.text-center .text-center
.next-wiki-button.btn.btn-primary.btn-big.btn-block Next article (ctrl + enter) .next-fieldGuide-button.btn.btn-primary.btn-big.btn-block Next article (ctrl + enter)
.ten-pixel-break .ten-pixel-break
#showAllButton.btn.btn-info.btn-big.btn-block Show me all articles #showAllButton.btn.btn-info.btn-big.btn-block Show me all articles
.spacer .spacer
@ -30,13 +30,13 @@ block content
.modal-header.all-list-header Wiki Articles .modal-header.all-list-header Wiki Articles
a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') × a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×
.modal-body .modal-body
include ../partials/wikis include ../partials/field-guide
#wikiId.hidden= wikiId #fieldGuideId.hidden= fieldGuideId
script. script.
$(document).ready(function() { $(document).ready(function() {
$('body').keydown(function(e) { $('body').keydown(function(e) {
if (e.ctrlKey && e.keyCode == 13) { if (e.ctrlKey && e.keyCode == 13) {
$('.next-wiki-button').click(); $('.next-field-guide-button').click();
} }
}); });
}); });

View File

@ -1,5 +1,5 @@
h3 h3
ol#wikiList ol#fieldGuideList
script(src='/js/lib/ramda/ramda.min.js') script(src='/js/lib/ramda/ramda.min.js')
script. script.
var getLinkedName = function getLinkedName(name) { var getLinkedName = function getLinkedName(name) {
@ -8,22 +8,22 @@ h3
return name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, ''); return name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, '');
} }
$.ajax({ $.ajax({
url: '/wiki/getWikiList', url: '/field-guide/getFieldGuideList',
type: 'GET' type: 'GET'
}) })
.success( .success(
function(data) { function(data) {
var docfrag = document.createDocumentFragment(); var docfrag = document.createDocumentFragment();
for (var i = 0; i < data.wikiList.length; i++) { for (var i = 0; i < data.fieldGuideList.length; i++) {
var li = document.createElement("li"); var li = document.createElement("li");
// strike through wikis previously read // strike through field guides previously read
var linkedName = getLinkedName(data.wikiList[i].name); var linkedName = getLinkedName(data.fieldGuideList[i].name);
if (data.completedWikis.indexOf(data.wikiIds[i]) > -1) { if (data.completedFieldGuides.indexOf(data.fieldGuideIds[i]) > -1) {
$(li).html("<a class='strikethrough' href='/wiki/" + linkedName + "'>" + data.wikiList[i].name + "</a></li>"); $(li).html("<a class='strikethrough' href='/field-guide/" + linkedName + "'>" + data.fieldGuideList[i].name + "</a></li>");
} else { } else {
$(li).html("<a href='/wiki/" + linkedName + "'>" + data.wikiList[i].name + "</a></li>"); $(li).html("<a href='/field-guide/" + linkedName + "'>" + data.fieldGuideList[i].name + "</a></li>");
} }
docfrag.appendChild(li); docfrag.appendChild(li);
}; };
$('#wikiList').append(docfrag); $('#fieldGuideList').append(docfrag);
}); });

View File

@ -18,7 +18,7 @@
li li
a(href='/stories/hot') News a(href='/stories/hot') News
li li
a(href='/wiki') Field Guide a(href='/field-guide') Field Guide
if !user if !user
li &thinsp; &thinsp; &thinsp; li &thinsp; &thinsp; &thinsp;
li li