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'),
bonfireController = require('./controllers/bonfire'),
coursewareController = require('./controllers/courseware'),
wikiController = require('./controllers/wiki'),
fieldGuideController = require('./controllers/fieldGuide'),
challengeMapController = require('./controllers/challengeMap'),
@ -238,11 +238,11 @@ app.use(express.static(__dirname + '/public', { maxAge: 86400000 }));
app.get('/', homeController.index);
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) {
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);
@ -254,31 +254,31 @@ app.get('/twitch', resourcesController.twitch);
app.get('/map', challengeMapController.challengeMap);
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) {
res.redirect(301, '/wiki/install-screenhero');
res.redirect(301, '/field-guide/install-screenhero');
});
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) {
res.redirect(301, '/wiki/chromebook');
res.redirect(301, '/field-guide/chromebook');
});
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) {
res.redirect(301, '/wiki/gmail-shortcuts');
res.redirect(301, '/field-guide/gmail-shortcuts');
});
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) {
@ -484,7 +484,7 @@ app.get('/api/trello', resourcesController.trelloCalls);
* Bonfire related routes
*/
app.get('/wiki/getWikiList', wikiController.showAllWikis);
app.get('/field-guide/getFieldGuideList', fieldGuideController.showAllFieldGuides);
app.get('/playground', bonfireController.index);
@ -510,15 +510,15 @@ app.get('/bonfire', function(req, res) {
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'),
Bonfire = require('./../models/Bonfire'),
Story = require('./../models/Story'),
Wiki = require('./../models/Wiki'),
Nonprofit = require('./../models/Nonprofit'),
Comment = require('./../models/Comment'),
Courseware = require('./../models/Courseware'),
@ -12,7 +11,6 @@ var async = require('async'),
bonfires = require('../seed_data/bonfires.json'),
nonprofits = require('../seed_data/nonprofits.json'),
coursewares = require('../seed_data/coursewares.json'),
wikis = require('../seed_data/wikis.json'),
moment = require('moment'),
https = require('https'),
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'),
Bonfire = require('./../models/Bonfire'),
Story = require('./../models/Story'),
Wiki = require('./../models/Wiki'),
FieldGuide = require('./../models/FieldGuide'),
Nonprofit = require('./../models/Nonprofit'),
Comment = require('./../models/Comment'),
resources = require('./resources.json'),
@ -12,7 +12,7 @@ var async = require('async'),
bonfires = require('../seed_data/bonfires.json'),
nonprofits = require('../seed_data/nonprofits.json'),
coursewares = require('../seed_data/coursewares.json'),
wikis = require('../seed_data/wikis.json'),
fieldGuides = require('../seed_data/field-guides.json'),
moment = require('moment'),
https = require('https'),
debug = require('debug')('freecc:cntr:resources'),
@ -259,8 +259,8 @@ module.exports = {
});
},
allWikiIds: function() {
return wikis.map(function(elem) {
allFieldGuideIds: function() {
return fieldGuides.map(function(elem) {
return {
_id: elem._id,
}
@ -289,8 +289,8 @@ module.exports = {
});
},
allWikiNames: function() {
return wikis.map(function(elem) {
allFieldGuideNames: function() {
return fieldGuides.map(function(elem) {
return {
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 secrets = require('../config/secrets');
var wikiSchema = new mongoose.Schema({
var fieldGuideSchema = new mongoose.Schema({
name: {
type: String,
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
}
],
completedWikis: [],
uncompletedWikis: [],
completedFieldGuides: [],
uncompletedFieldGuides: [],
currentStreak: {
type: Number,
default: 0

View File

@ -52,18 +52,18 @@ $(document).ready(function() {
}
}
function completedWiki(wikiId) {
function completedFieldGuide(fieldGuideId) {
if ($('.signup-btn-nav').length < 1) {
$.post(
'/completed-wiki',
'/completed-field-guide',
{
wikiInfo: {
wikiId: wikiId
fieldGuideInfo: {
fieldGuideId: fieldGuideId
}
},
function(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() {
var wikiId = $('#wikiId').text();
completedWiki(wikiId);
$('.next-field-guide-button').on('click', function() {
console.log('click');
var fieldGuideId = $('#fieldGuideId').text();
completedFieldGuide(fieldGuideId);
});
$("img").error(function () {

View File

@ -1,12 +1,12 @@
require('dotenv').load();
var Bonfire = require('../models/Bonfire.js'),
Courseware = require('../models/Courseware.js'),
Wiki = require('../models/Wiki.js'),
FieldGuide = require('../models/FieldGuide.js'),
Nonprofit = require('../models/Nonprofit.js'),
mongoose = require('mongoose'),
secrets = require('../config/secrets'),
coursewares = require('./coursewares.json'),
wikis = require('./wikis.json'),
fieldGuides = require('./field-guides.json'),
nonprofits = require('./nonprofits.json'),
bonfires = require('./bonfires.json');
@ -61,13 +61,13 @@ Courseware.remove({}, function(err, data) {
console.log('coursewares');
});
Wiki.remove({}, function(err, data) {
FieldGuide.remove({}, function(err, data) {
if (err) {
console.error(err);
} else {
console.log('Deleted ', data);
}
Wiki.create(wikis, function(err, data) {
FieldGuide.create(fieldGuides, function(err, data) {
if (err) {
console.log(err);
} else {
@ -75,7 +75,7 @@ Wiki.remove({}, function(err, data) {
}
CompletionMonitor();
});
console.log('wikis');
console.log('field guides');
});
Nonprofit.remove({}, function(err, data) {

View File

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

View File

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

View File

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