package com.noblelift.ota.common.aspect; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.noblelift.ota.common.annotation.Log; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.util.Arrays; @Aspect @Component @Slf4j @RequiredArgsConstructor public class LogAspect { private final ObjectMapper objectMapper; @Around("@annotation(logAnnotation)") public Object around(ProceedingJoinPoint joinPoint, Log logAnnotation) throws Throwable { long start = System.currentTimeMillis(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes instanceof ServletRequestAttributes servletRequestAttributes ? servletRequestAttributes.getRequest() : null; String requestUri = request == null ? "N/A" : request.getRequestURI(); String requestMethod = request == null ? "N/A" : request.getMethod(); String params = serializeArgs(joinPoint.getArgs()); String operation = logAnnotation.value().isBlank() ? signature.getMethod().getName() : logAnnotation.value(); log.info("[API-REQUEST] operation={}, method={}, uri={}, params={}", operation, requestMethod, requestUri, params); try { Object result = joinPoint.proceed(); log.info("[API-RESPONSE] operation={}, duration={}ms", operation, System.currentTimeMillis() - start); return result; } catch (Throwable ex) { log.error("[API-ERROR] operation={}, duration={}ms, message={}", operation, System.currentTimeMillis() - start, ex.getMessage(), ex); throw ex; } } private String serializeArgs(Object[] args) { Object[] filtered = Arrays.stream(args) .filter(arg -> !(arg instanceof HttpServletRequest)) .toArray(); try { return objectMapper.writeValueAsString(filtered); } catch (JsonProcessingException e) { return Arrays.toString(filtered); } } }