Skip to content

Instantly share code, notes, and snippets.

@holyjak
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save holyjak/59ae7cb95c02769941e8 to your computer and use it in GitHub Desktop.
Save holyjak/59ae7cb95c02769941e8 to your computer and use it in GitHub Desktop.
var Q = require('q');
var mongoFacade = require('mongoFacade');
/** For each user in our DB, fetch her stats from Fitbit */
var getUsersWithFitbitStats = function(){
var deferredResults = Q.defer();
mongoFacade.find({}, function(err, users){ // Async fetch from DB
// Turn each user into a promise of user stats
var userStatsPromisses = users.map(function(user){
var userStatsPromise = Q.defer();
Auth.oauth.getProtectedResource(
'https://api.fitbit.com/1/user/-/activities.json',
'GET',
user.oauthAccessToken,
user.oauthAccessTokenSecret,
function (error, data, response) { // Async fetch stats from Fitbit
if (error) {
logError(error, user);
userStatsPromise.reject(error); // don't hide the failure from the caller
return;
}
var responseData = JSON.parse(data);
// Deliver the promissed data
userStatsPromise.resolve({
user: {
id: user.fitbitId,
name: user.name
},
data: responseData
});
}
);
return userStatsPromise.promise; // return an element of the new array
}); // users.map
// Wait for all of the userStats promisses to finish, filter out failures,
// return the rest as an array of user stats
//userStatsPromisses; -> deferredResults
Q.allSettled(userStatsPromisses).then(function (results) {
var fulfilled = function(r) {
return r.state === "fulfilled";
};
var getValue = function(r) {
return r.value;
};
var goodUserStats = results.filter(fulfilled).map(getValue);
deferredResults.resolve(goodUserStats);
});
}); // async mongoFacade.find
return deferredResults.promise;
};
module.exports = {
getUsersWithFitbitStats: getUsersWithFitbitStats
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment