Skip to content
Snippets Groups Projects
Select Git revision
  • e78078b5ec62d93ab615b183deba7e9d785eb24e
  • main default protected
  • add_export_route
  • add_route_assignments
  • 4.1.0-dev
  • 4.0.0
  • 3.5.3
  • 3.5.3-dev
  • 3.5.2
  • 3.5.2-dev
  • 3.5.1
  • 3.5.1-dev
  • 3.5.0
  • 3.4.2
  • 3.4.1
  • 3.4.0
  • 3.3.0
  • 3.2.0
  • 3.1.3
  • 3.1.2
  • 3.1.1
  • 3.1.0
  • 3.0.1
  • 3.0.0
24 results

API.ts

Blame
  • Forked from Dojo Project (HES-SO) / Projects / Backend / DojoBackendAPI
    Source project has a limited visibility.
    API.ts 4.12 KiB
    import { Express }                    from 'express-serve-static-core';
    import cors                           from 'cors';
    import morganMiddleware               from '../logging/MorganMiddleware';
    import { AddressInfo }                from 'net';
    import http                           from 'http';
    import helmet                         from 'helmet';
    import express                        from 'express';
    import WorkerTask                     from '../process/WorkerTask';
    import multer                         from 'multer';
    import SessionMiddleware              from '../middlewares/SessionMiddleware';
    import Config                         from '../config/Config';
    import logger                         from '../shared/logging/WinstonLogger';
    import ParamsCallbackManager          from '../middlewares/ParamsCallbackManager';
    import ApiRoutesManager               from '../routes/ApiRoutesManager';
    import compression                    from 'compression';
    import ClientVersionCheckerMiddleware from '../middlewares/ClientVersionCheckerMiddleware';
    import swaggerUi                      from 'swagger-ui-express';
    import path                           from 'path';
    import DojoCliVersionHelper           from '../helpers/DojoCliVersionHelper';
    
    
    class API implements WorkerTask {
        private readonly backend: Express;
        private server!: http.Server;
    
        constructor() {
            this.backend = express();
    
            this.initOpenAPI();
            this.initBaseMiddlewares();
    
            this.backend.use(ClientVersionCheckerMiddleware.register());
    
            ParamsCallbackManager.registerOnBackend(this.backend);
            SessionMiddleware.registerOnBackend(this.backend);
            ApiRoutesManager.registerOnBackend(this.backend);
        }
    
        private initBaseMiddlewares() {
            this.backend.use(multer({
                                        limits: { fieldSize: 100 * 1024 * 1024 }
                                    }).none()); //Used for extract params from body with format "form-data", The none is for say that we do not wait a file in params
            this.backend.use(morganMiddleware); //Log API accesses
            this.backend.use(helmet()); //Help to secure express, https://helmetjs.github.io/
            this.backend.use(cors()); //Allow CORS requests
            this.backend.use(compression()); //Compress responses
    
            this.backend.use(async (_req, res, next) => {
                res.header('dojocli-latest-version', await DojoCliVersionHelper.getLatestVersion());
                next();
            });
        }
    
        private initOpenAPI() {
            const options = {
                customSiteTitle: 'Dojo API',
                explorer       : false,
                swaggerOptions : {
                    url: '../OpenAPI.yaml'
                }
            };
            this.backend.get('/docs/OpenAPI.yaml', (_req, res) => res.sendFile(path.resolve(__dirname + '/../../assets/OpenAPI/OpenAPI.yaml')));
            this.backend.use('/docs/swagger', swaggerUi.serveFiles(undefined, options), swaggerUi.setup(undefined, options));
            this.backend.get('/docs/redoc.html', (_req, res) => res.sendFile(path.resolve(__dirname + '/../../assets/OpenAPI/redoc.html')));
    
            this.backend.get('/docs/', (req, res) => {
                const prefix = req.url.slice(-1) === '/' ? '' : 'docs/';
                res.send(`
                    <!DOCTYPE html>
                    <html lang="en">