- Import extractUserContext function from @/lib/extract-user-context - Extract user context from request in intercept method - Add user context to logger output using spread operator - Follow same pattern as exception filters for consistency Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: morgan@cal.com <morgan@cal.com>
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { extractUserContext } from "@/lib/extract-user-context";
|
|
import { CallHandler, ExecutionContext, Injectable, NestInterceptor, Logger } from "@nestjs/common";
|
|
import { Request, Response } from "express";
|
|
import { tap } from "rxjs/operators";
|
|
|
|
@Injectable()
|
|
export class ResponseInterceptor implements NestInterceptor {
|
|
private readonly logger = new Logger("ResponseInterceptor - NestInterceptor");
|
|
|
|
intercept(context: ExecutionContext, next: CallHandler) {
|
|
const ctx = context.switchToHttp();
|
|
const request = ctx.getRequest<Request>();
|
|
const response = ctx.getResponse<Response>();
|
|
|
|
const requestId = request.headers["X-Request-Id"] ?? "unknown-request-id";
|
|
response.setHeader("X-Request-Id", requestId.toString());
|
|
const { method, url } = request;
|
|
const userContext = extractUserContext(request);
|
|
const startTime = Date.now();
|
|
|
|
return next.handle().pipe(
|
|
tap((data) => {
|
|
const { statusCode } = response;
|
|
const responseTime = Date.now() - startTime;
|
|
|
|
let jsonBodyString = "{}";
|
|
|
|
try {
|
|
if (data && typeof data === "object") {
|
|
jsonBodyString = JSON.stringify(data);
|
|
}
|
|
} catch (err) {
|
|
this.logger.error("Could not parse request body");
|
|
}
|
|
|
|
this.logger.log("Outgoing Response", {
|
|
requestId,
|
|
method,
|
|
url,
|
|
statusCode,
|
|
responseTime,
|
|
responseBody: jsonBodyString,
|
|
timestamp: new Date().toISOString(),
|
|
...userContext,
|
|
});
|
|
})
|
|
);
|
|
}
|
|
}
|