Преглед изворни кода

Merge pull request #5981 from weseek/feat/96209-defalt-config

feat: 96209 default config
Yuki Takei пре 3 година
родитељ
комит
f1b44581ab

+ 7 - 6
packages/app/src/server/middlewares/api-rate-limiter.ts

@@ -26,11 +26,12 @@ const opts = {
 const rateLimiter = new RateLimiterMongo(opts);
 const rateLimiter = new RateLimiterMongo(opts);
 
 
 // generate ApiRateLimitConfig for api rate limiter
 // generate ApiRateLimitConfig for api rate limiter
-const apiRateLimitConfigWithoutRegExp = generateApiRateLimitConfig(false);
-const apiRateLimitConfigWithRegExp = generateApiRateLimitConfig(true);
-const allRegExp = new RegExp(Object.keys(apiRateLimitConfigWithRegExp).join('|'));
-const keysWithRegExp = Object.keys(apiRateLimitConfigWithRegExp).map(key => new RegExp(key));
-const valuesWithRegExp = Object.values(apiRateLimitConfigWithRegExp);
+const apiRateLimitConfig = generateApiRateLimitConfig();
+const configWithoutRegExp = apiRateLimitConfig.withoutRegExp;
+const configWithRegExp = apiRateLimitConfig.withRegExp;
+const allRegExp = new RegExp(Object.keys(configWithRegExp).join('|'));
+const keysWithRegExp = Object.keys(configWithRegExp).map(key => new RegExp(key));
+const valuesWithRegExp = Object.values(configWithRegExp);
 
 
 const consumePoints = async(rateLimiter: RateLimiterMongo, key: string, points: number) => {
 const consumePoints = async(rateLimiter: RateLimiterMongo, key: string, points: number) => {
   const consumePoints = defaultMaxPoints / points;
   const consumePoints = defaultMaxPoints / points;
@@ -45,7 +46,7 @@ module.exports = () => {
     const key = md5(req.ip + endpoint);
     const key = md5(req.ip + endpoint);
 
 
     let customizedConfig;
     let customizedConfig;
-    const configForEndpoint = apiRateLimitConfigWithoutRegExp[endpoint];
+    const configForEndpoint = configWithoutRegExp[endpoint];
     if (configForEndpoint) {
     if (configForEndpoint) {
       customizedConfig = configForEndpoint;
       customizedConfig = configForEndpoint;
     }
     }

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

@@ -39,7 +39,7 @@ const defaultInfinityConfig: IApiRateLimitConfig = {
 };
 };
 
 
 // default config without reg exp
 // default config without reg exp
-export const defaultConfigWithoutRegExp = { ...defaultStrictConfig, ...defaultInfinityConfig };
+export const defaultConfig = { ...defaultStrictConfig, ...defaultInfinityConfig };
 
 
 // default config with reg exp
 // default config with reg exp
 export const defaultConfigWithRegExp = {
 export const defaultConfigWithRegExp = {

+ 44 - 20
packages/app/src/server/util/api-rate-limit-config/generateApiRateLimitConfig.ts

@@ -1,26 +1,23 @@
 import { IApiRateLimitConfig } from '../../interfaces/api-rate-limit-config';
 import { IApiRateLimitConfig } from '../../interfaces/api-rate-limit-config';
 
 
-import { defaultConfigWithoutRegExp, defaultConfigWithRegExp } from './defaultApiRateLimitConfig';
+import { defaultConfig, defaultConfigWithRegExp } from './defaultApiRateLimitConfig';
 
 
 const envVar = process.env;
 const envVar = process.env;
 
 
-const getTargetFromKey = (key: string, withRegExp: boolean) => {
-  // eslint-disable-next-line regex/invalid
-  const regExp = new RegExp(withRegExp ? '(?<=API_RATE_LIMIT_).*(?=_ENDPOINT_WITH_REGEXP)' : '(?<=API_RATE_LIMIT_).*(?=_ENDPOINT)');
-  return key.match(regExp);
-};
+// https://regex101.com/r/aNDjmI/1
+const regExp = /^API_RATE_LIMIT_(\w+)_ENDPOINT(_WITH_REGEXP)?$/;
 
 
-const generateApiRateLimitConfigFromEndpoint = (envVar: NodeJS.ProcessEnv, endpointKeys: string[], withRegExp: boolean): IApiRateLimitConfig => {
+const generateApiRateLimitConfigFromEndpoint = (envVar: NodeJS.ProcessEnv, targets: string[], withRegExp: boolean): IApiRateLimitConfig => {
   const apiRateLimitConfig: IApiRateLimitConfig = {};
   const apiRateLimitConfig: IApiRateLimitConfig = {};
-  endpointKeys.forEach((key) => {
+  targets.forEach((target) => {
+
+    const endpointKey = withRegExp ? `API_RATE_LIMIT_${target}_ENDPOINT_WITH_REGEXP` : `API_RATE_LIMIT_${target}_ENDPOINT`;
 
 
-    const endpoint = envVar[key];
+    const endpoint = envVar[endpointKey];
 
 
-    if (endpoint == null || Object.keys(apiRateLimitConfig).includes(endpoint)) {
+    if (endpoint == null) {
       return;
       return;
     }
     }
-
-    const target = getTargetFromKey(key, withRegExp);
     const methodKey = `API_RATE_LIMIT_${target}_METHODS`;
     const methodKey = `API_RATE_LIMIT_${target}_METHODS`;
     const maxRequestsKey = `API_RATE_LIMIT_${target}_MAX_REQUESTS`;
     const maxRequestsKey = `API_RATE_LIMIT_${target}_MAX_REQUESTS`;
     const method = envVar[methodKey] ?? 'ALL';
     const method = envVar[methodKey] ?? 'ALL';
@@ -41,20 +38,47 @@ const generateApiRateLimitConfigFromEndpoint = (envVar: NodeJS.ProcessEnv, endpo
   return apiRateLimitConfig;
   return apiRateLimitConfig;
 };
 };
 
 
-export const generateApiRateLimitConfig = (withRegExp: boolean): IApiRateLimitConfig => {
+type ApiRateLimitConfigResult = {
+  'withoutRegExp': IApiRateLimitConfig,
+  'withRegExp': IApiRateLimitConfig
+}
+
+export const generateApiRateLimitConfig = (): ApiRateLimitConfigResult => {
+
+  const apiRateConfigTargets: string[] = [];
+  const apiRateConfigTargetsWithRegExp: string[] = [];
+  Object.keys(envVar).forEach((key) => {
+    const result = key.match(regExp);
+
+    if (result == null) { return null }
 
 
-  const apiRateEndpointKeys = Object.keys(envVar).filter((key) => {
-    const target = getTargetFromKey(key, withRegExp);
-    return target;
+    const target = result[1];
+    const isWithRegExp = result[2] != null;
+
+    if (isWithRegExp) {
+      apiRateConfigTargetsWithRegExp.push(target);
+    }
+    else {
+      apiRateConfigTargets.push(target);
+    }
   });
   });
 
 
   // sort priority
   // sort priority
-  apiRateEndpointKeys.sort().reverse();
+  apiRateConfigTargets.sort();
+  apiRateConfigTargetsWithRegExp.sort();
 
 
   // get config
   // get config
-  const apiRateLimitConfig = generateApiRateLimitConfigFromEndpoint(envVar, apiRateEndpointKeys, withRegExp);
+  const apiRateLimitConfig = generateApiRateLimitConfigFromEndpoint(envVar, apiRateConfigTargets, false);
+  const apiRateLimitConfigWithRegExp = generateApiRateLimitConfigFromEndpoint(envVar, apiRateConfigTargets, true);
+
+  const config = { ...defaultConfig, ...apiRateLimitConfig };
+  const configWithRegExp = { ...defaultConfigWithRegExp, ...apiRateLimitConfigWithRegExp };
+
+  const result: ApiRateLimitConfigResult = {
+    withoutRegExp: config,
+    withRegExp: configWithRegExp,
+  };
 
 
-  const defaultConfig = withRegExp ? defaultConfigWithRegExp : defaultConfigWithoutRegExp;
 
 
-  return { ...defaultConfig, ...apiRateLimitConfig };
+  return result;
 };
 };