Просмотр исходного кода

refactor rate-limiter with feature pattern

Yuki Takei 3 лет назад
Родитель
Сommit
777e01da31

+ 0 - 0
apps/app/config/rate-limiter.ts → apps/app/src/features/rate-limiter/config/index.ts


+ 1 - 0
apps/app/src/features/rate-limiter/index.ts

@@ -0,0 +1 @@
+export * from './middleware';

+ 11 - 12
apps/app/src/server/middlewares/rate-limiter.ts → apps/app/src/features/rate-limiter/middleware/factory.ts

@@ -1,16 +1,15 @@
-import { NextFunction, Request, Response } from 'express';
+import type { Handler, Request } from 'express';
 import md5 from 'md5';
-import mongoose from 'mongoose';
-import { IRateLimiterMongoOptions, RateLimiterMongo } from 'rate-limiter-flexible';
+import { connection } from 'mongoose';
+import { type IRateLimiterMongoOptions, RateLimiterMongo } from 'rate-limiter-flexible';
 
-import {
-  DEFAULT_DURATION_SEC, DEFAULT_MAX_REQUESTS, DEFAULT_USERS_PER_IP_PROSPECTION, IApiRateLimitConfig,
-} from '^/config/rate-limiter';
-
-import { IUserHasId } from '~/interfaces/user';
+import type { IUserHasId } from '~/interfaces/user';
 import loggerFactory from '~/utils/logger';
 
-import { generateApiRateLimitConfig } from '../util/rate-limiter';
+import {
+  DEFAULT_DURATION_SEC, DEFAULT_MAX_REQUESTS, DEFAULT_USERS_PER_IP_PROSPECTION, type IApiRateLimitConfig,
+} from '../config';
+import { generateApiRateLimitConfig } from '../utils/config-generator';
 
 
 const logger = loggerFactory('growi:middleware:api-rate-limit');
@@ -23,7 +22,7 @@ const logger = loggerFactory('growi:middleware:api-rate-limit');
 const POINTS_THRESHOLD = 100;
 
 const opts: IRateLimiterMongoOptions = {
-  storeClient: mongoose.connection,
+  storeClient: connection,
   points: POINTS_THRESHOLD, // set default value
   duration: DEFAULT_DURATION_SEC, // set default value
 };
@@ -87,9 +86,9 @@ const consumePointsByIp = async(method: string, key: string | null, customizedCo
 };
 
 
-module.exports = () => {
+export const middlewareFactory = (): Handler => {
 
-  return async(req: Request & { user?: IUserHasId }, res: Response, next: NextFunction) => {
+  return async(req: Request & { user?: IUserHasId }, res, next) => {
 
     const endpoint = req.path;
 

+ 1 - 0
apps/app/src/features/rate-limiter/middleware/index.ts

@@ -0,0 +1 @@
+export * from './factory';

+ 1 - 1
apps/app/src/server/util/rate-limiter.ts → apps/app/src/features/rate-limiter/utils/config-generator.ts

@@ -1,6 +1,6 @@
 import {
   defaultConfig, defaultConfigWithRegExp, IApiRateLimitEndpointMap,
-} from '^/config/rate-limiter';
+} from '../config';
 
 const envVar = process.env;
 

+ 3 - 2
apps/app/src/server/routes/index.js

@@ -1,6 +1,8 @@
 import csrf from 'csurf';
 import express from 'express';
 
+import { middlewareFactory as rateLimiterFactory } from '~/features/rate-limiter';
+
 import { generateAddActivityMiddleware } from '../middlewares/add-activity';
 import apiV1FormValidator from '../middlewares/apiv1-form-validator';
 import { generateCertifyBrandLogoMiddleware } from '../middlewares/certify-brand-logo';
@@ -32,7 +34,6 @@ module.exports = function(crowi, app) {
   const adminRequired = require('../middlewares/admin-required')(crowi);
   const certifySharedFile = require('../middlewares/certify-shared-file')(crowi);
   const certifyBrandLogo = generateCertifyBrandLogoMiddleware(crowi);
-  const rateLimiter = require('../middlewares/rate-limiter')();
   const addActivity = generateAddActivityMiddleware(crowi);
 
   const uploads = multer({ dest: `${crowi.tmpDir}uploads` });
@@ -62,7 +63,7 @@ module.exports = function(crowi, app) {
   app.use('/api-docs', require('./apiv3/docs')(crowi, app));
 
   // Rate limiter
-  app.use(rateLimiter);
+  app.use(rateLimiterFactory());
 
   // API v3 for admin
   app.use('/_api/v3', apiV3AdminRouter);