diff --git a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java index 0b60677..1427b68 100644 --- a/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java +++ b/src/main/java/com/eactive/eai/adapter/controller/ApiAdapterController.java @@ -1,190 +1,253 @@ -package com.eactive.eai.adapter.controller; - -import java.util.Date; -import java.util.Properties; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.eactive.eai.adapter.AdapterGroupVO; -import com.eactive.eai.adapter.AdapterManager; -import com.eactive.eai.adapter.AdapterPropManager; -import com.eactive.eai.adapter.AdapterVO; -import com.eactive.eai.adapter.http.HttpStatusException; -import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; -import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterManager; -import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterUri; -import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthException; -import com.eactive.eai.adapter.service.ApiAdapterService; -import com.eactive.eai.common.TransactionContextKeys; -import com.eactive.eai.common.exception.ExceptionUtil; -import com.eactive.eai.common.server.EAIServerManager; -import com.eactive.eai.common.util.DatetimeUtil; -import com.eactive.eai.common.util.InboundErrorLogger; -import com.eactive.eai.common.util.Logger; -import com.eactive.eai.common.util.MessageUtil; -import com.eactive.eai.common.util.UUIDGenerator; -import com.eactive.eai.inbound.error.InboundErrorInfoVO; - -@RestController -public class ApiAdapterController implements HttpAdapterServiceKey { - static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); - - @Autowired - ApiAdapterService service; - - /** - * KBANK 요구사항으로 /api/v1/oauth/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함 - * @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer endpoints) - */ - @RequestMapping(value = {"/api/*", "/api/*/{path:^(?!.*oauth).*$}/**"}) -// @RequestMapping(value = {"/api/**"}) - public ResponseEntity callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception { - // /ONLWeb/api/v1/public/getUserInfo.svc - String apiUri = servletRequest.getRequestURI(); - // /api/v1/public/getUserInfo.svc - apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); - apiUri = StringUtils.removeEnd(apiUri, "/"); - HttpDynamicInAdapterUri adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance()); - - if (logger.isDebug()) { - logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); - } - - if (adptUri == null) { - logError(servletRequest); -// throw new Exception("can not find Adapter Uri"); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("can not find Adapter Uri"); - } - - - String adapterGroupName = adptUri.getAdptGrpName(); - String adapterName = adptUri.getAdptName(); - AdapterGroupVO adapterGroupVO = AdapterManager.getInstance().getAdapterGroupVO(adapterGroupName); - AdapterVO adapterVO = AdapterManager.getInstance().getAdapterVO(adapterGroupName, adapterName); - if (adapterVO == null) { -// throw new Exception("Adapter not found error"); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Adapter not found error"); - } - - Properties httpProp = AdapterPropManager.getInstance().getProperties(adapterVO.getPropGroupName()); - - String adptMsgType = adapterVO.getAdapterGroupVO().getMessageType(); - String encode = StringUtils.defaultIfBlank(adapterGroupVO.getMessageEncode(), "UTF-8"); - MediaType mediaType = MediaType.valueOf("application/json;charset=" + encode); - String errorResponseFormat = httpProp.getProperty(ERROR_RESPONSE_FORMAT); - - String responseType = httpProp.getProperty(RESPONSE_TYPE, "SYNC"); - ResponseEntity responseEntity = null; - Properties transactionProp = new Properties(); - try { - String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); - if (RESPONSE_TYPE_ASYNC.equals(responseType)) { - responseEntity = ResponseEntity.ok("dummy"); - } else { -// responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); -// 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정 -// Filter에서 설정한 response status값을 responseEntity 생성시 적용 modify by lwk 2025.03.24 - int httpStatus = servletResponse.getStatus(); - if (httpStatus != 200) { - responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); - } else { - responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); - } - } - } catch (HttpStatusException e) { - logger.warn("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage()); - String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, e.getCode(), - e.getMessage(), errorResponseFormat); - responseEntity = ResponseEntity.status(e.getStatus()).contentType(mediaType).body(errorMsg); - } catch (JwtAuthException e) { - logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e); - String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, e.getCode(), - e.getMessage(), errorResponseFormat); - responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).contentType(mediaType).body(errorMsg); - } catch (Exception e) { - logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e); - responseEntity = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(mediaType).body(e); - } finally { - /** - * 로깅 인터셉터에 데이터를 전달하기 위한 처리 - * 이미 거래처리가 끝나서 영향도가 없을만한 servletRequest에 Attribute로 전달 - * 추후 더 좋은방법이 생길경우 개선 요망 - */ - servletRequest.setAttribute(TransactionContextKeys.TRANSACTION_PROP, transactionProp); - } - return responseEntity; - } - - - - /** - * url에서 뒤쪽 /이후를 제거하면서 찾는다.
- * /api/v1/public/getUserInfo.svc - * - * @param apiUri - * @return - */ - private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager) { - if (StringUtils.isBlank(apiUri)) { - return null; - } - - for (int i = 0; i < 10; i++) { - HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri); - if (adptUri != null) { - return adptUri; - } - - // /api/v1/public - apiUri = StringUtils.substringBeforeLast(apiUri, "/"); - if (apiUri.length() < 4) { // /api - return null; - } - } - - return null; - } - - private void logError(HttpServletRequest request) { - InboundErrorInfoVO errorInfoVO = new InboundErrorInfoVO(); - - EAIServerManager eaiServerManager = EAIServerManager.getInstance(); - String serverName = eaiServerManager.getLocalServerName(); - String uuid = null; - StringBuffer sb = new StringBuffer(); - - String instanceid1 = serverName.substring(0, 2); - String instanceid2 = serverName.substring(serverName.length() - 2, serverName.length()); - String instid = instanceid1 + instanceid2; - uuid = instid + UUIDGenerator.getUUID(); - - String[] msgArgs = new String[1]; - msgArgs[0] = request.getRequestURI(); - - String errorCode = "RECEAIIRP010"; - String errorMsg = ExceptionUtil.make(new Exception("cat not find uri"), errorCode, msgArgs); - - errorInfoVO.setEaiSvcSno(uuid); // EAI서비스일련번호 - errorInfoVO.setAdptBwkGrpNm("HTTP_IN_NO_URI"); // 어댑터업무그룹명 - errorInfoVO.setErrCd(errorCode); // 에러코드 - errorInfoVO.setErrTxt(errorMsg); // 에러내용 - errorInfoVO.setErrTm(DatetimeUtil.getCurrentTime(new Date().getTime())); // 에러발생시각 - errorInfoVO.setErrDstcd(" "); - sb.append("Remote Addr : ").append(request.getRemoteAddr()).append("\n").append("Request URI : ") - .append(request.getRequestURI()); - errorInfoVO.setBwkDataTxt(sb.toString()); // 업무데이터내용 - errorInfoVO.setEaiSvrInstNm(serverName); // EAI서버인스턴스명 - - InboundErrorLogger.error(errorInfoVO); - } - +package com.eactive.eai.adapter.controller; + +import java.util.Date; +import java.util.Properties; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.eactive.eai.adapter.AdapterGroupVO; +import com.eactive.eai.adapter.AdapterManager; +import com.eactive.eai.adapter.AdapterPropManager; +import com.eactive.eai.adapter.AdapterVO; +import com.eactive.eai.adapter.http.HttpStatusException; +import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey; +import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterManager; +import com.eactive.eai.adapter.http.dynamic.HttpDynamicInAdapterUri; +import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthException; +import com.eactive.eai.adapter.service.ApiAdapterService; +import com.eactive.eai.common.TransactionContextKeys; +import com.eactive.eai.common.exception.ExceptionUtil; +import com.eactive.eai.common.server.EAIServerManager; +import com.eactive.eai.common.util.DatetimeUtil; +import com.eactive.eai.common.util.InboundErrorLogger; +import com.eactive.eai.common.util.Logger; +import com.eactive.eai.common.util.MessageUtil; +import com.eactive.eai.common.util.UUIDGenerator; +import com.eactive.eai.inbound.error.InboundErrorInfoVO; +import com.kjbank.encrypt.exchange.crypto.AES256Cipher; +import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher; +import com.kjbank.encrypt.exchange.crypto.AESCipher; + +// jwhong +import org.json.simple.JSONObject; +import java.util.HashMap; +import java.util.Map; +import java.sql.Timestamp; + +@RestController +public class ApiAdapterController implements HttpAdapterServiceKey { + static Logger logger = Logger.getLogger(Logger.LOGGER_ADAPTER); + + @Autowired + ApiAdapterService service; + + /** + * KBANK 요구사항으로 /api/v1/oauth/token 과 같은 형태로 토큰 발급거래를 수행해야해서 예외처리함 + * @See com.eactive.eai.authserver.config.AuthorizationServerConfig.configure(AuthorizationServerEndpointsConfigurer endpoints) + */ + @RequestMapping(value = {"/api/*", "/mapi/*", "/api/*/{path:^(?!.*oauth).*$}/**", "/mapi/*/{path:^(?!.*oauth).*$}/**"}) +// @RequestMapping(value = {"/api/**"}) + public ResponseEntity callApi(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws Exception { + // /ONLWeb/api/v1/public/getUserInfo.svc + String apiUri = servletRequest.getRequestURI(); + // /api/v1/public/getUserInfo.svc + apiUri = StringUtils.removeStart(apiUri, servletRequest.getContextPath()); + apiUri = StringUtils.removeEnd(apiUri, "/"); + HttpDynamicInAdapterUri adptUri = findAdptUri(apiUri, HttpDynamicInAdapterManager.getInstance()); + + //Received time , jwhong + long receivedTimeMillis = System.currentTimeMillis(); + String receivedTimeStr = String.valueOf(receivedTimeMillis); + + System.out.println("현재 시간 밀리초(long): " + receivedTimeMillis); + System.out.println("현재 시간 밀리초(String): " + receivedTimeStr); + //Timestamp timestamp = new Timestamp(System.currentTimeMillis()); + //System.out.println("현재 Timestamp: " + timestamp); + + if (logger.isDebug()) { + logger.debug("ApiAdapterController] service request uri : " + servletRequest.getRequestURI()); + } + + if (adptUri == null) { + logError(servletRequest); +// throw new Exception("can not find Adapter Uri"); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("can not find Adapter Uri"); + } + + + String adapterGroupName = adptUri.getAdptGrpName(); + String adapterName = adptUri.getAdptName(); + AdapterGroupVO adapterGroupVO = AdapterManager.getInstance().getAdapterGroupVO(adapterGroupName); + AdapterVO adapterVO = AdapterManager.getInstance().getAdapterVO(adapterGroupName, adapterName); + if (adapterVO == null) { +// throw new Exception("Adapter not found error"); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Adapter not found error"); + } + + Properties httpProp = AdapterPropManager.getInstance().getProperties(adapterVO.getPropGroupName()); + + String adptMsgType = adapterVO.getAdapterGroupVO().getMessageType(); + String encode = StringUtils.defaultIfBlank(adapterGroupVO.getMessageEncode(), "UTF-8"); + MediaType mediaType = MediaType.valueOf("application/json;charset=" + encode); + String errorResponseFormat = httpProp.getProperty(ERROR_RESPONSE_FORMAT); + + String responseType = httpProp.getProperty(RESPONSE_TYPE, "SYNC"); + ResponseEntity responseEntity = null; + Properties transactionProp = new Properties(); + //transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeMillis); // jwhong, put api received time + transactionProp.put(INBOUND_REQUESTED_TIME, receivedTimeStr); + + try { + String responseData = service.callApi(servletRequest, servletResponse, httpProp, adapterGroupVO, adapterVO, transactionProp); + // if (RESPONSE_TYPE_ASYNC.equals(responseType)) { // table의 값이 ASYNC 로 들어가 있는데 response_type_async는 ASYN 로 되어 있어 아래처럼 비교함 jwhong 2025 + if ("ASYNC".equals(responseType)) { + //responseEntity = ResponseEntity.ok("dummy"); // comment by jwhong + servletResponse.addHeader("traceId", responseData); // uuid를 response header에 + int httpStatus = servletResponse.getStatus(); + if (httpStatus == 200) { + // 업체별 aync response message 가 다르다. + String asyncMsgStyle = httpProp.getProperty("ASYNC_RTNMSG_TYPE", "").toUpperCase(); + String responseBody = makeResponseBodyMsg(asyncMsgStyle); + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseBody); + // jwhong + } else { + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); + } + } else { +// responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); +// 버즈빌 포인트 적립 처리하기 위하여 정상응답이더라도 응답코드(apiRsltCd) 값이 200이 아닌 경우 처리를 위하여 수정 +// Filter에서 설정한 response status값을 responseEntity 생성시 적용 modify by lwk 2025.03.24 + int httpStatus = servletResponse.getStatus(); + if (httpStatus != 200) { + responseEntity = ResponseEntity.status(httpStatus).contentType(mediaType).body(responseData); + } else { + responseEntity = ResponseEntity.ok().contentType(mediaType).body(responseData); + } + } + } catch (HttpStatusException e) { + logger.warn("ApiAdapterController] " + adapterGroupName + "-" + adapterName + ">>" + e.getMessage()); + String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, e.getCode(), + e.getMessage(), errorResponseFormat); + responseEntity = ResponseEntity.status(e.getStatus()).contentType(mediaType).body(errorMsg); + } catch (JwtAuthException e) { + logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e); + String errorMsg = MessageUtil.makeErrorMessageByMessageType(adptMsgType, encode, e.getCode(), + e.getMessage(), errorResponseFormat); + responseEntity = ResponseEntity.status(HttpStatus.UNAUTHORIZED).contentType(mediaType).body(errorMsg); + } catch (Exception e) { + logger.error(adapterGroupName + "-" + adapterName + ">>" + e.getMessage(), e); + responseEntity = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(mediaType).body(e); + } finally { + /** + * 로깅 인터셉터에 데이터를 전달하기 위한 처리 + * 이미 거래처리가 끝나서 영향도가 없을만한 servletRequest에 Attribute로 전달 + * 추후 더 좋은방법이 생길경우 개선 요망 + */ + servletRequest.setAttribute(TransactionContextKeys.TRANSACTION_PROP, transactionProp); + } + return responseEntity; + } + + + + /** + * url에서 뒤쪽 /이후를 제거하면서 찾는다.
+ * /api/v1/public/getUserInfo.svc + * + * @param apiUri + * @return + */ + private HttpDynamicInAdapterUri findAdptUri(String apiUri, HttpDynamicInAdapterManager manager) { + if (StringUtils.isBlank(apiUri)) { + return null; + } + + for (int i = 0; i < 10; i++) { + HttpDynamicInAdapterUri adptUri = manager.getAdptUri(apiUri); + if (adptUri != null) { + return adptUri; + } + + // /api/v1/public + apiUri = StringUtils.substringBeforeLast(apiUri, "/"); + if (apiUri.length() < 4) { // /api + return null; + } + } + + return null; + } + + private void logError(HttpServletRequest request) { + InboundErrorInfoVO errorInfoVO = new InboundErrorInfoVO(); + + EAIServerManager eaiServerManager = EAIServerManager.getInstance(); + String serverName = eaiServerManager.getLocalServerName(); + String uuid = null; + StringBuffer sb = new StringBuffer(); + + String instanceid1 = serverName.substring(0, 2); + String instanceid2 = serverName.substring(serverName.length() - 2, serverName.length()); + String instid = instanceid1 + instanceid2; + uuid = instid + UUIDGenerator.getUUID(); + + String[] msgArgs = new String[1]; + msgArgs[0] = request.getRequestURI(); + + String errorCode = "RECEAIIRP010"; + String errorMsg = ExceptionUtil.make(new Exception("cat not find uri"), errorCode, msgArgs); + + errorInfoVO.setEaiSvcSno(uuid); // EAI서비스일련번호 + errorInfoVO.setAdptBwkGrpNm("HTTP_IN_NO_URI"); // 어댑터업무그룹명 + errorInfoVO.setErrCd(errorCode); // 에러코드 + errorInfoVO.setErrTxt(errorMsg); // 에러내용 + errorInfoVO.setErrTm(DatetimeUtil.getCurrentTime(new Date().getTime())); // 에러발생시각 + errorInfoVO.setErrDstcd(" "); + sb.append("Remote Addr : ").append(request.getRemoteAddr()).append("\n").append("Request URI : ") + .append(request.getRequestURI()); + errorInfoVO.setBwkDataTxt(sb.toString()); // 업무데이터내용 + errorInfoVO.setEaiSvrInstNm(serverName); // EAI서버인스턴스명 + + InboundErrorLogger.error(errorInfoVO); + } + + private String makeResponseBodyMsg(String asyncMsgStyle) { + + Map dataMap = new HashMap<>(); + dataMap.put("result", 1); + Map map = new HashMap<>(); + + switch (asyncMsgStyle) { + case "TB_SUC": + map.put("rspCode", "TB_SUC_000"); + map.put("rspMsg", "정상"); + map.put("data", dataMap); + break; + case "ONLYDATA": + map.put("data", dataMap); + map.put("success", "true"); + break; + default: + map.put("code", "200"); + map.put("data", dataMap); + map.put("message", "정상 처리 되었습니다."); + break; + } + + JSONObject json = new JSONObject(); + json.putAll(map); + + return json.toJSONString(); + } + + } \ No newline at end of file