Explorar o código

refactor config system

yuken %!s(int64=3) %!d(string=hai) anos
pai
achega
e308d77589

+ 1 - 1
packages/app/src/server/interfaces/api-rate-limit-config.ts

@@ -1,6 +1,6 @@
 export type IApiRateLimitConfig = {
   [endpoint: string]: {
     method: string,
-    consumePoints: number
+    maxRequests: number
   }
 }

+ 11 - 5
packages/app/src/server/middlewares/api-rate-limiter.ts

@@ -9,8 +9,13 @@ import { generateApiRateLimitConfig } from '../util/generateApiRateLimitConfig';
 
 const logger = loggerFactory('growi:middleware:api-rate-limit');
 
+// config sample
+// API_RATE_LIMIT_010_FOO_ENDPOINT=/_api/v3/foo
+// API_RATE_LIMIT_010_FOO_METHODS=GET,POST
+// API_RATE_LIMIT_010_FOO_MAX_REQUESTS=10
+
 const defaultMaxPoints = 100;
-const defaultConsumePoints = 10;
+const defaultMaxRequests = 10;
 const defaultDuration = 1;
 const opts = {
   storeClient: mongoose.connection,
@@ -23,7 +28,8 @@ const rateLimiter = new RateLimiterMongo(opts);
 const apiRateLimitConfig = generateApiRateLimitConfig();
 
 const consumePoints = async(rateLimiter: RateLimiterMongo, key: string, points: number, next: NextFunction) => {
-  await rateLimiter.consume(key, points)
+  const consumePoints = defaultMaxPoints / points;
+  await rateLimiter.consume(key, consumePoints)
     .then(() => {
       next();
     })
@@ -42,16 +48,16 @@ module.exports = () => {
     const customizedConfig = apiRateLimitConfig[endpoint];
 
     if (customizedConfig === undefined) {
-      await consumePoints(rateLimiter, key, defaultConsumePoints, next);
+      await consumePoints(rateLimiter, key, defaultMaxRequests, next);
       return;
     }
 
     if (customizedConfig.method.includes(req.method) || customizedConfig.method === 'ALL') {
-      await consumePoints(rateLimiter, key, customizedConfig.consumePoints, next);
+      await consumePoints(rateLimiter, key, customizedConfig.maxRequests, next);
       return;
     }
 
-    await consumePoints(rateLimiter, key, defaultConsumePoints, next);
+    await consumePoints(rateLimiter, key, defaultMaxRequests, next);
     return;
   };
 };

+ 4 - 4
packages/app/src/server/util/generateApiRateLimitConfig.ts

@@ -16,15 +16,15 @@ const generateApiRateLimitConfigFromEndpoint = (envVar: NodeJS.ProcessEnv, endpo
 
     const target = getTargetFromKey(key);
     const method = envVar[`API_RATE_LIMIT_${target}_METHODS`] ?? 'ALL';
-    const consumePoints = Number(envVar[`API_RATE_LIMIT_${target}_CONSUME_POINTS`]);
+    const maxRequests = Number(envVar[`API_RATE_LIMIT_${target}_MAX_REQUESTS`]);
 
-    if (endpoint == null || consumePoints == null) {
+    if (endpoint == null || maxRequests == null) {
       return;
     }
 
     const config = {
       method,
-      consumePoints,
+      maxRequests,
     };
 
     apiRateLimitConfig[endpoint] = config;
@@ -51,7 +51,7 @@ export const generateApiRateLimitConfig = (): IApiRateLimitConfig => {
   // default setting e.g. healthchack
   apiRateLimitConfig['/_api/v3/healthcheck'] = {
     method: 'GET',
-    consumePoints: 0,
+    maxRequests: 0,
   };
 
   return apiRateLimitConfig;