2015-03-18 04:57:05 +00:00
if ( process . env . NODE _ENV !== 'development' ) {
require ( 'newrelic' ) ;
}
2014-12-23 00:16:10 +00:00
require ( 'dotenv' ) . load ( ) ;
2015-03-23 05:18:01 +00:00
// handle uncaught exceptions. Forever will restart process on shutdown
process . on ( 'uncaughtException' , function ( err ) {
console . error (
( new Date ( ) ) . toUTCString ( ) + ' uncaughtException:' ,
err . message
) ;
console . error ( err . stack ) ;
/* eslint-disable no-process-exit */
process . exit ( 1 ) ;
/* eslint-enable no-process-exit */
} ) ;
2014-01-12 03:53:31 +00:00
2014-12-23 16:48:28 +00:00
var express = require ( 'express' ) ,
2015-04-14 19:36:02 +00:00
accepts = require ( 'accepts' ) ,
cookieParser = require ( 'cookie-parser' ) ,
compress = require ( 'compression' ) ,
session = require ( 'express-session' ) ,
logger = require ( 'morgan' ) ,
errorHandler = require ( 'errorhandler' ) ,
methodOverride = require ( 'method-override' ) ,
bodyParser = require ( 'body-parser' ) ,
helmet = require ( 'helmet' ) ,
MongoStore = require ( 'connect-mongo' ) ( session ) ,
flash = require ( 'express-flash' ) ,
path = require ( 'path' ) ,
mongoose = require ( 'mongoose' ) ,
passport = require ( 'passport' ) ,
expressValidator = require ( 'express-validator' ) ,
connectAssets = require ( 'connect-assets' ) ,
request = require ( 'request' ) ,
2014-01-12 03:53:31 +00:00
2014-12-23 16:48:28 +00:00
/ * *
2015-01-16 23:58:27 +00:00
* Controllers ( route handlers ) .
* /
2014-12-23 16:48:28 +00:00
homeController = require ( './controllers/home' ) ,
resourcesController = require ( './controllers/resources' ) ,
userController = require ( './controllers/user' ) ,
contactController = require ( './controllers/contact' ) ,
2015-03-25 02:08:26 +00:00
nonprofitController = require ( './controllers/nonprofits' ) ,
2015-01-11 05:45:22 +00:00
bonfireController = require ( './controllers/bonfire' ) ,
2015-02-02 07:35:27 +00:00
coursewareController = require ( './controllers/courseware' ) ,
2015-04-09 00:18:51 +00:00
fieldGuideController = require ( './controllers/fieldGuide' ) ,
2015-04-04 03:05:53 +00:00
challengeMapController = require ( './controllers/challengeMap' ) ,
2013-11-14 07:29:55 +00:00
2015-04-17 04:11:13 +00:00
/ * *
2015-03-03 10:23:56 +00:00
* Stories
2015-01-16 23:58:27 +00:00
* /
2015-04-17 04:11:13 +00:00
storyController = require ( './controllers/story' ) ;
2014-01-12 03:53:31 +00:00
2014-12-23 16:48:28 +00:00
/ * *
2015-01-16 23:58:27 +00:00
* API keys and Passport configuration .
* /
2014-12-23 16:48:28 +00:00
secrets = require ( './config/secrets' ) ,
passportConf = require ( './config/passport' ) ;
2013-11-27 04:15:13 +00:00
2014-02-02 10:38:38 +00:00
/ * *
* Create Express server .
* /
var app = express ( ) ;
2014-01-12 03:53:31 +00:00
/ * *
2014-06-06 18:58:30 +00:00
* Connect to MongoDB .
2014-01-12 03:53:31 +00:00
* /
2014-02-26 03:39:28 +00:00
mongoose . connect ( secrets . db ) ;
2015-01-16 23:58:27 +00:00
mongoose . connection . on ( 'error' , function ( ) {
console . error (
'MongoDB Connection Error. Please make sure that MongoDB is running.'
) ;
2014-01-12 03:53:31 +00:00
} ) ;
2013-11-13 17:32:22 +00:00
2014-05-06 04:44:30 +00:00
/ * *
* Express configuration .
* /
2014-04-18 18:29:30 +00:00
2015-02-17 23:35:16 +00:00
2014-01-12 03:53:31 +00:00
app . set ( 'port' , process . env . PORT || 3000 ) ;
app . set ( 'views' , path . join ( _ _dirname , 'views' ) ) ;
app . set ( 'view engine' , 'jade' ) ;
2014-06-06 18:58:30 +00:00
app . use ( compress ( ) ) ;
2014-12-27 08:22:50 +00:00
var oneYear = 31557600000 ;
2015-01-16 23:58:27 +00:00
app . use ( express . static ( _ _dirname + '/public' , { maxAge : oneYear } ) ) ;
2014-02-21 22:29:06 +00:00
app . use ( connectAssets ( {
2014-12-23 16:48:28 +00:00
paths : [
2015-01-16 23:58:27 +00:00
path . join ( _ _dirname , 'public/css' ) ,
path . join ( _ _dirname , 'public/js' )
2014-12-23 16:48:28 +00:00
] ,
2014-10-18 02:23:53 +00:00
helperContext : app . locals
2014-02-03 13:34:12 +00:00
} ) ) ;
2014-04-12 16:43:07 +00:00
app . use ( logger ( 'dev' ) ) ;
app . use ( bodyParser . json ( ) ) ;
2015-01-16 23:58:27 +00:00
app . use ( bodyParser . urlencoded ( { extended : true } ) ) ;
2014-12-24 02:20:53 +00:00
app . use ( expressValidator ( {
customValidators : {
2015-01-16 23:58:27 +00:00
matchRegex : function ( param , regex ) {
2014-12-24 02:20:53 +00:00
return regex . test ( param ) ;
}
}
} ) ) ;
2014-04-12 16:43:07 +00:00
app . use ( methodOverride ( ) ) ;
app . use ( cookieParser ( ) ) ;
app . use ( session ( {
2015-04-14 19:36:02 +00:00
resave : true ,
saveUninitialized : true ,
secret : secrets . sessionSecret ,
store : new MongoStore ( {
url : secrets . db ,
2015-04-17 06:16:55 +00:00
'autoReconnect' : true
2015-04-14 19:36:02 +00:00
} )
2014-01-29 05:49:09 +00:00
} ) ) ;
2014-01-12 03:53:31 +00:00
app . use ( passport . initialize ( ) ) ;
app . use ( passport . session ( ) ) ;
2014-06-01 15:52:28 +00:00
app . use ( flash ( ) ) ;
2014-12-11 04:44:33 +00:00
app . disable ( 'x-powered-by' ) ;
2014-12-23 16:48:28 +00:00
2014-12-11 04:44:33 +00:00
app . use ( helmet . xssFilter ( ) ) ;
2015-01-09 23:10:34 +00:00
app . use ( helmet . noSniff ( ) ) ;
2014-12-11 04:44:33 +00:00
app . use ( helmet . xframe ( ) ) ;
2015-02-17 23:35:16 +00:00
app . use ( function ( req , res , next ) {
res . header ( "Access-Control-Allow-Origin" , "*" ) ;
res . header ( "Access-Control-Allow-Headers" , "Origin, X-Requested-With, Content-Type, Accept" ) ;
next ( ) ;
} ) ;
2014-12-23 16:48:28 +00:00
2014-12-22 20:36:45 +00:00
var trusted = [
2015-04-14 19:36:02 +00:00
"'self'" ,
'*.freecodecamp.com' ,
'*.gstatic.com' ,
'*.google-analytics.com' ,
'*.googleapis.com' ,
'*.google.com' ,
'*.gstatic.com' ,
'*.doubleclick.net' ,
'*.twitter.com' ,
'*.twitch.tv' ,
'*.twimg.com' ,
"'unsafe-eval'" ,
"'unsafe-inline'" ,
'*.rafflecopter.com' ,
'*.bootstrapcdn.com' ,
'*.cloudflare.com' ,
'https://*.cloudflare.com' ,
'localhost:3001' ,
'ws://localhost:3001/' ,
'http://localhost:3001' ,
'localhost:3000' ,
'ws://localhost:3000/' ,
'http://localhost:3000' ,
'*.ionicframework.com' ,
'https://syndication.twitter.com' ,
'*.youtube.com' ,
'*.jsdelivr.net' ,
'https://*.jsdelivr.net' ,
'*.togetherjs.com' ,
'https://*.togetherjs.com' ,
'wss://hub.togetherjs.com' ,
'*.ytimg.com' ,
'wss://fcctogether.herokuapp.com' ,
2015-04-15 03:04:54 +00:00
'*.bitly.com' ,
'http://cdn.inspectlet.com/' ,
'http://hn.inspectlet.com/'
2014-12-22 20:36:45 +00:00
] ;
2014-12-22 21:38:48 +00:00
2014-12-11 04:44:33 +00:00
app . use ( helmet . contentSecurityPolicy ( {
2014-12-22 20:36:45 +00:00
defaultSrc : trusted ,
2015-02-20 01:18:44 +00:00
scriptSrc : [
'*.optimizely.com' ,
'*.aspnetcdn.com' ,
'*.d3js.org' ,
] . concat ( trusted ) ,
2014-12-23 21:50:14 +00:00
'connect-src' : [
2015-01-16 23:58:27 +00:00
'ws://*.rafflecopter.com' ,
'wss://*.rafflecopter.com' ,
'https://*.rafflecopter.com' ,
'ws://www.freecodecamp.com' ,
'http://www.freecodecamp.com'
2015-01-09 15:53:29 +00:00
] . concat ( trusted ) ,
2014-12-22 20:36:45 +00:00
styleSrc : trusted ,
2014-12-23 21:50:14 +00:00
imgSrc : [
2015-01-16 23:58:27 +00:00
'*.evernote.com' ,
'*.amazonaws.com' ,
'data:' ,
'*.licdn.com' ,
'*.gravatar.com' ,
'*.akamaihd.net' ,
'graph.facebook.com' ,
'*.githubusercontent.com' ,
'*.googleusercontent.com' ,
'*' /* allow all input since we have user submitted images for public profile*/
2014-12-23 21:50:14 +00:00
] . concat ( trusted ) ,
fontSrc : [ '*.googleapis.com' ] . concat ( trusted ) ,
mediaSrc : [
2015-01-16 23:58:27 +00:00
'*.amazonaws.com' ,
'*.twitter.com'
2015-01-09 15:53:29 +00:00
] . concat ( trusted ) ,
2014-12-23 21:50:14 +00:00
frameSrc : [
2015-01-16 23:58:27 +00:00
'*.gitter.im' ,
2015-03-10 22:42:15 +00:00
'*.gitter.im https:' ,
2015-01-16 23:58:27 +00:00
'*.vimeo.com' ,
'*.twitter.com' ,
'*.rafflecopter.com' ,
2015-02-16 07:59:03 +00:00
'*.ghbtns.com'
2015-01-09 15:53:29 +00:00
] . concat ( trusted ) ,
2014-12-11 04:44:33 +00:00
reportOnly : false , // set to true if you only want to report errors
setAllHeaders : false , // set to true if you want to set all headers
safari5 : false // set to true if you want to force buggy CSP in Safari 5
} ) ) ;
2014-11-19 23:30:36 +00:00
2015-01-16 23:58:27 +00:00
app . use ( function ( req , res , next ) {
2015-04-14 19:36:02 +00:00
// Make user object available in templates.
res . locals . user = req . user ;
next ( ) ;
2014-01-12 03:53:31 +00:00
} ) ;
2014-11-19 23:30:36 +00:00
2015-01-16 23:58:27 +00:00
app . use ( function ( req , res , next ) {
2014-10-18 02:23:53 +00:00
// Remember original destination before login.
var path = req . path . split ( '/' ) [ 1 ] ;
2015-03-28 05:16:48 +00:00
if ( /auth|login|logout|signin|signup|fonts|favicon/i . test ( path ) ) {
return next ( ) ;
} else if ( /\/stories\/comments\/\w+/i . test ( req . path ) ) {
2014-10-18 02:23:53 +00:00
return next ( ) ;
}
req . session . returnTo = req . path ;
next ( ) ;
2014-03-08 19:58:27 +00:00
} ) ;
2014-11-19 23:30:36 +00:00
2014-12-23 16:48:28 +00:00
app . use (
2015-04-14 19:36:02 +00:00
express . static ( path . join ( _ _dirname , 'public' ) , { maxAge : 31557600000 } )
2014-12-23 16:48:28 +00:00
) ;
2014-01-08 06:37:40 +00:00
2015-03-07 10:00:21 +00:00
app . use ( express . static ( _ _dirname + '/public' , { maxAge : 86400000 } ) ) ;
2014-01-12 03:53:31 +00:00
/ * *
2014-06-06 19:23:28 +00:00
* Main routes .
2014-01-12 03:53:31 +00:00
* /
2014-11-19 23:30:36 +00:00
2015-01-14 21:28:20 +00:00
app . get ( '/' , homeController . index ) ;
2015-03-30 22:15:07 +00:00
app . get ( '/privacy' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , "/field-guide/free-code-camp's-privacy-policy" ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/nonprofit-project-instructions' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , "/field-guide/free-code-camp's-privacy-policy" ) ;
2015-03-30 22:15:07 +00:00
} ) ;
2015-02-20 00:33:08 +00:00
app . get ( '/chat' , resourcesController . chat ) ;
2015-03-30 22:15:07 +00:00
2015-04-07 07:11:31 +00:00
app . get ( '/twitch' , resourcesController . twitch ) ;
2015-04-06 01:37:58 +00:00
app . get ( '/map' , challengeMapController . challengeMap ) ;
2015-04-04 03:05:53 +00:00
2015-03-30 22:15:07 +00:00
app . get ( '/live-pair-programming' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/live-stream-pair-programming-on-twitch.tv' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/install-screenhero' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/install-screenhero' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/guide-to-our-nonprofit-projects' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/a-guide-to-our-nonprofit-projects' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/chromebook' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/chromebook' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/deploy-a-website' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/deploy-a-website' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/gmail-shortcuts' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/gmail-shortcuts' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
app . get ( '/nodeschool-challenges' , function ( req , res ) {
2015-04-09 00:18:51 +00:00
res . redirect ( 301 , '/field-guide/nodeschool-challenges' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
2015-03-09 15:54:45 +00:00
app . get ( '/news' , function ( req , res ) {
2015-04-14 19:36:02 +00:00
res . redirect ( 301 , '/stories/hot' ) ;
2015-01-26 19:38:19 +00:00
} ) ;
2015-03-30 22:15:07 +00:00
app . get ( '/learn-to-code' , resourcesController . about ) ;
2015-01-26 19:38:19 +00:00
app . get ( '/about' , function ( req , res ) {
2015-04-14 19:36:02 +00:00
res . redirect ( 301 , '/learn-to-code' ) ;
2015-03-30 22:15:07 +00:00
} ) ;
2015-01-26 19:38:19 +00:00
app . get ( '/signin' , userController . getSignin ) ;
2015-03-30 22:15:07 +00:00
2015-01-26 19:38:19 +00:00
app . get ( '/login' , function ( req , res ) {
2015-04-14 19:36:02 +00:00
res . redirect ( 301 , '/signin' ) ;
2015-01-26 19:38:19 +00:00
} ) ;
2015-03-30 22:15:07 +00:00
2015-01-26 19:38:19 +00:00
app . post ( '/signin' , userController . postSignin ) ;
2015-03-30 22:15:07 +00:00
2015-01-26 19:38:19 +00:00
app . get ( '/signout' , userController . signout ) ;
2015-03-30 22:15:07 +00:00
2015-01-26 19:38:19 +00:00
app . get ( '/logout' , function ( req , res ) {
2015-04-14 19:36:02 +00:00
res . redirect ( 301 , '/signout' ) ;
2015-01-26 19:38:19 +00:00
} ) ;
2015-03-30 22:15:07 +00:00
2014-06-06 19:23:28 +00:00
app . get ( '/forgot' , userController . getForgot ) ;
2015-03-30 22:15:07 +00:00
2014-06-06 19:23:28 +00:00
app . post ( '/forgot' , userController . postForgot ) ;
2015-03-30 22:15:07 +00:00
2014-06-06 19:23:28 +00:00
app . get ( '/reset/:token' , userController . getReset ) ;
2015-03-30 22:15:07 +00:00
2014-06-06 19:23:28 +00:00
app . post ( '/reset/:token' , userController . postReset ) ;
2015-03-30 22:15:07 +00:00
2014-12-08 00:25:43 +00:00
app . get ( '/email-signup' , userController . getEmailSignup ) ;
2015-03-30 22:15:07 +00:00
2014-12-08 00:25:43 +00:00
app . get ( '/email-signin' , userController . getEmailSignin ) ;
2015-03-30 22:15:07 +00:00
2014-12-08 00:25:43 +00:00
app . post ( '/email-signup' , userController . postEmailSignup ) ;
2015-03-30 22:15:07 +00:00
2015-01-26 19:38:19 +00:00
app . post ( '/email-signin' , userController . postSignin ) ;
2015-01-14 21:28:20 +00:00
app . get ( '/nonprofits' , contactController . getNonprofitsForm ) ;
app . post ( '/nonprofits' , contactController . postNonprofitsForm ) ;
2015-03-30 22:15:07 +00:00
/ * *
* Nonprofit Project routes .
* /
2015-04-08 21:36:05 +00:00
app . get ( '/nonprofits' , nonprofitController . nonprofitsHome ) ;
2015-03-30 22:15:07 +00:00
2015-04-08 21:36:05 +00:00
app . get ( '/nonprofits/directory' , nonprofitController . nonprofitsDirectory ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/are-you-with-a-registered-nonprofit' , nonprofitController . areYouWithARegisteredNonprofit ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 05:12:16 +00:00
app . get ( '/nonprofits/are-there-people-that-are-already-benefiting-from-your-services' , nonprofitController . areTherePeopleThatAreAlreadyBenefitingFromYourServices ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/in-exchange-we-ask' , nonprofitController . inExchangeWeAsk ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/ok-with-javascript' , nonprofitController . okWithJavaScript ) ;
2015-03-30 22:15:07 +00:00
2015-03-27 06:33:52 +00:00
app . get ( '/nonprofits/how-can-free-code-camp-help-you' , nonprofitController . howCanFreeCodeCampHelpYou ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/what-does-your-nonprofit-do' , nonprofitController . whatDoesYourNonprofitDo ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/link-us-to-your-website' , nonprofitController . linkUsToYourWebsite ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 22:25:19 +00:00
app . get ( '/nonprofits/tell-us-your-name' , nonprofitController . tellUsYourName ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 22:25:19 +00:00
app . get ( '/nonprofits/tell-us-your-email' , nonprofitController . tellUsYourEmail ) ;
2015-03-30 22:15:07 +00:00
2015-03-25 04:46:42 +00:00
app . get ( '/nonprofits/your-nonprofit-project-application-has-been-submitted' , nonprofitController . yourNonprofitProjectApplicationHasBeenSubmitted ) ;
2015-03-30 22:15:07 +00:00
2015-03-27 06:33:52 +00:00
app . get ( '/nonprofits/other-solutions' , nonprofitController . otherSolutions ) ;
2015-01-23 23:13:36 +00:00
2015-04-01 00:38:33 +00:00
app . get ( '/nonprofits/getNonprofitList' , nonprofitController . showAllNonprofits ) ;
2015-04-02 05:31:08 +00:00
app . get ( '/nonprofits/interested-in-nonprofit/:nonprofitName' , nonprofitController . interestedInNonprofit ) ;
2015-03-31 01:02:50 +00:00
app . get (
'/nonprofits/:nonprofitName' ,
nonprofitController . returnIndividualNonprofit
) ;
2015-01-14 21:28:20 +00:00
app . get (
'/done-with-first-100-hours' ,
2015-01-23 23:13:36 +00:00
passportConf . isAuthenticated ,
2015-01-14 21:28:20 +00:00
contactController . getDoneWithFirst100Hours
) ;
app . post (
'/done-with-first-100-hours' ,
2015-01-23 23:13:36 +00:00
passportConf . isAuthenticated ,
2015-01-14 21:28:20 +00:00
contactController . postDoneWithFirst100Hours
) ;
2015-04-17 04:39:48 +00:00
//app.get(
// '/nonprofit-project-instructions',
// passportConf.isAuthenticated,
// resourcesController.nonprofitProjectInstructions
//);
2014-11-19 23:50:57 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/update-progress' ,
passportConf . isAuthenticated ,
userController . updateProgress
2014-12-23 16:48:28 +00:00
) ;
2015-02-16 07:59:03 +00:00
2015-04-09 05:42:40 +00:00
app . get ( '/api/slack' , function ( req , res ) {
if ( req . user ) {
if ( req . user . email ) {
var invite = {
'email' : req . user . email ,
'token' : process . env . SLACK _KEY ,
'set_active' : true
} ;
var headers = {
'User-Agent' : 'Node Browser/0.0.1' ,
'Content-Type' : 'application/x-www-form-urlencoded'
} ;
var options = {
url : 'https://freecode.slack.com/api/users.admin.invite' ,
method : 'POST' ,
headers : headers ,
form : invite
} ;
request ( options , function ( error , response , body ) {
if ( ! error && response . statusCode === 200 ) {
req . flash ( 'success' , {
msg : "We've successfully requested an invite for you. Please check your email and follow the instructions from Slack."
} ) ;
req . user . sentSlackInvite = true ;
req . user . save ( function ( err , user ) {
if ( err ) {
next ( err ) ;
}
return res . redirect ( 'back' ) ;
} ) ;
} else {
req . flash ( 'errors' , {
msg : "The invitation email did not go through for some reason. Please try again or <a href='mailto:team@freecodecamp.com?subject=slack%20invite%20failed%20to%20send>email us</a>."
} ) ;
return res . redirect ( 'back' ) ;
}
} )
} else {
req . flash ( 'notice' , {
msg : "Before we can send your Slack invite, we need your email address. Please update your profile information here."
} ) ;
return res . redirect ( '/account' ) ;
}
} else {
req . flash ( 'notice' , {
msg : "You need to sign in to Free Code Camp before we can send you a Slack invite."
} ) ;
return res . redirect ( '/account' ) ;
}
} ) ;
2015-02-16 07:59:03 +00:00
2015-03-03 10:23:56 +00:00
/ * *
2015-03-30 22:15:07 +00:00
* Camper News routes .
2015-03-03 10:23:56 +00:00
* /
2015-03-05 23:11:18 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/hotStories' ,
storyController . hotJSON
2015-03-05 23:11:18 +00:00
) ;
app . get (
2015-04-14 19:36:02 +00:00
'/stories/recentStories' ,
storyController . recentJSON
2015-03-05 23:11:18 +00:00
) ;
2015-03-03 10:23:56 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/' ,
function ( req , res ) {
res . redirect ( 302 , '/stories/hot' ) ;
}
2015-03-03 10:23:56 +00:00
) ;
2015-03-05 23:11:18 +00:00
2015-03-03 10:23:56 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/comments/:id' ,
storyController . comments
2015-03-03 10:23:56 +00:00
) ;
2015-03-03 22:15:00 +00:00
2015-03-05 21:08:40 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/comment/' ,
storyController . commentSubmit
2015-03-05 21:08:40 +00:00
) ;
2015-03-06 16:57:09 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/comment/:id/comment' ,
storyController . commentOnCommentSubmit
2015-03-06 16:57:09 +00:00
) ;
2015-03-03 22:15:00 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/submit' ,
storyController . submitNew
2015-03-03 22:15:00 +00:00
) ;
2015-03-07 08:42:22 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/submit/new-story' ,
storyController . preSubmit
2015-03-05 10:21:26 +00:00
) ;
2015-03-07 08:42:22 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/preliminary' ,
storyController . newStory
2015-03-07 08:42:22 +00:00
) ;
2015-03-05 23:11:18 +00:00
2015-03-07 09:26:49 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/' ,
storyController . storySubmission
2015-03-07 09:26:49 +00:00
) ;
2015-03-05 23:11:18 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/hot' ,
storyController . hot
2015-03-05 23:11:18 +00:00
) ;
app . get (
2015-04-14 19:36:02 +00:00
'/stories/recent' ,
storyController . recent
2015-03-05 23:11:18 +00:00
) ;
app . get (
2015-04-14 19:36:02 +00:00
'/stories/search' ,
storyController . search
2015-03-05 23:11:18 +00:00
) ;
2015-03-06 00:20:30 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/search' ,
storyController . getStories
2015-03-06 00:20:30 +00:00
) ;
2015-03-03 10:50:16 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/stories/:storyName' ,
storyController . returnIndividualStory
2015-03-03 10:50:16 +00:00
) ;
2015-03-05 23:11:18 +00:00
2015-03-03 13:03:33 +00:00
app . post (
2015-04-14 19:36:02 +00:00
'/stories/upvote/' ,
storyController . upvote
2015-03-03 13:03:33 +00:00
) ;
2015-03-03 10:23:56 +00:00
2014-11-19 23:30:36 +00:00
app . all ( '/account' , passportConf . isAuthenticated ) ;
2015-03-30 22:15:07 +00:00
2015-01-06 05:52:30 +00:00
app . get ( '/account/api' , userController . getAccountAngular ) ;
2015-01-28 01:12:51 +00:00
2015-02-17 07:35:02 +00:00
/ * *
* API routes
* /
app . get ( '/api/github' , resourcesController . githubCalls ) ;
2015-03-30 22:15:07 +00:00
2015-03-28 06:30:06 +00:00
app . get ( '/api/blogger' , resourcesController . bloggerCalls ) ;
2015-03-30 22:15:07 +00:00
2015-03-28 06:30:06 +00:00
app . get ( '/api/trello' , resourcesController . trelloCalls ) ;
2015-02-17 07:35:02 +00:00
2015-01-28 01:12:51 +00:00
/ * *
* Bonfire related routes
* /
2015-02-22 08:36:43 +00:00
2015-04-09 00:18:51 +00:00
app . get ( '/field-guide/getFieldGuideList' , fieldGuideController . showAllFieldGuides ) ;
2015-03-30 22:55:00 +00:00
2015-01-24 22:42:34 +00:00
app . get ( '/playground' , bonfireController . index ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/bonfires' , bonfireController . returnNextBonfire ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/bonfire-json-generator' , bonfireController . returnGenerator ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . post ( '/bonfire-json-generator' , bonfireController . generateChallenge ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/bonfire-challenge-generator' , bonfireController . publicGenerator ) ;
2015-03-30 22:15:07 +00:00
2015-03-30 22:55:00 +00:00
app . post ( '/bonfire-challenge-generator' , bonfireController . testBonfire ) ;
2015-03-30 22:15:07 +00:00
2015-01-22 18:20:46 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/bonfires/:bonfireName' ,
bonfireController . returnIndividualBonfire
2015-01-22 18:20:46 +00:00
) ;
2015-03-30 22:15:07 +00:00
2015-01-26 17:30:04 +00:00
app . get ( '/bonfire' , function ( req , res ) {
2015-04-14 19:36:02 +00:00
res . redirect ( 301 , '/playground' ) ;
2015-01-26 17:30:04 +00:00
} ) ;
2014-02-01 08:30:14 +00:00
2015-03-31 01:02:50 +00:00
app . post ( '/completed-bonfire/' , bonfireController . completedBonfire ) ;
2015-03-30 20:48:54 +00:00
/ * *
2015-04-09 00:18:51 +00:00
* Field Guide related routes
2015-03-30 20:48:54 +00:00
* /
2015-02-22 07:27:38 +00:00
2015-03-30 20:48:54 +00:00
2015-04-09 00:18:51 +00:00
app . get ( '/field-guide/:fieldGuideName' , fieldGuideController . returnIndividualFieldGuide ) ;
2015-04-05 23:44:07 +00:00
2015-04-09 00:18:51 +00:00
app . get ( '/field-guide' , fieldGuideController . returnNextFieldGuide ) ;
2015-04-05 23:44:07 +00:00
2015-04-09 00:18:51 +00:00
app . post ( '/completed-field-guide/' , fieldGuideController . completedFieldGuide ) ;
2015-02-22 07:27:38 +00:00
2015-01-24 05:44:08 +00:00
2015-02-02 07:35:27 +00:00
/ * *
* Courseware related routes
* /
2015-03-21 09:42:19 +00:00
app . get ( '/challenges/' , coursewareController . returnNextCourseware ) ;
2015-03-30 22:15:07 +00:00
2015-02-02 07:35:27 +00:00
app . get (
2015-03-21 09:42:19 +00:00
'/challenges/:coursewareName' ,
2015-02-02 07:35:27 +00:00
coursewareController . returnIndividualCourseware
) ;
2015-03-30 22:15:07 +00:00
2015-02-02 07:35:27 +00:00
app . post ( '/completed-courseware/' , coursewareController . completedCourseware ) ;
2015-03-30 22:15:07 +00:00
2015-03-29 11:39:41 +00:00
app . post ( '/completed-zipline-or-basejump' ,
coursewareController . completedZiplineOrBasejump ) ;
2015-02-02 07:35:27 +00:00
2015-01-28 01:12:51 +00:00
// Unique Check API route
app . get ( '/api/checkUniqueUsername/:username' , userController . checkUniqueUsername ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/api/checkExistingUsername/:username' , userController . checkExistingUsername ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/api/checkUniqueEmail/:email' , userController . checkUniqueEmail ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/account' , userController . getAccount ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . post ( '/account/profile' , userController . postUpdateProfile ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . post ( '/account/password' , userController . postUpdatePassword ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . post ( '/account/delete' , userController . postDeleteAccount ) ;
2015-03-30 22:15:07 +00:00
2015-01-28 01:12:51 +00:00
app . get ( '/account/unlink/:provider' , userController . getOauthUnlink ) ;
2015-03-30 22:15:07 +00:00
2015-03-06 08:20:39 +00:00
app . get ( '/sitemap.xml' , resourcesController . sitemap ) ;
2015-03-31 01:02:50 +00:00
2014-02-01 08:30:14 +00:00
/ * *
2014-06-06 18:58:30 +00:00
* OAuth sign - in routes .
2014-02-01 08:30:14 +00:00
* /
2014-12-23 21:50:14 +00:00
var passportOptions = {
2015-04-14 19:36:02 +00:00
successRedirect : '/' ,
failureRedirect : '/login'
2014-12-23 21:50:14 +00:00
} ;
2015-01-18 02:52:58 +00:00
app . get ( '/auth/twitter' , passport . authenticate ( 'twitter' ) ) ;
2015-03-30 22:15:07 +00:00
2014-11-19 23:30:36 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/twitter/callback' ,
passport . authenticate ( 'twitter' , {
successRedirect : '/' ,
failureRedirect : '/login'
} )
2014-12-23 21:50:14 +00:00
) ;
2014-11-19 23:30:36 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/linkedin' ,
passport . authenticate ( 'linkedin' , {
state : 'SOME STATE'
} )
2014-12-23 21:50:14 +00:00
) ;
2014-11-19 23:30:36 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/linkedin/callback' ,
passport . authenticate ( 'linkedin' , passportOptions )
2014-12-23 21:50:14 +00:00
) ;
2014-11-19 23:30:36 +00:00
2014-12-23 16:48:28 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/facebook' ,
passport . authenticate ( 'facebook' , { scope : [ 'email' , 'user_location' ] } )
2014-12-23 16:48:28 +00:00
) ;
app . get (
2015-04-14 19:36:02 +00:00
'/auth/facebook/callback' ,
passport . authenticate ( 'facebook' , passportOptions ) , function ( req , res ) {
res . redirect ( req . session . returnTo || '/' ) ;
}
2014-12-23 16:48:28 +00:00
) ;
2014-11-30 06:22:27 +00:00
app . get ( '/auth/github' , passport . authenticate ( 'github' ) ) ;
2015-03-30 22:15:07 +00:00
2014-12-23 16:48:28 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/github/callback' ,
passport . authenticate ( 'github' , passportOptions ) , function ( req , res ) {
res . redirect ( req . session . returnTo || '/' ) ;
}
2014-12-23 16:48:28 +00:00
) ;
2014-11-30 06:22:27 +00:00
2014-12-23 16:48:28 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/google' ,
passport . authenticate ( 'google' , { scope : 'profile email' } )
2014-12-23 16:48:28 +00:00
) ;
2015-03-30 22:15:07 +00:00
2014-12-23 16:48:28 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/auth/google/callback' ,
passport . authenticate ( 'google' , passportOptions ) , function ( req , res ) {
res . redirect ( req . session . returnTo || '/' ) ;
}
2014-12-23 16:48:28 +00:00
) ;
2014-11-30 06:22:27 +00:00
2015-03-24 15:03:59 +00:00
// put this route last
2015-01-18 02:52:58 +00:00
app . get (
2015-04-14 19:36:02 +00:00
'/:username' ,
userController . returnUser
2015-01-18 02:52:58 +00:00
) ;
2015-01-11 05:45:22 +00:00
2014-11-19 23:30:36 +00:00
/ * *
* 500 Error Handler .
* /
2015-03-24 15:03:59 +00:00
if ( process . env . NODE _ENV === 'development' ) {
app . use ( errorHandler ( { log : true } ) ) ;
} else {
// error handling in production
app . use ( function ( err , req , res , next ) {
// respect err.status
if ( err . status ) {
res . statusCode = err . status ;
}
// default status code to 500
if ( res . statusCode < 400 ) {
res . statusCode = 500 ;
}
// parse res type
var accept = accepts ( req ) ;
var type = accept . type ( 'html' , 'json' , 'text' ) ;
var message = 'opps! Something went wrong. Please try again later' ;
if ( type === 'html' ) {
req . flash ( 'errors' , { msg : message } ) ;
return res . redirect ( '/' ) ;
2015-04-14 19:36:02 +00:00
// json
2015-03-24 15:03:59 +00:00
} else if ( type === 'json' ) {
res . setHeader ( 'Content-Type' , 'application/json' ) ;
return res . send ( { message : message } ) ;
2015-04-14 19:36:02 +00:00
// plain text
2015-03-24 15:03:59 +00:00
} else {
res . setHeader ( 'Content-Type' , 'text/plain' ) ;
return res . send ( message ) ;
}
} ) ;
}
2014-11-19 23:30:36 +00:00
/ * *
* Start Express server .
* /
2015-01-16 23:58:27 +00:00
app . listen ( app . get ( 'port' ) , function ( ) {
2015-04-14 19:36:02 +00:00
console . log (
'FreeCodeCamp server listening on port %d in %s mode' ,
app . get ( 'port' ) ,
app . get ( 'env' )
) ;
2014-11-19 23:30:36 +00:00
} ) ;
module . exports = app ;