import { Express } from 'express';
import bodyParser from 'body-parser';
import boom from 'express-boom';
import cors from 'cors';
import compression from 'compression';
import morgan from 'morgan';
import ratelimit from 'express-rate-limit';
import helmet from 'helmet';

const coreMiddlewares = [
  bodyParser.json(),
  bodyParser.urlencoded({ extended: true }),
  boom(),
  cors({ origin: '*' }),
  compression(),
  morgan('dev'),
  helmet(),
];

class Middleware {
  static registerMiddleware(app: Express): void {
    app.enable('trust proxy');
    app.disable('view cache');

    app.use(
      '/api/v1',
      // 20 requests per 10 seconds
      ratelimit({
        windowMs: 10 * 1000,
        max: 20,
      }),
    );

    coreMiddlewares.forEach((middleware) => {
      app.use(middleware);
    });
  }
}

export default Middleware;