2015-05-21 11:07:40 -07:00
var R = require ( 'ramda' ) ,
2015-04-08 17:18:51 -07:00
FieldGuide = require ( './../models/FieldGuide' ) ,
2015-05-31 19:10:19 -04:00
resources = require ( './resources' ) ,
debug = require ( 'debug' ) ( 'freecc:fieldguides' ) ;
2015-04-08 17:18:51 -07:00
exports . returnIndividualFieldGuide = function ( req , res , next ) {
2015-05-21 11:07:40 -07:00
var dashedName = req . params . fieldGuideName ;
if ( req . user ) {
var completed = req . user . completedFieldGuides ;
2015-05-09 11:20:17 -07:00
2015-05-21 11:07:40 -07:00
var uncompletedFieldGuides = resources . allFieldGuideIds ( )
. filter ( function ( elem ) {
2015-05-09 23:40:28 -07:00
if ( completed . indexOf ( elem ) === - 1 ) {
return elem ;
}
} ) ;
2015-05-21 11:07:40 -07:00
req . user . uncompletedFieldGuides = uncompletedFieldGuides ;
// TODO(berks): handle callback properly
req . user . save ( ) ;
}
2015-05-09 11:20:17 -07:00
2015-05-21 11:07:40 -07:00
FieldGuide . find (
2015-05-31 19:10:19 -04:00
{ dashedName : new RegExp ( dashedName , 'i' ) } ,
2015-05-21 11:07:40 -07:00
function ( err , fieldGuideFromMongo ) {
if ( err ) {
return next ( err ) ;
}
2015-04-08 17:18:51 -07:00
2015-05-21 11:07:40 -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-04-08 17:18:51 -07:00
2015-05-21 11:07:40 -07:00
return res . redirect ( '/field-guide' ) ;
}
2015-04-08 17:18:51 -07:00
2015-05-21 11:07:40 -07:00
var fieldGuide = R . head ( fieldGuideFromMongo ) ;
2015-05-26 01:36:37 -07:00
fieldGuide . name . toLowerCase ( ) . replace ( /\s/g , '-' ) . replace ( /\?/g , '' ) ;
2015-05-21 11:07:40 -07:00
2015-05-31 19:10:19 -04:00
if ( fieldGuide . dashedName !== dashedName ) {
return res . redirect ( '../field-guide/' + fieldGuide . dashedName ) ;
2015-05-21 11:07:40 -07:00
}
res . render ( 'field-guide/show' , {
title : fieldGuide . name ,
fieldGuideId : fieldGuide . _id ,
description : fieldGuide . description . join ( '' )
} ) ;
}
) ;
2015-04-08 17:18:51 -07:00
} ;
exports . showAllFieldGuides = function ( req , res ) {
2015-05-23 18:39:30 -07:00
var allFieldGuideNamesAndIds = resources . allFieldGuideNamesAndIds ( ) ;
2015-05-21 11:07:40 -07:00
2015-05-23 18:39:30 -07:00
var completedFieldGuides = [ ] ;
2015-05-21 11:07:40 -07:00
if ( req . user && req . user . completedFieldGuides ) {
2015-05-23 18:39:30 -07:00
completedFieldGuides = req . user . completedFieldGuides ;
2015-05-21 11:07:40 -07:00
}
2015-05-23 18:39:30 -07:00
res . render ( 'field-guide/all-articles' , {
allFieldGuideNamesAndIds : allFieldGuideNamesAndIds ,
completedFieldGuides : completedFieldGuides
} ) ;
2015-04-08 17:18:51 -07:00
} ;
exports . returnNextFieldGuide = function ( req , res , next ) {
if ( ! req . user ) {
2015-05-31 19:10:19 -04:00
return res . redirect ( '/field-guide/how-do-i-use-this-guide' ) ;
2015-04-08 17:18:51 -07:00
}
2015-05-21 11:07:40 -07:00
var displayedFieldGuides =
FieldGuide . find ( { '_id' : req . user . uncompletedFieldGuides [ 0 ] } ) ;
2015-04-08 17:18:51 -07:00
displayedFieldGuides . exec ( function ( err , fieldGuide ) {
2015-05-21 11:07:40 -07:00
if ( err ) { return next ( err ) ; }
2015-04-08 17:18:51 -07:00
fieldGuide = fieldGuide . pop ( ) ;
2015-05-21 11:07:40 -07:00
2015-04-24 13:49:32 -04:00
if ( typeof fieldGuide === 'undefined' ) {
2015-05-09 11:20:17 -07:00
if ( req . user . completedFieldGuides . length > 0 ) {
req . flash ( 'success' , {
2015-05-21 11:07:40 -07:00
msg : [
2015-06-05 00:15:38 -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-05-21 11:07:40 -07:00
] . join ( '' )
2015-05-09 11:20:17 -07:00
} ) ;
}
2015-05-31 19:10:19 -04:00
return res . redirect ( '../field-guide/how-do-i-use-this-guide' ) ;
2015-04-08 17:18:51 -07:00
}
2015-05-26 01:36:37 -07:00
var nameString = fieldGuide . name . toLowerCase ( ) . replace ( /\s/g , '-' ) ;
2015-04-08 17:18:51 -07:00
return res . redirect ( '../field-guide/' + nameString ) ;
} ) ;
} ;
exports . completedFieldGuide = function ( req , res , next ) {
var fieldGuideId = req . body . fieldGuideInfo . fieldGuideId ;
req . user . completedFieldGuides . push ( fieldGuideId ) ;
var index = req . user . uncompletedFieldGuides . indexOf ( fieldGuideId ) ;
if ( index > - 1 ) {
2015-04-25 12:28:14 -04:00
req . user . progressTimestamps . push ( Date . now ( ) ) ;
2015-04-08 17:18:51 -07:00
req . user . uncompletedFieldGuides . splice ( index , 1 ) ;
}
2015-05-21 11:07:40 -07:00
req . user . save ( function ( err ) {
2015-04-08 17:18:51 -07:00
if ( err ) {
return next ( err ) ;
}
2015-05-21 11:07:40 -07:00
res . send ( true ) ;
2015-04-08 17:18:51 -07:00
} ) ;
} ;