@cisstech/nestjs-expand
Version:
A NestJS module to build Dynamic Resource Expansion for APIs
73 lines • 3.48 kB
JavaScript
;
// 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