import { CallHandler, ExecutionContext, Injectable, NestInterceptor, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { Request } from 'express'; import { map, Observable } from 'rxjs'; import { SUCCESS_MESSAGE } from '../constants/response-message.constants'; import { API_MESSAGE_METADATA, } from '../decorators/api-message.decorator'; import { getRequestCost } from '../utils/request-context.util'; @Injectable() export class ResponseInterceptor implements NestInterceptor { constructor(private readonly reflector = new Reflector()) {} intercept(context: ExecutionContext, next: CallHandler): Observable { const request = context .switchToHttp() .getRequest(); const message = this.reflector.get(API_MESSAGE_METADATA, context.getHandler()) ?? SUCCESS_MESSAGE; return next.handle().pipe( map((data) => ({ code: 0, data: data ?? {}, message, timestamp: Date.now(), requestId: request.requestId, cost: `${getRequestCost(request)}ms`, })), ); } }