-
-
Save SHoogland/c9a7bf9622583d78a3d3223d5c9f6e53 to your computer and use it in GitHub Desktop.
Full forecast accesstoken gathering job
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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