/** * Logger interceptor. * @file 请求日志拦截器 * @module interceptor/logger.interceptor * @author zhxiao1124 */ 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 "@app/decorators/api-message.decorator"; import { SUCCESS_MESSAGE } from "@constants/text.constant"; import { getRequestCost } from "@app/utils/request-context.util"; import { LogsService } from "@src/logs/logs.service"; @Injectable() export class LoggerInterceptor 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(); 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, }); }), ); } }