| 'use strict'; |
| |
| var async = require('async'); |
| var Quota = require('volos-quota-apigee'); |
| var debug = require('debug')('gateway:quota'); |
| |
| module.exports.init = function(config, logger, stats) { |
| |
| var quotas = {}; // productName -> connectMiddleware |
| |
| var options = { |
| key: function(req) { |
| return req.token.application_name; |
| } |
| }; |
| |
| Object.keys(config).forEach(function(productName) { |
| var product = config[productName]; |
| if (!product.uri && !product.key && !product.secret && !product.allow && !product.interval) { |
| // skip non-quota config |
| console.log('Not enough info for configuring quota'); |
| return; |
| } |
| |
| var quota = Quota.create(config[productName]); |
| quotas[productName] = quota.connectMiddleware().apply(options); |
| debug('created quota for', productName); |
| }); |
| |
| var middleware = function(req, res, next) { |
| |
| if (!req.token || !req.token.api_product_list || !req.token.api_product_list.length) { return next(); } |
| |
| debug('quota checking products', req.token.api_product_list); |
| |
| req.originalUrl = req.originalUrl || req.url; // emulate connect |
| |
| // this is arbitrary, but not sure there's a better way? |
| async.eachSeries(req.token.api_product_list, |
| function(productName, cb) { |
| var connectMiddleware = quotas[productName]; |
| debug('applying quota for', productName); |
| connectMiddleware ? connectMiddleware(req, res, cb) : cb(); |
| }, |
| function(err) { |
| next(err); |
| } |
| ); |
| } |
| |
| return { |
| |
| testprobe: function() { return quotas }, |
| |
| onrequest: function(req, res, next) { |
| middleware(req, res, next); |
| } |
| |
| } |
| }; |