Skip to content

Instantly share code, notes, and snippets.

@SHoogland
Created March 3, 2017 12:53
Show Gist options
  • Save SHoogland/c9a7bf9622583d78a3d3223d5c9f6e53 to your computer and use it in GitHub Desktop.
Save SHoogland/c9a7bf9622583d78a3d3223d5c9f6e53 to your computer and use it in GitHub Desktop.
Full forecast accesstoken gathering job
/*
* Main Hourly Job
*/
let cheerio = require('cheerio');
let npmRequest = require('request');
let Setting = Parse.Object.extend('Setting');
var elapsed_time = function(startTime) {
var precision = 3; // 3 decimal places
var elapsed = process.hrtime(startTime)[1] / 1000000; // divide by a million to get nano to milli
var elapsedTime = process.hrtime(startTime)[0] + ' s, ' + elapsed.toFixed(precision) + ' ms'; // print message + time
return elapsedTime;
};
module.exports = {
run: function run(request, status) {
var email = 'email@email.nl';
var password = 'password';
let myAccountId = '123456';
let authenticityToken;
var j = npmRequest.jar();
var forecastUrl,
accountId,
accessToken;
var start = process.hrtime();
status.message('ForecastJob started');
console.info('ForecastJob started');
var promise = Parse.Promise.as();
promise = promise.then(() => {
var promise1 = new Parse.Promise();
var options = {
jar: j,
method: 'GET',
url: 'https://id.getharvest.com/sessions/new'
}
npmRequest(options, (error, response, body) => {
let $ = cheerio.load(body);
authenticityToken = $('body form input[name=authenticity_token]').attr('value');
promise1.resolve();
});
return promise1;
}).then(() => {
var promise2 = new Parse.Promise();
var options = {
jar: j,
method: 'POST',
url: 'https://id.getharvest.com/sessions',
formData: {
authenticity_token: authenticityToken,
email: email,
password: password
},
followAllRedirects: true
};
npmRequest(options, (error, response, body) => {
promise2.resolve();
});
return promise2;
}).then(() => {
var promise3 = new Parse.Promise();
var options = {
jar: j,
method: 'GET',
url: 'https://id.getharvest.com/accounts/' + myAccountId,
followRedirect: false
};
npmRequest(options, (error, response, body) => {
var regex = /https:\/\/forecastapp.com\/(.*)\/access_token\/(.*)\?/;
var m = regex.exec(response.headers.location);
accountId = m[1];
accessToken = m[2];
promise3.resolve();
});
return promise3;
}).then(() => {
var settingQuery = new Parse.Query('Setting');
settingQuery.equalTo('accountId', accountId);
return settingQuery.first();
}).then((setting) => {
if (!setting) {
setting = new Setting();
}
setting.set('accountId', accountId);
setting.set('accessToken', accessToken);
return setting.save();
}).then(() => {
var jobTookTime = elapsed_time(start);
console.info('ForecastJob completed in ' + jobTookTime);
status.success('ForecastJob completed in ' + jobTookTime);
}, (error) => {
console.error(error);
});
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment