import { CallHandler, ExecutionContext, Injectable, NestInterceptor, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { Request, Response } from 'express'; import { Observable, tap } from 'rxjs'; import { API_MESSAGE_METADATA, } from '../decorators/api-message.decorator'; import { SUCCESS_MESSAGE } from '../constants/response-message.constants'; import { getRequestCost } from '../utils/request-context.util'; import { LogsService } from '../../modules/logs/logs.service'; @Injectable() export class RequestLoggingInterceptor implements NestInterceptor { constructor( private readonly logsService: LogsService, private readonly reflector: Reflector, ) {} intercept(context: ExecutionContext, next: CallHandler): Observable { const http = context.switchToHttp(); const request = http.getRequest< Request & { requestId?: string; adminId?: number; user?: { id: number } } >(); const response = http.getResponse(); const message = this.reflector.get(API_MESSAGE_METADATA, context.getHandler()) ?? SUCCESS_MESSAGE; return next.handle().pipe( tap(() => { this.logsService.recordRequest({ requestId: request.requestId ?? '', method: request.method, path: request.originalUrl ?? request.url, query: request.query, body: request.body, statusCode: response.statusCode, responseCode: 0, message, costMs: getRequestCost(request), userId: request.user?.id, adminId: request.adminId, ip: request.ip, userAgent: request.get('user-agent'), errorStack: undefined, }); }), ); } }