Spaces:
Sleeping
Sleeping
| ; | |
| Object.defineProperty(exports, "__esModule", { value: true }); | |
| exports.RoutesResolver = void 0; | |
| const common_1 = require("@nestjs/common"); | |
| const constants_1 = require("@nestjs/common/constants"); | |
| const logger_service_1 = require("@nestjs/common/services/logger.service"); | |
| const messages_1 = require("../helpers/messages"); | |
| const metadata_scanner_1 = require("../metadata-scanner"); | |
| const route_path_factory_1 = require("./route-path-factory"); | |
| const router_exception_filters_1 = require("./router-exception-filters"); | |
| const router_explorer_1 = require("./router-explorer"); | |
| const router_proxy_1 = require("./router-proxy"); | |
| class RoutesResolver { | |
| constructor(container, applicationConfig, injector, graphInspector) { | |
| this.container = container; | |
| this.applicationConfig = applicationConfig; | |
| this.injector = injector; | |
| this.logger = new logger_service_1.Logger(RoutesResolver.name, { | |
| timestamp: true, | |
| }); | |
| this.routerProxy = new router_proxy_1.RouterProxy(); | |
| const httpAdapterRef = container.getHttpAdapterRef(); | |
| this.routerExceptionsFilter = new router_exception_filters_1.RouterExceptionFilters(container, applicationConfig, httpAdapterRef); | |
| this.routePathFactory = new route_path_factory_1.RoutePathFactory(this.applicationConfig); | |
| const metadataScanner = new metadata_scanner_1.MetadataScanner(); | |
| this.routerExplorer = new router_explorer_1.RouterExplorer(metadataScanner, this.container, this.injector, this.routerProxy, this.routerExceptionsFilter, this.applicationConfig, this.routePathFactory, graphInspector); | |
| } | |
| resolve(applicationRef, globalPrefix) { | |
| const modules = this.container.getModules(); | |
| modules.forEach(({ controllers, metatype }, moduleName) => { | |
| const modulePath = this.getModulePathMetadata(metatype); | |
| this.registerRouters(controllers, moduleName, globalPrefix, modulePath, applicationRef); | |
| }); | |
| } | |
| registerRouters(routes, moduleName, globalPrefix, modulePath, applicationRef) { | |
| routes.forEach(instanceWrapper => { | |
| const { metatype } = instanceWrapper; | |
| const host = this.getHostMetadata(metatype); | |
| const routerPaths = this.routerExplorer.extractRouterPath(metatype); | |
| const controllerVersion = this.getVersionMetadata(metatype); | |
| const controllerName = metatype.name; | |
| routerPaths.forEach(path => { | |
| const pathsToLog = this.routePathFactory.create({ | |
| ctrlPath: path, | |
| modulePath, | |
| globalPrefix, | |
| }); | |
| if (!controllerVersion) { | |
| pathsToLog.forEach(path => { | |
| const logMessage = (0, messages_1.CONTROLLER_MAPPING_MESSAGE)(controllerName, path); | |
| this.logger.log(logMessage); | |
| }); | |
| } | |
| else { | |
| pathsToLog.forEach(path => { | |
| const logMessage = (0, messages_1.VERSIONED_CONTROLLER_MAPPING_MESSAGE)(controllerName, path, controllerVersion); | |
| this.logger.log(logMessage); | |
| }); | |
| } | |
| const versioningOptions = this.applicationConfig.getVersioning(); | |
| const routePathMetadata = { | |
| ctrlPath: path, | |
| modulePath, | |
| globalPrefix, | |
| controllerVersion, | |
| versioningOptions, | |
| }; | |
| this.routerExplorer.explore(instanceWrapper, moduleName, applicationRef, host, routePathMetadata); | |
| }); | |
| }); | |
| } | |
| registerNotFoundHandler() { | |
| const applicationRef = this.container.getHttpAdapterRef(); | |
| const callback = (req, res) => { | |
| const method = applicationRef.getRequestMethod(req); | |
| const url = applicationRef.getRequestUrl(req); | |
| throw new common_1.NotFoundException(`Cannot ${method} ${url}`); | |
| }; | |
| const handler = this.routerExceptionsFilter.create({}, callback, undefined); | |
| const proxy = this.routerProxy.createProxy(callback, handler); | |
| applicationRef.setNotFoundHandler && | |
| applicationRef.setNotFoundHandler(proxy, this.applicationConfig.getGlobalPrefix()); | |
| } | |
| registerExceptionHandler() { | |
| const callback = (err, req, res, next) => { | |
| throw this.mapExternalException(err); | |
| }; | |
| const handler = this.routerExceptionsFilter.create({}, callback, undefined); | |
| const proxy = this.routerProxy.createExceptionLayerProxy(callback, handler); | |
| const applicationRef = this.container.getHttpAdapterRef(); | |
| applicationRef.setErrorHandler && | |
| applicationRef.setErrorHandler(proxy, this.applicationConfig.getGlobalPrefix()); | |
| } | |
| mapExternalException(err) { | |
| switch (true) { | |
| // SyntaxError is thrown by Express body-parser when given invalid JSON (#422, #430) | |
| // URIError is thrown by Express when given a path parameter with an invalid percentage | |
| // encoding, e.g. '%FF' (#8915) | |
| case err instanceof SyntaxError || err instanceof URIError: | |
| return new common_1.BadRequestException(err.message); | |
| case this.isHttpFastifyError(err): | |
| return new common_1.HttpException(err.message, err.statusCode); | |
| default: | |
| return err; | |
| } | |
| } | |
| isHttpFastifyError(error) { | |
| // condition based on this code - https://github.com/fastify/fastify-error/blob/d669b150a82968322f9f7be992b2f6b463272de3/index.js#L22 | |
| return (error.statusCode !== undefined && | |
| error instanceof Error && | |
| error.name === 'FastifyError'); | |
| } | |
| getModulePathMetadata(metatype) { | |
| const modulesContainer = this.container.getModules(); | |
| const modulePath = Reflect.getMetadata(constants_1.MODULE_PATH + modulesContainer.applicationId, metatype); | |
| return modulePath ?? Reflect.getMetadata(constants_1.MODULE_PATH, metatype); | |
| } | |
| getHostMetadata(metatype) { | |
| return Reflect.getMetadata(constants_1.HOST_METADATA, metatype); | |
| } | |
| getVersionMetadata(metatype) { | |
| const versioningConfig = this.applicationConfig.getVersioning(); | |
| if (versioningConfig) { | |
| return (Reflect.getMetadata(constants_1.VERSION_METADATA, metatype) ?? | |
| versioningConfig.defaultVersion); | |
| } | |
| } | |
| } | |
| exports.RoutesResolver = RoutesResolver; | |