File

apps/recallassess/recallassess-api/src/common/system-log/recall-system-log-request-context.adapter.ts

Index

Methods

Methods

extractRequestContext
extractRequestContext(request?: Request)
Parameters :
Name Type Optional
request Request Yes
Returns : BNestSystemLogRequestContext
Private resolveIpAddress
resolveIpAddress(request: Request)
Parameters :
Name Type Optional
request Request No
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;
  }
}

results matching ""

    No results matching ""