From fb04a022aee31a13652495ac736eb708a8bd4c84 Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Tue, 23 Jun 2015 16:22:07 -0700 Subject: [PATCH] refactor rxify fieldguides --- server/boot/fieldGuide.js | 180 +++++++++++++++++++++----------------- server/utils/rx.js | 1 - 2 files changed, 98 insertions(+), 83 deletions(-) diff --git a/server/boot/fieldGuide.js b/server/boot/fieldGuide.js index ad142e8336..87fcdd0e69 100644 --- a/server/boot/fieldGuide.js +++ b/server/boot/fieldGuide.js @@ -1,11 +1,16 @@ -var R = require('ramda'), -// Rx = require('rx'), - debug = require('debug')('freecc:fieldguides'), - utils = require('../utils'); +var Rx = require('rx'); +var debug = require('debug')('freecc:fieldguides'); +var observeMethod = require('../utils/rx').observeMethod; +var saveUser = require('../utils/rx').saveUser; +var utils = require('../utils'); + +var allFieldGuideNamesAndIds = utils.allFieldGuideNamesAndIds(); module.exports = function(app) { var router = app.loopback.Router(); var FieldGuide = app.models.FieldGuide; + var findFieldGuideById = observeMethod(FieldGuide, 'findById'); + var findOneFieldGuide = observeMethod(FieldGuide, 'findOne'); router.get('/field-guide/all-articles', showAllFieldGuides); router.get('/field-guide/:fieldGuideName', returnIndividualFieldGuide); @@ -15,60 +20,66 @@ module.exports = function(app) { app.use(router); function returnIndividualFieldGuide(req, res, next) { - var dashedNameFromQuery = req.params.fieldGuideName; - if (req.user) { - var completed = req.user.completedFieldGuides; + var dashedName = req.params.fieldGuideName; + var userSave = Rx.Observable.just(req.user) + .filter(function(user) { + return !!user; + }) + .map(function(user) { + var completed = user.completedFieldGuides; - var uncompletedFieldGuides = utils.allFieldGuideIds() - .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); } - }); - } - - FieldGuide.find({ where: {'dashedName': dashedNameFromQuery}}, - function(err, fieldGuideFromMongo) { - if (err) { - return next(err); - } - - 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.' + var uncompletedFieldGuides = utils.allFieldGuideIds() + .filter(function(id) { + if (completed.indexOf(id) === -1) { + return id; + } }); + user.uncompletedFieldGuides = uncompletedFieldGuides; + return user; + }) + .flatMap(function(user) { + return saveUser(user); + }); - return res.redirect('/'); - } + var query = { where: { dashedName: { like: dashedName, options: 'i' } } }; - var fieldGuide = R.head(fieldGuideFromMongo); - fieldGuide.name.toLowerCase().replace(/\s/g, '-').replace(/\?/g, ''); + debug('find fieldGuide', query); + Rx.Observable.combineLatest( + // find that field guide + findOneFieldGuide(query), + userSave, + Rx.helpers.identity + ) + .subscribe( + // don't care about return from userSave + function(fieldGuide) { + if (!fieldGuide) { + 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/all-articles'); + } - // if (fieldGuide.dashedName !== dashedNameFromQuery) { - // return res.redirect('../field-guide/' + fieldGuide.dashedName); - // } - res.render('field-guide/show', { - title: fieldGuide.name, - fieldGuideId: fieldGuide.id, - description: fieldGuide.description.join('') - }); - } + if (fieldGuide.dashedName !== dashedName) { + return res.redirect('../field-guide/' + fieldGuide.dashedName); + } + res.render('field-guide/show', { + title: fieldGuide.name, + fieldGuideId: fieldGuide.id, + description: fieldGuide.description.join('') + }); + }, + next ); } function showAllFieldGuides(req, res) { - var allFieldGuideNamesAndIds = utils.allFieldGuideNamesAndIds(); - var completedFieldGuides = []; if (req.user && req.user.completedFieldGuides) { completedFieldGuides = req.user.completedFieldGuides; } + res.render('field-guide/all-articles', { allFieldGuideNamesAndIds: allFieldGuideNamesAndIds, completedFieldGuides: completedFieldGuides @@ -76,16 +87,19 @@ module.exports = function(app) { } function showCompletedFieldGuideFunction(req, res) { - req.flash('success', { - msg: [ - 'You\'ve read all our current Field Guide entries. ' + - 'If you have ideas for other Field Guide articles, ' + - 'please let us know on ', - 'GitHub.' - ].join('') - }); + req.flash( + 'success', + { + msg: [ + 'You\'ve read all our current Field Guide entries. ' + + 'If you have ideas for other Field Guide articles, ' + + 'please let us know on ', + 'GitHub.' + ].join('') + } + ); return res.redirect('../field-guide/how-do-i-use-this-guide'); } @@ -95,38 +109,40 @@ module.exports = function(app) { } if (!req.user.uncompletedFieldGuides.length) { - return showCompletedFieldGuideFunction(req, res, next); + return showCompletedFieldGuideFunction(req, res); } - FieldGuide.findById(req.user.uncompletedFieldGuides[0], - function(err, fieldGuide) { - - if (err) { return next(err); } + findFieldGuideById(req.user.uncompletedFieldGuides[0]).subscribe( + function(fieldGuide) { if (!fieldGuide) { - debug('bad juju in field guide %s', - req.user.uncompletedFieldGuides[0]); + debug( + 'field guide %s not found', + req.user.uncompletedFieldGuides[0] + ); return res.redirect('../field-guide/how-do-i-use-this-guide'); } return res.redirect('../field-guide/' + fieldGuide.dashedName); - }); + }, + next + ); + } + + function completedFieldGuide(req, res, next) { + 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()); + req.user.uncompletedFieldGuides.splice(index, 1); + } + + saveUser(req.user).subscribe( + function() { + res.send(true); + }, + next + ); } }; - -function completedFieldGuide(req, res, next) { - 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()); - req.user.uncompletedFieldGuides.splice(index, 1); - } - - req.user.save(function (err) { - if (err) { - return next(err); - } - res.send(true); - }); -} diff --git a/server/utils/rx.js b/server/utils/rx.js index 5bc8a36382..7e98aa486b 100644 --- a/server/utils/rx.js +++ b/server/utils/rx.js @@ -1,6 +1,5 @@ var Rx = require('rx'); var debug = require('debug')('freecc:rxUtils'); -var slice = Array.prototype.slice; exports.saveUser = function saveUser(user) { return new Rx.Observable.create(function(observer) {