apps/recallassess/recallassess-api/src/common/system-log/recall-system-log-request-context.adapter.ts
Methods |
| extractRequestContext | ||||||
extractRequestContext(request?: Request)
|
||||||
|
Parameters :
Returns :
BNestSystemLogRequestContext
|
| Private resolveIpAddress | ||||||
resolveIpAddress(request: Request)
|
||||||
|
Parameters :
Returns :
string | undefined
|
import { BNestAppRequestContext } from "@bish-nest/core/request-context/app-request-context";
import {
type BNestSystemLogRequestContext,
type BNestSystemLogRequestContextAdapter,
} from "@bish-nest/system-log";
import { getCLRequestContext } from "@api/shared/context";
import { Injectable } from "@nestjs/common";
import type { Request } from "express";
import { RequestContext } from "@medibloc/nestjs-request-context";
@Injectable()
export class RecallSystemLogRequestContextAdapter implements BNestSystemLogRequestContextAdapter {
extractRequestContext(request?: Request): BNestSystemLogRequestContext {
const context: BNestSystemLogRequestContext = {};
try {
const adminContext = RequestContext.get<BNestAppRequestContext>();
if (adminContext?.userLoggedIn) {
context.userId = adminContext.userLoggedIn.id;
if (adminContext.requestUrl && !context.endpoint) {
context.endpoint = adminContext.requestUrl;
}
}
} catch {
// Admin context not available
}
try {
const clientContext = getCLRequestContext();
if (clientContext?.participantLoggedIn) {
context.participantId = clientContext.participantLoggedIn.id;
}
if (clientContext?.requestUrl && !context.endpoint) {
context.endpoint = clientContext.requestUrl;
}
} catch {
// Client context not available
}
if (request) {
if (!context.userAgent) {
context.userAgent = request.headers["user-agent"] as string | undefined;
}
if (!context.method) {
context.method = request.method;
}
if (!context.endpoint) {
context.endpoint = request.originalUrl || request.url || undefined;
}
if (!context.ipAddress) {
context.ipAddress = this.resolveIpAddress(request);
}
}
return context;
}
private resolveIpAddress(request: Request): string | undefined {
const forwardedFor = request.headers["x-forwarded-for"] as string | undefined;
if (forwardedFor) {
const ips = forwardedFor.split(",").map((ip) => ip.trim());
const publicIp = ips.find((ip) => {
if (!ip) return false;
return !(
ip.startsWith("172.") ||
ip.startsWith("192.168.") ||
ip.startsWith("10.") ||
ip.startsWith("127.")
);
});
return publicIp || ips[0] || undefined;
}
const realIp = request.headers["x-real-ip"] as string | undefined;
if (realIp) return realIp;
if (request.ip) return request.ip;
const remoteAddr = request.socket?.remoteAddress;
if (
remoteAddr &&
!remoteAddr.startsWith("172.") &&
!remoteAddr.startsWith("192.168.") &&
!remoteAddr.startsWith("10.") &&
!remoteAddr.startsWith("127.")
) {
return remoteAddr;
}
return undefined;
}
}