UNPKG

@cisstech/nestjs-expand

Version:

A NestJS module to build Dynamic Resource Expansion for APIs

73 lines 3.48 kB
"use strict"; // expand.interceptor.ts Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpandInterceptor = void 0; const tslib_1 = require("tslib"); const common_1 = require("@nestjs/common"); const expand_1 = require("./expand"); const expand_service_1 = require("./expand.service"); let ExpandInterceptor = class ExpandInterceptor { constructor(expandService) { this.expandService = expandService; this.logger = new common_1.Logger(expand_service_1.ExpandService.name); } /** * Intercepts incoming requests and applies expansion based on metadata. * @param context - The execution context. * @param next - The next call handler. * @returns An observable with the expanded response. * @throws Error if there's an issue during the expansion process and the error policy is set to 'throw'. */ intercept(context, next) { if (context.getType() !== 'http') return next.handle(); const expandable = Reflect.getMetadata(expand_1.EXPANDABLE_KEY, context.getHandler()); const selectable = Reflect.getMetadata(expand_1.SELECTABLE_KEY, context.getHandler()); if (!expandable && !selectable && !this.expandService.config.enableGlobalSelection) return next.handle(); const http = context.switchToHttp(); const req = http.getRequest(); const res = http.getResponse(); const original = res.json; res.json = async (body) => { if (res.statusCode && res.statusCode >= 400) return original.call(res, body); try { const expanded = await this.expandService.expandAndSelect(req, body, expandable, selectable); return original.call(res, expanded); // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error) { const config = this.expandService.config; if (config.enableLogging) { // Use configured log level if (config.logLevel === 'error') { this.logger.error(`Error during expansion: ${error.message}`, error.stack); } else if (config.logLevel === 'warn') { this.logger.warn(`Error during expansion: ${error.message}`); } else if (config.logLevel === 'log') { this.logger.log(`Error during expansion: ${error.message}`); } else if (config.logLevel === 'debug') { this.logger.debug(`Error during expansion: ${error.message}`, error.stack); } } // If the endpoint-level or default policy is 'throw', we need to bubble up the error const errorPolicy = expandable?.errorPolicy || config.errorHandling?.defaultErrorPolicy || 'ignore'; if (errorPolicy === 'throw') { throw error; } return original.call(res, body); } }; return next.handle(); } }; exports.ExpandInterceptor = ExpandInterceptor; exports.ExpandInterceptor = ExpandInterceptor = tslib_1.__decorate([ (0, common_1.Injectable)(), tslib_1.__metadata("design:paramtypes", [expand_service_1.ExpandService]) ], ExpandInterceptor); //# sourceMappingURL=expand.interceptor.js.map