Files
eapim-admin/src/main/java/com/eactive/ext/kjb/web/ApiTransactionLogController.java
T
2025-12-30 13:58:34 +09:00

143 lines
4.5 KiB
Java

package com.eactive.ext.kjb.web;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import com.eactive.eai.rms.common.datasource.DataSourceContextHolder;
import com.eactive.eai.rms.common.datasource.DataSourceTypeManager;
import com.eactive.eai.rms.common.interceptor.InterceptorSkipController;
import com.eactive.eai.rms.data.entity.onl.logger.ApiLogDTO;
import com.eactive.eai.rms.data.entity.onl.logger.ApiMessageLogDTO;
import com.eactive.eai.rms.data.entity.onl.logger.EAILogService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
public class ApiTransactionLogController implements InterceptorSkipController {
private final EAILogService eaiLogService;
private final ObjectMapper objectMapper = new ObjectMapper();
@GetMapping("/api/transaction/log.do")
@PostMapping("/api/transaction/log.do")
public ResponseEntity<ApiLogUI> getApiLog(String txDate, String apiServiceNumber) {
DataSourceContextHolder.setDataSourceType(DataSourceTypeManager.getDataSourceType(DataSourceTypeManager.APIGW));
// txDate가 없으면 오늘 날짜 설정
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate searchDate;
if (StringUtils.hasText(txDate)) {
searchDate = LocalDate.parse(txDate, formatter);
} else {
searchDate = LocalDate.now();
}
// 최대 10일 전까지 조회 시도
ApiLogDTO dto = null;
for (int i = 0; i < 10; i++) {
String searchDateStr = searchDate.format(formatter);
dto = eaiLogService.getApiLog(searchDateStr, apiServiceNumber);
// 결과가 있으면 종료
if (dto != null && dto.getLogs() != null && !dto.getLogs().isEmpty()) {
break;
}
// 하루 전으로 이동
searchDate = searchDate.minusDays(1);
}
return ResponseEntity.ok(convertToUI(dto));
}
private ApiLogUI convertToUI(ApiLogDTO dto) {
ApiLogUI ui = new ApiLogUI();
ui.setApiServiceNumber(dto.getApiServiceNumber());
ui.setTxDate(dto.getTxDate());
ui.setTotalProcessingTime(dto.getTotalProcessingTime());
if (dto.getLogs() != null) {
List<ApiMessageLogUI> uiLogs = dto.getLogs().stream().map(this::convertMessageToUI)
.collect(Collectors.toList());
ui.setLogs(uiLogs);
}
return ui;
}
private ApiMessageLogUI convertMessageToUI(ApiMessageLogDTO dto) {
ApiMessageLogUI ui = new ApiMessageLogUI();
ui.setApiServiceNumber(dto.getApiServiceNumber());
ui.setProcessNumber(dto.getProcessNumber());
ui.setTxDate(dto.getTxDate());
ui.setUrl(dto.getUrl());
ui.setQueryString(dto.getQueryString());
ui.setClientId(dto.getClientId());
ui.setMethod(dto.getMethod());
ui.setHttpStatus(dto.getHttpStatus());
ui.setExdata(dto.getExdata());
ui.setProcessingTime(dto.getProcessingTime());
ui.setGuid(dto.getKeymgtmsgctnt());
// header: JSON 문자열 → Map<String, String>
if (dto.getHeader() != null) {
try {
List<Map<String, String>> headerList = objectMapper.readValue(dto.getHeader(),
new TypeReference<List<Map<String, String>>>() {
});
Map<String, String> headerMap = new HashMap<>();
for (Map<String, String> headerItem : headerList) {
String name = headerItem.get("name");
String value = headerItem.get("value");
if (name != null) {
headerMap.put(name, value);
}
}
// header에서 client*id 패턴 추출 (정규식, ignoreCase)
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
if (entry.getKey() != null && entry.getKey().matches("(?i)client.*id")) {
ui.setClientId(entry.getValue());
break;
}
}
ui.setHeader(headerMap);
} catch (Exception e) {
log.error("Failed to parse header JSON: {}", dto.getHeader(), e);
}
}
// body: JSON 문자열 → Object
if (dto.getBody() != null) {
try {
Object bodyObject = objectMapper.readValue(dto.getBody(), Object.class);
ui.setBody(bodyObject);
} catch (Exception e) {
// JSON 파싱 실패 시 원본 문자열 사용
ui.setBody(dto.getBody());
}
}
return ui;
}
}