abacus-account-stub
Version:
Stub for an account management service.
155 lines (127 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 _ = require('underscore');
var webapp = require('abacus-webapp');
var router = require('abacus-router');
var oauth = require('abacus-oauth');
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(req) {
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.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.abrupt('return', {
status: 200,
body: extend({}, fake, { account_id: req.params.account_id })
});
case 2:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
// Retrieve and return the account containing the given org
routes.get('/v1/orgs/:org_id/account', regeneratorRuntime.mark(function _callee2(req) {
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.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 _context2.abrupt('return', {
status: 200,
body: extend({}, fake, { organizations: [req.params.org_id] })
});
case 2:
case 'end':
return _context2.stop();
}
}
}, _callee2, 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 _callee3(req) {
var conf;
return regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.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) {
_context3.next = 4;
break;
}
return _context3.abrupt('return', {
status: 404
});
case 4:
// Validate and return the resource price config
schemas.priceConfig.validate(conf);
return _context3.abrupt('return', {
status: 200,
body: require('./resources/' + req.params.resource_id)
});
case 6:
case 'end':
return _context3.stop();
}
}
}, _callee3, 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,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OzRDQUM1QjtBQUNMLGtCQUFNLEVBQUUsR0FBRztBQUNYLGdCQUFJLEVBQUUsT0FBTyxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztXQUN2RDs7Ozs7Ozs7Q0FDRixFQUFDOzs7QUFBQyxBQUdMLElBQU0sUUFBUSxHQUFHLFNBQVgsUUFBUSxHQUFTOztBQUVyQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUU7Ozs7QUFBQyxBQUlyQixNQUFJLE9BQU8sRUFBRSxFQUNYLEdBQUcsQ0FBQyxHQUFHLENBQUMsMENBQTBDLEVBQ2hELEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOztBQUU5RCxLQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hCLEtBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztBQUUzQixTQUFPLEdBQUcsQ0FBQztDQUNaOzs7QUFBQyxBQUdGLElBQU0sTUFBTSxHQUFHLFNBQVQsTUFBTTtTQUFTLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRTtDQUFBOzs7QUFBQyxBQUd6QyxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFN0dWIgZm9yIGFuIGFjY291bnQgbWFuYWdlbWVudCBzZXJ2aWNlLiBBbiBhY2NvdW50IGlzIGEgY29sbGVjdGlvbiBvZlxuLy8gb3JnYW5pemF0aW9ucyBtYW5hZ2VkIGJ5IGEgc2luZ2xlIGJpbGxpbmcgZW50aXR5LiBVc2FnZSBpcyBhZ2dyZWdhdGVkIGF0IHRoZVxuLy8gYWNjb3VudCBsZXZlbCAoaW4gYWRkaXRpb24gdG8gb3JnYW5pemF0aW9uIGxldmVsKSB0byBwcm92aWRlIGJpbGxpbmcgc3lzdGVtc1xuLy8gd2l0aCB0aGUgdXNhZ2UgZGF0YSB0aGV5IG5lZWQgZm9yIGJpbGxpbmcuXG5cbmNvbnN0IF8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJyk7XG5jb25zdCB3ZWJhcHAgPSByZXF1aXJlKCdhYmFjdXMtd2ViYXBwJyk7XG5jb25zdCByb3V0ZXIgPSByZXF1aXJlKCdhYmFjdXMtcm91dGVyJyk7XG5jb25zdCBvYXV0aCA9IHJlcXVpcmUoJ2FiYWN1cy1vYXV0aCcpO1xuY29uc3Qgc2NoZW1hcyA9IHJlcXVpcmUoJ2FiYWN1cy11c2FnZS1zY2hlbWFzJyk7XG5cbmNvbnN0IGV4dGVuZCA9IF8uZXh0ZW5kO1xuXG4vKiBqc2hpbnQgbm95aWVsZDogdHJ1ZSAqL1xuXG4vLyBTZXR1cCBkZWJ1ZyBsb2dcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnYWJhY3VzLWRlYnVnJykoJ2FiYWN1cy1hY2NvdW50LXN0dWInKTtcblxuLy8gU2VjdXJlIHRoZSByb3V0ZXMgb3Igbm90XG5jb25zdCBzZWN1cmVkID0gKCkgPT4gcHJvY2Vzcy5lbnYuU0VDVVJFRCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuXG4vLyBDcmVhdGUgYW4gZXhwcmVzcyByb3V0ZXJcbmNvbnN0IHJvdXRlcyA9IHJvdXRlcigpO1xuXG4vLyBUaGUgZmFrZSB0ZXN0IGFjY291bnQgcmV0dXJuZWQgYnkgdGhlIHN0dWJcbmNvbnN0IGZha2UgPSB7XG4gIGFjY291bnRfaWQ6ICcxMjM0JyxcbiAgb3JnYW5pemF0aW9uczogW1xuICAgICdhM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjcnLFxuICAgICdiM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjgnLFxuICAgICdjM2Q3ZmU0ZC0zY2IxLTRjYzMtYTgzMS1mZmU5OGUyMGNmMjknXSxcbiAgcHJpY2luZ19jb3VudHJ5OiAnVVNBJ1xufTtcblxuLy8gUmV0cmlldmUgYW5kIHJldHVybiBhbiBhY2NvdW50XG5yb3V0ZXMuZ2V0KCcvdjEvYWNjb3VudHMvOmFjY291bnRfaWQnLCBmdW5jdGlvbiAqKHJlcSkge1xuICBkZWJ1ZygnUmV0cmlldmluZyBhY2NvdW50ICVzJywgcmVxLnBhcmFtcy5hY2NvdW50X2lkKTtcblxuICAvLyBUaGlzIGlzIGEgc3R1YiBoZXJlIHNvIHdlIGFsd2F5cyBzdWNjZWVkIGFuZCByZXR1cm4gb3VyIGZha2UgYWNjb3VudFxuICByZXR1cm4ge1xuICAgIHN0YXR1czogMjAwLFxuICAgIGJvZHk6IGV4dGVuZCh7fSwgZmFrZSwgeyBhY2NvdW50X2lkOiByZXEucGFyYW1zLmFjY291bnRfaWQgfSlcbiAgfTtcbn0pO1xuXG4vLyBSZXRyaWV2ZSBhbmQgcmV0dXJuIHRoZSBhY2NvdW50IGNvbnRhaW5pbmcgdGhlIGdpdmVuIG9yZ1xucm91dGVzLmdldCgnL3YxL29yZ3MvOm9yZ19pZC9hY2NvdW50JywgZnVuY3Rpb24gKihyZXEpIHtcbiAgZGVidWcoJ1JldHJpZXZpbmcgYWNjb3VudCBjb250YWluaW5nIG9yZyAlcycsIHJlcS5wYXJhbXMub3JnX2lkKTtcblxuICAvLyBUaGlzIGlzIGEgc3R1YiBoZXJlIHNvIHdlIGFsd2F5cyBzdWNjZWVkIGFuZCByZXR1cm4gb3VyIGZha2UgYWNjb3VudFxuICByZXR1cm4ge1xuICAgIHN0YXR1czogMjAwLFxuICAgIGJvZHk6IGV4dGVuZCh7fSwgZmFrZSwgeyBvcmdhbml6YXRpb25zOiBbcmVxLnBhcmFtcy5vcmdfaWRdIH0pXG4gIH07XG59KTtcblxuLy8gTG9hZCBhbmQgcmV0dXJuIGEgcmVzb3VyY2UgcHJpY2UgY29uZmlnXG5jb25zdCBjb25maWcgPSAocmlkLCB0aW1lKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJy4vcmVzb3VyY2VzLycgKyByaWQpO1xuICB9XG4gIGNhdGNoKGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vLyBSZXR1cm4gdGhlIHJlc291cmNlIHByaWNlIGNvbmZpZ3VyYXRpb24gZm9yIGEgcGFydGljdWxhciByZXNvdXJjZSBpZCBhbmRcbi8vIGVmZmVjdGl2ZSB0aW1lIChhbGxvd2luZyBldm9sdXRpb24gb2YgcHJpY2VzIG92ZXIgdGltZSwgd2hlcmUgZGlmZmVyZW50XG4vLyB2ZXJzaW9ucyBvZiB0aGUgcHJpY2UgY29uZmlndXJhdGlvbiB3aWxsIGJlIHVzZWQgYXQgZGlmZmVyZW50XG4vLyBwb2ludHMgaW4gdGltZSlcbnJvdXRlcy5nZXQoXG4gICcvdjEvcHJpY2luZy9yZXNvdXJjZXMvOnJlc291cmNlX2lkL2NvbmZpZy86dGltZScsIGZ1bmN0aW9uICoocmVxKSB7XG4gICAgZGVidWcoJ1JldHJpZXZpbmcgcmVzb3VyY2UgcHJpY2UgY29uZmlnICVzIGF0IHRpbWUgJWQnLFxuICAgICAgcmVxLnBhcmFtcy5yZXNvdXJjZV9pZCwgcmVxLnBhcmFtcy50aW1lKTtcblxuICAgIC8vIFRoaXMgaXMgYSBzdHViIGhlcmUgc28gd2UganVzdCByZXR1cm4gb3VyIHNhbXBsZSByZXNvdXJjZSBwcmljZVxuICAgIC8vIGNvbmZpZ3NcbiAgICBjb25zdCBjb25mID0gY29uZmlnKHJlcS5wYXJhbXMucmVzb3VyY2VfaWQsIHBhcnNlSW50KHJlcS5wYXJhbXMudGltZSkpO1xuICAgIGlmKCFjb25mKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiA0MDRcbiAgICAgIH07XG5cbiAgICAvLyBWYWxpZGF0ZSBhbmQgcmV0dXJuIHRoZSByZXNvdXJjZSBwcmljZSBjb25maWdcbiAgICBzY2hlbWFzLnByaWNlQ29uZmlnLnZhbGlkYXRlKGNvbmYpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IDIwMCxcbiAgICAgIGJvZHk6IHJlcXVpcmUoJy4vcmVzb3VyY2VzLycgKyByZXEucGFyYW1zLnJlc291cmNlX2lkKVxuICAgIH07XG4gIH0pO1xuXG4vLyBDcmVhdGUgYW4gYWNjb3VudCBpbmZvIHNlcnZpY2UgYXBwXG5jb25zdCBhY2NvdW50cyA9ICgpID0+IHtcbiAgLy8gQ3JlYXRlIHRoZSBXZWJhcHBcbiAgY29uc3QgYXBwID0gd2ViYXBwKCk7XG5cbiAgLy8gU2VjdXJlIGFjY291bnRzLCBvcmdzLCBwcmljaW5nIGFuZCBiYXRjaCByb3V0ZXMgdXNpbmcgYW4gT0F1dGhcbiAgLy8gYmVhcmVyIGFjY2VzcyB0b2tlblxuICBpZiAoc2VjdXJlZCgpKVxuICAgIGFwcC51c2UoL15cXC92MVxcLyhhY2NvdW50c3xvcmdzfHByaWNpbmcpfF5cXC9iYXRjaCQvLFxuICAgICAgb2F1dGgudmFsaWRhdG9yKHByb2Nlc3MuZW52LkpXVEtFWSwgcHJvY2Vzcy5lbnYuSldUQUxHTykpO1xuXG4gIGFwcC51c2Uocm91dGVzKTtcbiAgYXBwLnVzZShyb3V0ZXIuYmF0Y2goYXBwKSk7XG5cbiAgcmV0dXJuIGFwcDtcbn07XG5cbi8vIENvbW1hbmQgbGluZSBpbnRlcmZhY2UsIGNyZWF0ZSB0aGUgYXBwIGFuZCBsaXN0ZW5cbmNvbnN0IHJ1bkNMSSA9ICgpID0+IGFjY291bnRzKCkubGlzdGVuKCk7XG5cbi8vIEV4cG9ydCBvdXIgcHVibGljIGZ1bmN0aW9uc1xubW9kdWxlLmV4cG9ydHMgPSBhY2NvdW50cztcbm1vZHVsZS5leHBvcnRzLnJ1bkNMSSA9IHJ1bkNMSTtcbiJdfQ==