@takentrade/takentrade-libs
Version:
TakeNTrade shared libraries
87 lines (86 loc) • 3.88 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var ResponseInterceptor_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResponseInterceptor = void 0;
const common_1 = require("@nestjs/common");
const operators_1 = require("rxjs/operators");
const utils_1 = require("../utils");
let ResponseInterceptor = ResponseInterceptor_1 = class ResponseInterceptor {
logger = new common_1.Logger(ResponseInterceptor_1.name);
config;
constructor(config = {}) {
this.config = {
includeTimestamp: true,
includePath: true,
includeRequestId: true,
includeVersion: false,
includeExecutionTime: true,
defaultSuccessMessage: 'Request successful',
...config,
};
}
intercept(context, next) {
const startTime = Date.now();
const request = context.switchToHttp().getRequest();
const metadata = this.buildMetadata(request, startTime);
return next.handle().pipe((0, operators_1.tap)(() => {
this.logger.log(`${request.method} ${request.url} - ${Date.now() - startTime}ms`);
}), (0, operators_1.map)((data) => {
if (data instanceof utils_1.AppResponse) {
return this.enhanceExistingResponse(data, metadata, startTime);
}
return this.createSuccessResponse(data, metadata, startTime);
}));
}
buildMetadata(request, startTime) {
const metadata = {};
if (this.config.includeTimestamp) {
metadata.timestamp = new Date().toISOString();
}
if (this.config.includePath) {
metadata.path = `${request.method} ${request.url}`;
}
if (this.config.includeRequestId) {
metadata.requestId = this.extractRequestId(request);
}
if (this.config.includeVersion && this.config.version) {
metadata.version = this.config.version;
}
return metadata;
}
enhanceExistingResponse(response, metadata, startTime) {
if (this.config.includeExecutionTime) {
response.executionTime = Date.now() - startTime;
}
response.timestamp = response.timestamp || metadata.timestamp;
response.path = response.path || metadata.path;
response.requestId = response.requestId || metadata.requestId;
response.version = response.version || metadata.version;
return response;
}
createSuccessResponse(data, metadata, startTime) {
if (this.config.includeExecutionTime) {
metadata.executionTime = Date.now() - startTime;
}
return utils_1.AppResponse.success(this.config.defaultSuccessMessage, data, metadata);
}
extractRequestId(request) {
return ((request.headers && request.headers['x-request-id']) ||
(request.headers && request.headers['x-correlation-id']) ||
(request.headers && request.headers['x-trace-id']) ||
this.generateRequestId());
}
generateRequestId() {
return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
};
exports.ResponseInterceptor = ResponseInterceptor;
exports.ResponseInterceptor = ResponseInterceptor = ResponseInterceptor_1 = __decorate([
(0, common_1.Injectable)()
], ResponseInterceptor);