abacus-account-stub
Version:
Stub for an account management service.
149 lines (121 loc) • 12.6 kB
JavaScript
;
// Stub for an account management service. An account is a collection of
// organizations managed by a single billing entity. Usage is aggregated at the
// account level (in addition to organization level) to provide billing systems
// with the usage data they need for billing.
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _ = require('underscore');
var webapp = require('abacus-webapp');
var router = require('abacus-router');
var oauth = require('abacus-cfoauth');
var schemas = require('abacus-usage-schemas');
var extend = _.extend;
/* jshint noyield: true */
// Setup debug log
var debug = require('abacus-debug')('abacus-account-stub');
// Secure the routes or not
var secured = function secured() {
return process.env.SECURED === 'true' ? true : false;
};
// Create an express router
var routes = router();
// The fake test account returned by the stub
var fake = {
account_id: '1234',
organizations: ['a3d7fe4d-3cb1-4cc3-a831-ffe98e20cf27', 'b3d7fe4d-3cb1-4cc3-a831-ffe98e20cf28', 'c3d7fe4d-3cb1-4cc3-a831-ffe98e20cf29'],
pricing_country: 'USA'
};
// Retrieve and return an account
routes.get('/v1/accounts/:account_id', _regeneratorRuntime.mark(function callee$0$0(req) {
return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
debug('Retrieving account %s', req.params.account_id);
// This is a stub here so we always succeed and return our fake account
return context$1$0.abrupt('return', {
status: 200,
body: extend({}, fake, { account_id: req.params.account_id })
});
case 2:
case 'end':
return context$1$0.stop();
}
}, callee$0$0, this);
}));
// Retrieve and return the account containing the given org
routes.get('/v1/orgs/:org_id/account', _regeneratorRuntime.mark(function callee$0$0(req) {
return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
debug('Retrieving account containing org %s', req.params.org_id);
// This is a stub here so we always succeed and return our fake account
return context$1$0.abrupt('return', {
status: 200,
body: extend({}, fake, { organizations: [req.params.org_id] })
});
case 2:
case 'end':
return context$1$0.stop();
}
}, callee$0$0, this);
}));
// Load and return a resource price config
var config = function config(rid, time) {
try {
return require('./resources/' + rid);
} catch (e) {
return undefined;
}
};
// Return the resource price configuration for a particular resource id and
// effective time (allowing evolution of prices over time, where different
// versions of the price configuration will be used at different
// points in time)
routes.get('/v1/pricing/resources/:resource_id/config/:time', _regeneratorRuntime.mark(function callee$0$0(req) {
var conf;
return _regeneratorRuntime.wrap(function callee$0$0$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
debug('Retrieving resource price config %s at time %d', req.params.resource_id, req.params.time);
// This is a stub here so we just return our sample resource price
// configs
conf = config(req.params.resource_id, parseInt(req.params.time));
if (conf) {
context$1$0.next = 4;
break;
}
return context$1$0.abrupt('return', {
status: 404
});
case 4:
// Validate and return the resource price config
schemas.priceConfig.validate(conf);
return context$1$0.abrupt('return', {
status: 200,
body: require('./resources/' + req.params.resource_id)
});
case 6:
case 'end':
return context$1$0.stop();
}
}, callee$0$0, this);
}));
// Create an account info service app
var accounts = function accounts() {
// Create the Webapp
var app = webapp();
// Secure accounts, orgs, pricing and batch routes using an OAuth
// bearer access token
if (secured()) app.use(/^\/v1\/(accounts|orgs|pricing)|^\/batch$/, oauth.validator(process.env.JWTKEY, process.env.JWTALGO));
app.use(routes);
app.use(router.batch(app));
return app;
};
// Command line interface, create the app and listen
var runCLI = function runCLI() {
return accounts().listen();
};
// Export our public functions
module.exports = accounts;
module.exports.runCLI = runCLI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7OztBQU9iLElBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoQyxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDeEMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3hDLElBQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3hDLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDOztBQUVoRCxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDOzs7OztBQUt4QixJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQzs7O0FBRzdELElBQU0sT0FBTyxHQUFHLFNBQVYsT0FBTztTQUFTLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsS0FBSztDQUFBLENBQUM7OztBQUdwRSxJQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQzs7O0FBR3hCLElBQU0sSUFBSSxHQUFHO0FBQ1gsWUFBVSxFQUFFLE1BQU07QUFDbEIsZUFBYSxFQUFFLENBQ2Isc0NBQXNDLEVBQ3RDLHNDQUFzQyxFQUN0QyxzQ0FBc0MsQ0FBQztBQUN6QyxpQkFBZSxFQUFFLEtBQUs7Q0FDdkIsQ0FBQzs7O0FBR0YsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsMkJBQUUsb0JBQVcsR0FBRzs7OztBQUNuRCxhQUFLLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7OzRDQUcvQztBQUNMLGdCQUFNLEVBQUUsR0FBRztBQUNYLGNBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQzlEOzs7Ozs7O0NBQ0YsRUFBQyxDQUFDOzs7QUFHSCxNQUFNLENBQUMsR0FBRyxDQUFDLDBCQUEwQiwyQkFBRSxvQkFBVyxHQUFHOzs7O0FBQ25ELGFBQUssQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7NENBRzFEO0FBQ0wsZ0JBQU0sRUFBRSxHQUFHO0FBQ1gsY0FBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1NBQy9EOzs7Ozs7O0NBQ0YsRUFBQyxDQUFDOzs7QUFHSCxJQUFNLE1BQU0sR0FBRyxTQUFULE1BQU0sQ0FBSSxHQUFHLEVBQUUsSUFBSSxFQUFLO0FBQzVCLE1BQUk7QUFDRixXQUFPLE9BQU8sQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUM7R0FDdEMsQ0FDRCxPQUFNLENBQUMsRUFBRTtBQUNQLFdBQU8sU0FBUyxDQUFDO0dBQ2xCO0NBQ0YsQ0FBQzs7Ozs7O0FBTUYsTUFBTSxDQUFDLEdBQUcsQ0FDUixpREFBaUQsMkJBQUUsb0JBQVcsR0FBRztNQU16RCxJQUFJOzs7O0FBTFYsYUFBSyxDQUFDLGdEQUFnRCxFQUNwRCxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7O0FBSXJDLFlBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O1lBQ2xFLElBQUk7Ozs7OzRDQUNDO0FBQ0wsZ0JBQU0sRUFBRSxHQUFHO1NBQ1o7Ozs7O0FBR0gsZUFBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7NENBQzVCO0FBQ0wsZ0JBQU0sRUFBRSxHQUFHO0FBQ1gsY0FBSSxFQUFFLE9BQU8sQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7U0FDdkQ7Ozs7Ozs7Q0FDRixFQUFDLENBQUM7OztBQUdMLElBQU0sUUFBUSxHQUFHLFNBQVgsUUFBUSxHQUFTOztBQUVyQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7OztBQUlyQixNQUFJLE9BQU8sRUFBRSxFQUNYLEdBQUcsQ0FBQyxHQUFHLENBQUMsMENBQTBDLEVBQ2hELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOztBQUU5RCxLQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hCLEtBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFNBQU8sR0FBRyxDQUFDO0NBQ1osQ0FBQzs7O0FBR0YsSUFBTSxNQUFNLEdBQUcsU0FBVCxNQUFNO1NBQVMsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFO0NBQUEsQ0FBQzs7O0FBR3pDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gU3R1YiBmb3IgYW4gYWNjb3VudCBtYW5hZ2VtZW50IHNlcnZpY2UuIEFuIGFjY291bnQgaXMgYSBjb2xsZWN0aW9uIG9mXG4vLyBvcmdhbml6YXRpb25zIG1hbmFnZWQgYnkgYSBzaW5nbGUgYmlsbGluZyBlbnRpdHkuIFVzYWdlIGlzIGFnZ3JlZ2F0ZWQgYXQgdGhlXG4vLyBhY2NvdW50IGxldmVsIChpbiBhZGRpdGlvbiB0byBvcmdhbml6YXRpb24gbGV2ZWwpIHRvIHByb3ZpZGUgYmlsbGluZyBzeXN0ZW1zXG4vLyB3aXRoIHRoZSB1c2FnZSBkYXRhIHRoZXkgbmVlZCBmb3IgYmlsbGluZy5cblxuY29uc3QgXyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKTtcbmNvbnN0IHdlYmFwcCA9IHJlcXVpcmUoJ2FiYWN1cy13ZWJhcHAnKTtcbmNvbnN0IHJvdXRlciA9IHJlcXVpcmUoJ2FiYWN1cy1yb3V0ZXInKTtcbmNvbnN0IG9hdXRoID0gcmVxdWlyZSgnYWJhY3VzLWNmb2F1dGgnKTtcbmNvbnN0IHNjaGVtYXMgPSByZXF1aXJlKCdhYmFjdXMtdXNhZ2Utc2NoZW1hcycpO1xuXG5jb25zdCBleHRlbmQgPSBfLmV4dGVuZDtcblxuLyoganNoaW50IG5veWllbGQ6IHRydWUgKi9cblxuLy8gU2V0dXAgZGVidWcgbG9nXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2FiYWN1cy1kZWJ1ZycpKCdhYmFjdXMtYWNjb3VudC1zdHViJyk7XG5cbi8vIFNlY3VyZSB0aGUgcm91dGVzIG9yIG5vdFxuY29uc3Qgc2VjdXJlZCA9ICgpID0+IHByb2Nlc3MuZW52LlNFQ1VSRUQgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcblxuLy8gQ3JlYXRlIGFuIGV4cHJlc3Mgcm91dGVyXG5jb25zdCByb3V0ZXMgPSByb3V0ZXIoKTtcblxuLy8gVGhlIGZha2UgdGVzdCBhY2NvdW50IHJldHVybmVkIGJ5IHRoZSBzdHViXG5jb25zdCBmYWtlID0ge1xuICBhY2NvdW50X2lkOiAnMTIzNCcsXG4gIG9yZ2FuaXphdGlvbnM6IFtcbiAgICAnYTNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI3JyxcbiAgICAnYjNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI4JyxcbiAgICAnYzNkN2ZlNGQtM2NiMS00Y2MzLWE4MzEtZmZlOThlMjBjZjI5J10sXG4gIHByaWNpbmdfY291bnRyeTogJ1VTQSdcbn07XG5cbi8vIFJldHJpZXZlIGFuZCByZXR1cm4gYW4gYWNjb3VudFxucm91dGVzLmdldCgnL3YxL2FjY291bnRzLzphY2NvdW50X2lkJywgZnVuY3Rpb24gKihyZXEpIHtcbiAgZGVidWcoJ1JldHJpZXZpbmcgYWNjb3VudCAlcycsIHJlcS5wYXJhbXMuYWNjb3VudF9pZCk7XG5cbiAgLy8gVGhpcyBpcyBhIHN0dWIgaGVyZSBzbyB3ZSBhbHdheXMgc3VjY2VlZCBhbmQgcmV0dXJuIG91ciBmYWtlIGFjY291bnRcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IDIwMCxcbiAgICBib2R5OiBleHRlbmQoe30sIGZha2UsIHsgYWNjb3VudF9pZDogcmVxLnBhcmFtcy5hY2NvdW50X2lkIH0pXG4gIH07XG59KTtcblxuLy8gUmV0cmlldmUgYW5kIHJldHVybiB0aGUgYWNjb3VudCBjb250YWluaW5nIHRoZSBnaXZlbiBvcmdcbnJvdXRlcy5nZXQoJy92MS9vcmdzLzpvcmdfaWQvYWNjb3VudCcsIGZ1bmN0aW9uICoocmVxKSB7XG4gIGRlYnVnKCdSZXRyaWV2aW5nIGFjY291bnQgY29udGFpbmluZyBvcmcgJXMnLCByZXEucGFyYW1zLm9yZ19pZCk7XG5cbiAgLy8gVGhpcyBpcyBhIHN0dWIgaGVyZSBzbyB3ZSBhbHdheXMgc3VjY2VlZCBhbmQgcmV0dXJuIG91ciBmYWtlIGFjY291bnRcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IDIwMCxcbiAgICBib2R5OiBleHRlbmQoe30sIGZha2UsIHsgb3JnYW5pemF0aW9uczogW3JlcS5wYXJhbXMub3JnX2lkXSB9KVxuICB9O1xufSk7XG5cbi8vIExvYWQgYW5kIHJldHVybiBhIHJlc291cmNlIHByaWNlIGNvbmZpZ1xuY29uc3QgY29uZmlnID0gKHJpZCwgdGltZSkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCcuL3Jlc291cmNlcy8nICsgcmlkKTtcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcblxuLy8gUmV0dXJuIHRoZSByZXNvdXJjZSBwcmljZSBjb25maWd1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgaWQgYW5kXG4vLyBlZmZlY3RpdmUgdGltZSAoYWxsb3dpbmcgZXZvbHV0aW9uIG9mIHByaWNlcyBvdmVyIHRpbWUsIHdoZXJlIGRpZmZlcmVudFxuLy8gdmVyc2lvbnMgb2YgdGhlIHByaWNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkIGF0IGRpZmZlcmVudFxuLy8gcG9pbnRzIGluIHRpbWUpXG5yb3V0ZXMuZ2V0KFxuICAnL3YxL3ByaWNpbmcvcmVzb3VyY2VzLzpyZXNvdXJjZV9pZC9jb25maWcvOnRpbWUnLCBmdW5jdGlvbiAqKHJlcSkge1xuICAgIGRlYnVnKCdSZXRyaWV2aW5nIHJlc291cmNlIHByaWNlIGNvbmZpZyAlcyBhdCB0aW1lICVkJyxcbiAgICAgIHJlcS5wYXJhbXMucmVzb3VyY2VfaWQsIHJlcS5wYXJhbXMudGltZSk7XG5cbiAgICAvLyBUaGlzIGlzIGEgc3R1YiBoZXJlIHNvIHdlIGp1c3QgcmV0dXJuIG91ciBzYW1wbGUgcmVzb3VyY2UgcHJpY2VcbiAgICAvLyBjb25maWdzXG4gICAgY29uc3QgY29uZiA9IGNvbmZpZyhyZXEucGFyYW1zLnJlc291cmNlX2lkLCBwYXJzZUludChyZXEucGFyYW1zLnRpbWUpKTtcbiAgICBpZighY29uZilcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogNDA0XG4gICAgICB9O1xuXG4gICAgLy8gVmFsaWRhdGUgYW5kIHJldHVybiB0aGUgcmVzb3VyY2UgcHJpY2UgY29uZmlnXG4gICAgc2NoZW1hcy5wcmljZUNvbmZpZy52YWxpZGF0ZShjb25mKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICBib2R5OiByZXF1aXJlKCcuL3Jlc291cmNlcy8nICsgcmVxLnBhcmFtcy5yZXNvdXJjZV9pZClcbiAgICB9O1xuICB9KTtcblxuLy8gQ3JlYXRlIGFuIGFjY291bnQgaW5mbyBzZXJ2aWNlIGFwcFxuY29uc3QgYWNjb3VudHMgPSAoKSA9PiB7XG4gIC8vIENyZWF0ZSB0aGUgV2ViYXBwXG4gIGNvbnN0IGFwcCA9IHdlYmFwcCgpO1xuXG4gIC8vIFNlY3VyZSBhY2NvdW50cywgb3JncywgcHJpY2luZyBhbmQgYmF0Y2ggcm91dGVzIHVzaW5nIGFuIE9BdXRoXG4gIC8vIGJlYXJlciBhY2Nlc3MgdG9rZW5cbiAgaWYgKHNlY3VyZWQoKSlcbiAgICBhcHAudXNlKC9eXFwvdjFcXC8oYWNjb3VudHN8b3Jnc3xwcmljaW5nKXxeXFwvYmF0Y2gkLyxcbiAgICAgIG9hdXRoLnZhbGlkYXRvcihwcm9jZXNzLmVudi5KV1RLRVksIHByb2Nlc3MuZW52LkpXVEFMR08pKTtcblxuICBhcHAudXNlKHJvdXRlcyk7XG4gIGFwcC51c2Uocm91dGVyLmJhdGNoKGFwcCkpO1xuICByZXR1cm4gYXBwO1xufTtcblxuLy8gQ29tbWFuZCBsaW5lIGludGVyZmFjZSwgY3JlYXRlIHRoZSBhcHAgYW5kIGxpc3RlblxuY29uc3QgcnVuQ0xJID0gKCkgPT4gYWNjb3VudHMoKS5saXN0ZW4oKTtcblxuLy8gRXhwb3J0IG91ciBwdWJsaWMgZnVuY3Rpb25zXG5tb2R1bGUuZXhwb3J0cyA9IGFjY291bnRzO1xubW9kdWxlLmV4cG9ydHMucnVuQ0xJID0gcnVuQ0xJO1xuIl19