yodlee
Version:
Yodlee API wrapper for Node.
214 lines (173 loc) • 6.99 kB
JavaScript
// Copyright Craig Richardson. and other Contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
;
var Q = require('q'),
request = require('request');
/**
* Yodlee API driver for NodeJS
* Sets the Cobrand credentials for API calls
*
* @module Yodlee
* @constructor
*/
function Yodlee() {
if (!(this instanceof Yodlee)) {
return new Yodlee();
}
}
/**
* Use the specified Cobrand details to sign requests
* @param {object} opt Cobrand username and password
* @throws Error if options is empty
*/
Yodlee.prototype.use = function use(opt) {
if (!opt.username || !opt.password) {
throw new Error('Invalid Cobrand Credentials: Empty ' + (!(opt.username) ? 'username' : 'password'));
}
this.username = opt.username;
this.password = opt.password;
};
/**
* Retrieves app token, determined by Cobrand details.
* @private
*/
Yodlee.prototype.getAppToken = function getAppToken() {
var deferred = Q.defer();
request.post({
url: 'https://rest.developer.yodlee.com/services/srest/restserver/v1.0/authenticate/coblogin',
form: {
cobrandLogin: this.username,
cobrandPassword: this.password
}
}, function(err, response, body) {
if (err || JSON.parse(body).Error) {
deferred.reject(err || JSON.parse(body).Error[0].errorDetail);
} else {
deferred.resolve(JSON.parse(body).cobrandConversationCredentials.sessionToken);
}
});
return deferred.promise;
};
/**
* Retrieves access token for the given user
* @param {object} opt User username and password
*/
Yodlee.prototype.getAccessToken = function getAccessToken(opt) {
var deferred = Q.defer();
if (!opt.username || !opt.password) {
deferred.reject('Invalid User Credentials: Empty ' + (!(opt.username) ? 'username' : 'password'));
}
this.getAppToken().then(function(appSessionToken) {
request.post({
url: 'https://rest.developer.yodlee.com/services/srest/restserver/v1.0/authenticate/login',
form: {
login: opt.username,
password: opt.password,
cobSessionToken: appSessionToken
}
},
function(err, response, body) {
if (err || JSON.parse(body).Error) {
deferred.reject(err || JSON.parse(body).Error[0].errorDetail);
} else {
deferred.resolve(JSON.parse(body).userContext.conversationCredentials.sessionToken);
}
});
})
.catch(function(e) {
deferred.reject(e);
});
return deferred.promise;
};
/**
* Retrieves all bank accounts for the given user
* @param {string} accessToken User access token
*/
Yodlee.prototype.getAccounts = function getAccounts(accessToken) {
var deferred = Q.defer();
if (!accessToken) {
deferred.reject('Invalid Access Token: Empty Access Token!');
}
this.getAppToken().then(function(appSessionToken) {
request
.post({
url: 'https://rest.developer.yodlee.com/services/srest/restserver/v1.0/jsonsdk/SiteAccountManagement/getSiteAccounts',
form: {
'cobSessionToken': appSessionToken,
'userSessionToken': accessToken
}
},
function(err, response, body) {
if (err || JSON.parse(body).Error) {
deferred.reject(err || JSON.parse(body).Error[0].errorDetail);
} else {
deferred.resolve(body);
}
});
})
.catch(function(e) {
deferred.reject(e);
});
return deferred.promise;
};
/**
* Retrieves all bank transactions for the given user
*
* @param {string} accessToken The user access token
* @param {object} opt Optional args to call transaction
*/
Yodlee.prototype.getTransactions = function getTransactions(accessToken, opt) {
var deferred = Q.defer();
opt = opt || {};
if (!accessToken) {
deferred.reject('Invalid Access Token: Empty!');
}
this.getAppToken()
.then(function(appSessionToken) {
request
.post({
url: 'https://rest.developer.yodlee.com/services/srest/restserver/v1.0/jsonsdk/TransactionSearchService/executeUserSearchRequest',
form: {
'cobSessionToken': appSessionToken,
'userSessionToken': accessToken,
"transactionSearchRequest.containerType": opt.containerType || "All",
"transactionSearchRequest.higherFetchLimit": opt.higherFetchLimit || "500",
"transactionSearchRequest.lowerFetchLimit": opt.lowerFetchLimit || "1",
"transactionSearchRequest.resultRange.endNumber": opt.endNumber || 5,
"transactionSearchRequest.resultRange.startNumber": opt.startNumber || 1,
"transactionSearchRequest.searchFilter.currencyCode": opt.currencyCode || "USD",
"transactionSearchRequest.ignoreUserInput": opt.ignoreUserInput || "true"
}
},
function(err, response, body) {
if (err || JSON.parse(body).errorOccurred) {
deferred.reject(err || JSON.parse(body).message);
} else {
deferred.resolve(body);
}
});
})
.catch(function(e) {
deferred.reject(e);
});
return deferred.promise;
};
module.exports = Yodlee();