2015-05-21 11:07:40 -07:00
var R = require ( 'ramda' ) ,
2015-06-03 16:19:23 -07:00
// Rx = require('rx'),
2015-06-05 13:25:28 -04:00
// debug = require('debug')('freecc:fieldguides'),
2015-06-03 17:14:45 -07:00
utils = require ( '../utils' ) ;
2015-04-08 17:18:51 -07:00
2015-06-03 16:19:23 -07:00
module . exports = function ( app ) {
2015-06-03 16:31:42 -07:00
var router = app . loopback . Router ( ) ;
2015-06-03 16:19:23 -07:00
var FieldGuide = app . models . FieldGuide ;
router . get ( '/field-guide/all-articles' , showAllFieldGuides ) ;
router . get ( '/field-guide/:fieldGuideName' , returnIndividualFieldGuide ) ;
router . get ( '/field-guide/' , returnNextFieldGuide ) ;
router . post ( '/completed-field-guide/' , completedFieldGuide ) ;
2015-06-03 16:31:42 -07:00
app . use ( router ) ;
2015-06-03 16:19:23 -07:00
function returnIndividualFieldGuide ( req , res , next ) {
2015-06-05 09:41:53 -04:00
var dashedNameFromQuery = req . params . fieldGuideName ;
2015-06-03 16:19:23 -07:00
if ( req . user ) {
var completed = req . user . completedFieldGuides ;
2015-06-03 17:14:45 -07:00
var uncompletedFieldGuides = utils . allFieldGuideIds ( )
2015-06-03 16:19:23 -07:00
. filter ( function ( elem ) {
if ( completed . indexOf ( elem ) === - 1 ) {
return elem ;
}
} ) ;
req . user . uncompletedFieldGuides = uncompletedFieldGuides ;
// TODO(berks): handle callback properly
req . user . save ( function ( err ) {
if ( err ) { return next ( err ) ; }
} ) ;
}
2015-06-01 16:32:54 -07:00
2015-06-05 13:25:28 -04:00
FieldGuide . find ( { where : { 'dashedName' : dashedNameFromQuery } } ,
2015-06-03 16:19:23 -07:00
function ( err , fieldGuideFromMongo ) {
if ( err ) {
return next ( err ) ;
}
2015-06-01 16:32:54 -07:00
2015-06-03 16:19:23 -07:00
if ( fieldGuideFromMongo . length < 1 ) {
req . flash ( 'errors' , {
msg : "404: We couldn't find a field guide entry with that name. " +
'Please double check the name.'
} ) ;
2015-05-09 11:20:17 -07:00
2015-06-05 09:41:53 -04:00
return res . redirect ( '/' ) ;
2015-05-09 23:40:28 -07:00
}
2015-05-09 11:20:17 -07:00
2015-06-03 16:19:23 -07:00
var fieldGuide = R . head ( fieldGuideFromMongo ) ;
fieldGuide . name . toLowerCase ( ) . replace ( /\s/g , '-' ) . replace ( /\?/g , '' ) ;
2015-04-08 17:18:51 -07:00
2015-06-05 13:25:28 -04:00
//if (fieldGuide.dashedName !== dashedNameFromQuery) {
// return res.redirect('../field-guide/' + fieldGuide.dashedName);
//}
2015-06-03 16:19:23 -07:00
res . render ( 'field-guide/show' , {
title : fieldGuide . name ,
2015-06-04 13:20:42 -07:00
fieldGuideId : fieldGuide . id ,
2015-06-03 16:19:23 -07:00
description : fieldGuide . description . join ( '' )
2015-05-21 11:07:40 -07:00
} ) ;
}
2015-06-03 16:19:23 -07:00
) ;
}
2015-04-08 17:18:51 -07:00
2015-06-03 16:19:23 -07:00
function showAllFieldGuides ( req , res ) {
2015-06-03 17:14:45 -07:00
var allFieldGuideNamesAndIds = utils . allFieldGuideNamesAndIds ( ) ;
2015-05-21 11:07:40 -07:00
2015-06-03 16:19:23 -07:00
var completedFieldGuides = [ ] ;
if ( req . user && req . user . completedFieldGuides ) {
completedFieldGuides = req . user . completedFieldGuides ;
2015-05-21 11:07:40 -07:00
}
2015-06-03 16:19:23 -07:00
res . render ( 'field-guide/all-articles' , {
allFieldGuideNamesAndIds : allFieldGuideNamesAndIds ,
completedFieldGuides : completedFieldGuides
} ) ;
2015-04-08 17:18:51 -07:00
}
2015-06-03 16:19:23 -07:00
function returnNextFieldGuide ( req , res , next ) {
if ( ! req . user ) {
return res . redirect ( '/field-guide/how-do-i-use-this-guide' ) ;
2015-04-08 17:18:51 -07:00
}
2015-06-03 16:19:23 -07:00
var displayedFieldGuides =
2015-06-04 13:20:42 -07:00
FieldGuide . find ( { 'id' : req . user . uncompletedFieldGuides [ 0 ] } ) ;
2015-06-03 16:19:23 -07:00
displayedFieldGuides . exec ( function ( err , fieldGuide ) {
if ( err ) { return next ( err ) ; }
fieldGuide = fieldGuide . pop ( ) ;
if ( typeof fieldGuide === 'undefined' ) {
if ( req . user . completedFieldGuides . length > 0 ) {
req . flash ( 'success' , {
msg : [
2015-06-09 13:48:29 -07:00
"You've read all our current Field Guide entries. If you have " ,
'ideas for other Field Guide articles, please let us know on ' ,
"<a href='https://github.com/freecodecamp/freecodecamp/issues/new?&body=Please describe your idea for a Field Guide article and include links if possible.'>GitHub</a>."
2015-06-03 16:19:23 -07:00
] . join ( '' )
} ) ;
}
return res . redirect ( '../field-guide/how-do-i-use-this-guide' ) ;
}
2015-06-09 13:48:29 -07:00
return res . redirect ( '../field-guide/' + fieldGuide . dashedName ) ;
2015-06-03 16:19:23 -07:00
} ) ;
}
2015-04-08 17:18:51 -07:00
2015-06-03 16:19:23 -07:00
function completedFieldGuide ( req , res , next ) {
var fieldGuideId = req . body . fieldGuideInfo . fieldGuideId ;
2015-04-08 17:18:51 -07:00
2015-06-03 16:19:23 -07:00
req . user . completedFieldGuides . push ( fieldGuideId ) ;
2015-04-08 17:18:51 -07:00
2015-06-03 16:19:23 -07:00
var index = req . user . uncompletedFieldGuides . indexOf ( fieldGuideId ) ;
if ( index > - 1 ) {
req . user . progressTimestamps . push ( Date . now ( ) ) ;
req . user . uncompletedFieldGuides . splice ( index , 1 ) ;
2015-04-08 17:18:51 -07:00
}
2015-06-01 16:32:54 -07:00
2015-06-03 16:19:23 -07:00
req . user . save ( function ( err ) {
if ( err ) {
return next ( err ) ;
}
res . send ( true ) ;
} ) ;
}
} ;