diff --git a/WebContent/jsp/bap/admin/work/messageProcManDetail.jsp b/WebContent/jsp/bap/admin/work/messageProcManDetail.jsp index 12f1d38..447710a 100644 --- a/WebContent/jsp/bap/admin/work/messageProcManDetail.jsp +++ b/WebContent/jsp/bap/admin/work/messageProcManDetail.jsp @@ -90,6 +90,20 @@ function init(url,key){ //new makeOptions("CODE","NAME").setObj($("select[name=bizlevel2]")).setNoValueInclude(true).setNoValue(' ','없음').setData(json.bizlevel2).rendering(); //setSearchable('bjobBzwkDstcd'); //setSearchable('uapplCd'); + + $.ajax({ + type : "POST", + url:url, + dataType:"json", + data:{ cmd: 'LIST_UAPPL_COMBO'}, + success:function(json){ + new makeOptions("CODE","NAME").setObj($("select[name=uapplCd]")).setNoValueInclude(true).setNoValue(' ','없음').setData(json.uapplCd).rendering(); + }, + error:function(e){ +// alert(e.responseText); + } + }); + debugger; if ( isDetail ){ detail(url, key); @@ -141,13 +155,16 @@ function detail(url,key){ $("select[name=bjobBzwkDstcd]").attr('disabled',true); $("input[name=bjobTranDstcdName]").attr('readonly',true); $("input,select").each(function(){ - var name = $(this).attr('name').toUpperCase(); + var name = $(this).attr('name') + if(name != null) { + name = name.toUpperCase(); + } $(this).val(detail[name]); }); //Prop $("#grid")[0].addJSONData(data); - /* setSearchable('uapplCd'); */ + setSearchable('uapplCd'); }, error:function(e){ // alert(e.responseText); @@ -326,8 +343,8 @@ $(document).ready(function() { APPLICATION CODE - - +
+ +
+
+
+
+ + \ No newline at end of file diff --git a/WebContent/jsp/common/screen/leftMenu.jsp b/WebContent/jsp/common/screen/leftMenu.jsp index 5122047..39ea4aa 100644 --- a/WebContent/jsp/common/screen/leftMenu.jsp +++ b/WebContent/jsp/common/screen/leftMenu.jsp @@ -63,7 +63,8 @@
-
<%=menuName%>
+ +
<%=menuName != null ? menuName : ""%>
diff --git a/WebContent/jsp/onl/transaction/apim/apiInterfaceManDetail.jsp b/WebContent/jsp/onl/transaction/apim/apiInterfaceManDetail.jsp index 09bb0f7..d6de11e 100644 --- a/WebContent/jsp/onl/transaction/apim/apiInterfaceManDetail.jsp +++ b/WebContent/jsp/onl/transaction/apim/apiInterfaceManDetail.jsp @@ -867,6 +867,10 @@ type: "POST", url:url, data: postData, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#btn_modify").text("처리중 . . . . ."); + }, success:function(message){ alert("저장 되었습니다. \n\n[실시간 반영 결과]\n"+JSON.stringify(message)); if (typeof callback === 'function') { @@ -877,6 +881,10 @@ }, error:function(xhr, status, errorMsg){ alert(JSON.parse(xhr.responseText).errorMsg); + }, + complete: function() { + $("[id^='btn_']").prop("disabled", false); + $("#btn_modify").text("수정"); } }); } @@ -936,6 +944,11 @@ type : "POST", url:url, data:postData, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#btn_delete").text("처리중 . . . . ."); + }, + success:function(args){ alert("삭제 되었습니다."); goNav(returnUrl);//LIST로 이동 @@ -943,6 +956,10 @@ }, error:function(e){ alert(e.responseText); + }, + complete: function() { + $("[id^='btn_']").prop("disabled", false); + $("#btn_delete").text("삭제"); } }); }); @@ -1203,6 +1220,10 @@ newInboundHttpMethod, newInboundRestPath, }, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#doCloneInterfaceButton").text("처리중 . . . . ."); + }, success: function () { alert("["+orgApiInterfaceId+"] => ["+newBizCode+"]["+newApiInterfaceId+"] 복제 완료."); $('#cloneInterfaceModal').modal('hide'); @@ -1210,19 +1231,25 @@ }, error: function (e) { alert(e.responseText); + }, + complete: function() { + $("[id^='btn_']").prop("disabled", false); + $("#doCloneInterfaceButton").text("복제"); } }); }); - $("#btn_excel_export").click(function () { - const url = url_excel + '?cmd=DETAIL_EXPORT_TO_EXCEL'; - const params = new URLSearchParams(); - params.append('eaiSvcName', getFullSvcName()); - - downloadFiles(url, params); - - return false; - }); + // 25.11.25 엑셀다운로드 사용안함. +// $("#btn_excel_export").click(function () { +// const url = url_excel + '?cmd=DETAIL_EXPORT_TO_EXCEL'; +// const params = new URLSearchParams(); +// params.append('eaiSvcName', getFullSvcName()); +// downloadFiles(url, params); +// return false; +// }); + + + // JSON 다운로드 $("#btn_json_export").click(function () { const uri = url + '?cmd=DETAIL_EXPORT_TO_JSON'; const params = new URLSearchParams(); diff --git a/WebContent/jsp/onl/transaction/apim/apiSpecManPopup.jsp b/WebContent/jsp/onl/transaction/apim/apiSpecManPopup.jsp index d6bd2a6..c34dd06 100644 --- a/WebContent/jsp/onl/transaction/apim/apiSpecManPopup.jsp +++ b/WebContent/jsp/onl/transaction/apim/apiSpecManPopup.jsp @@ -194,11 +194,19 @@ type: "POST", url: url, data: postData, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#btn_save").text("처리중 . . . . ."); + }, success: function () { alert("<%= localeMessage.getString("common.saveMsg") %>"); }, error: function (e) { alert(e.responseText); + }, + complate: function() { + $("[id^='btn_']").prop("disabled", false); + $("#btn_save").text("수정"); } }); } @@ -258,12 +266,20 @@ type: "POST", url: url, data: { cmd: 'DELETE', apiId: $('#apiId').val() }, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#btn_delete").text("처리중 . . . . ."); + }, success: function() { alert("<%= localeMessage.getString("common.deleteMsg") %>"); window.close(); }, error: function(e) { alert(e.responseText); + }, + complate: function() { + $("[id^='btn_']").prop("disabled", false); + $("#btn_delete").text("삭제"); } }); } @@ -276,6 +292,10 @@ cmd: 'GENERATE_SPEC', apiId: $('#apiId').val() }, + beforeSend: function() { + $("[id^='btn_']").prop("disabled", true); + $("#btn_generate_spec").text("처리중 . . . . ."); + }, success: function(data) { // Update the editors with generated content $('#apiRequestSpec').summernote('code', data.requestSpec); @@ -288,6 +308,10 @@ }, error: function(e) { alert("API 스펙 생성 중 오류가 발생했습니다: " + e.responseText); + }, + complate: function() { + $("[id^='btn_']").prop("disabled", false); + $("#btn_generate_spec").text("SPEC 자동 생성"); } }); } diff --git a/readme.md b/readme.md index 42e0350..f6ee150 100644 --- a/readme.md +++ b/readme.md @@ -446,6 +446,9 @@ WebContent/ -Dlogback.configurationFile=classpath:logback-dev.xml -Dhibernate.dialect=org.hibernate.dialect.Oracle12cDialect -Dkjb_safedb.mode=fake + + +-Dlogback.configurationFile="C:\eactive\workspaces\kjb-eapim\eapim-admin\src\main\resources\logback-rinjae.xml" ``` ### 데이터베이스 지원 diff --git a/src/main/java/com/eactive/eai/rms/bap/manage/work/message/BapMessageProcController.java b/src/main/java/com/eactive/eai/rms/bap/manage/work/message/BapMessageProcController.java index 7b17e67..e619b21 100644 --- a/src/main/java/com/eactive/eai/rms/bap/manage/work/message/BapMessageProcController.java +++ b/src/main/java/com/eactive/eai/rms/bap/manage/work/message/BapMessageProcController.java @@ -156,7 +156,20 @@ public class BapMessageProcController extends BapBaseAnnotationController { ModelAndView modelAndView = new ModelAndView("jsonView",resultMap); return modelAndView; } - + + @RequestMapping(value= "/bap/admin/work/messageProcMan.json",params = "cmd=LIST_UAPPL_COMBO") + public ModelAndView initUapplCdCombo( HttpServletRequest request, + HttpServletResponse response) throws Exception { + + List> uapplCd = comboService.selectCM01ComboList("TRIM(EAIBZWKDSTCD)", "BZWKDSTICNAME"); + Map resultMap = new HashMap(); + + resultMap.put("uapplCd" , uapplCd); + + ModelAndView modelAndView = new ModelAndView("jsonView",resultMap); + return modelAndView; + } + @RequestMapping(value= "/bap/admin/work/messageProcMan.json",params = "cmd=LIST_PROP") public ModelAndView getProps( HttpServletRequest request, HttpServletResponse response, diff --git a/src/main/java/com/eactive/eai/rms/common/acl/menu/MenuRenderController.java b/src/main/java/com/eactive/eai/rms/common/acl/menu/MenuRenderController.java index 93df087..be2eb0a 100644 --- a/src/main/java/com/eactive/eai/rms/common/acl/menu/MenuRenderController.java +++ b/src/main/java/com/eactive/eai/rms/common/acl/menu/MenuRenderController.java @@ -122,5 +122,16 @@ public class MenuRenderController extends BaseAnnotationController { return "/common/screen/top_04"; } + + /** + * 메뉴권한 미존재 유저 접속 시 빈 화면 frame 노출 20251126 + * + * @return 빈 화면 (blank_screen) + */ + @GetMapping("/blankScreen.do") + public String getBlankScreen(HttpServletRequest request, String serviceType, ModelMap modelMap) throws Exception { + return "/common/screen/blank_screen"; + } + } diff --git a/src/main/java/com/eactive/eai/rms/common/filter/CrossScriptingFilter.java b/src/main/java/com/eactive/eai/rms/common/filter/CrossScriptingFilter.java index c01f2cb..498cc45 100644 --- a/src/main/java/com/eactive/eai/rms/common/filter/CrossScriptingFilter.java +++ b/src/main/java/com/eactive/eai/rms/common/filter/CrossScriptingFilter.java @@ -12,55 +12,77 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - - + public class CrossScriptingFilter implements Filter { - + private static final Log logger = LogFactory.getLog(CrossScriptingFilter.class); - - public void init(FilterConfig filterConfig) throws ServletException { - - } - - public void destroy() { - - } - - private String getBaseUrl(HttpServletRequest request) { - String uri = request.getRequestURL().toString(); - String servletPath = request.getServletPath(); - String baseUrl = uri.replace(servletPath, ""); - return baseUrl; - } - - private boolean checkReturnUrl(HttpServletRequest request, String returnUrl) { - String uri = request.getRequestURL().toString(); - String servletPath = request.getServletPath(); - String baseUrl = uri.replace(servletPath, ""); + + public void init(FilterConfig filterConfig) throws ServletException { + + } + + public void destroy() { + + } + + /** + * 프록시 환경을 고려하여 baseUrl을 구합니다. + * X-Forwarded-Proto, X-Forwarded-Host 헤더가 있으면 우선 사용합니다. + */ + private String getBaseUrl(HttpServletRequest request) { + String forwardedProto = request.getHeader("X-Forwarded-Proto"); + String forwardedHost = request.getHeader("X-Forwarded-Host"); + + if (forwardedProto != null && forwardedHost != null) { + // 프록시 환경: X-Forwarded 헤더 사용 + String baseUrl = forwardedProto + "://" + forwardedHost; + // :443 포트 제거 (https 기본 포트) + baseUrl = baseUrl.replace(":443", ""); + return baseUrl; + } + + // 직접 접속: 기존 로직 + String uri = request.getRequestURL().toString(); + String servletPath = request.getServletPath(); + String baseUrl = uri.replace(servletPath, ""); + return baseUrl; + } + + private boolean checkReturnUrl(HttpServletRequest request, String returnUrl) { + String baseUrl = getBaseUrl(request); // 25.11.10 - weblogic https://host:443/ 문제 대응 baseUrl = baseUrl.replace(":443", ""); - return returnUrl.startsWith(baseUrl); - } - - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) - throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) req; + + if (logger.isDebugEnabled()) { + logger.debug("checkReturnUrl - baseUrl: " + baseUrl + ", returnUrl: " + returnUrl); + } + + return returnUrl.startsWith(baseUrl); + } + + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; - - String returnUrl = (String)request.getParameter("returnUrl"); - if(returnUrl != null) { - if(!checkReturnUrl(request, returnUrl)) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST, "bad request. - "+returnUrl); - return; - } - } - - // Web Cache Deception - response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); - response.setHeader("Pragma", "no-cache"); - response.setDateHeader("Expires", 0); - - chain.doFilter(new RequestWrapper(request), response); + + String returnUrl = (String) request.getParameter("returnUrl"); + if (returnUrl != null) { + if (!checkReturnUrl(request, returnUrl)) { + logger.warn("returnUrl validation failed - baseUrl: " + getBaseUrl(request) + + ", returnUrl: " + returnUrl + + ", X-Forwarded-Proto: " + request.getHeader("X-Forwarded-Proto") + + ", X-Forwarded-Host: " + request.getHeader("X-Forwarded-Host")); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "bad request. - " + returnUrl); + return; + } + } + + // Web Cache Deception + response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + + chain.doFilter(new RequestWrapper(request), response); // // if(servletPath.startsWith("/onl/admin/common")) { // System.out.println("RequestWrapper called"); @@ -69,6 +91,6 @@ public class CrossScriptingFilter implements Filter { // else { // chain.doFilter(request, response); // } - } - + } + } diff --git a/src/main/java/com/eactive/eai/rms/common/logging/EntityServiceLoggingAspect.java b/src/main/java/com/eactive/eai/rms/common/logging/EntityServiceLoggingAspect.java index ab5403a..3ee4483 100644 --- a/src/main/java/com/eactive/eai/rms/common/logging/EntityServiceLoggingAspect.java +++ b/src/main/java/com/eactive/eai/rms/common/logging/EntityServiceLoggingAspect.java @@ -19,10 +19,10 @@ public class EntityServiceLoggingAspect { @Before("executionEntityServicePointcut()") public void entityService(JoinPoint joinPoint) { - Logger logger = LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringType()); - if (logger.isDebugEnabled()) { - logger.debug("{}", joinPoint.getSignature().toShortString()); - } +// Logger logger = LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringType()); +// if (logger.isDebugEnabled()) { +// logger.debug("{}", joinPoint.getSignature().toShortString()); +// } } } diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/unifbwk/UnifBwkTpService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/unifbwk/UnifBwkTpService.java index d944e17..65950b8 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/unifbwk/UnifBwkTpService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/unifbwk/UnifBwkTpService.java @@ -20,6 +20,7 @@ import com.eactive.eai.data.entity.onl.unifbwk.UnifBwkTp; import com.eactive.eai.data.jpa.AbstractDataService; import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.QUserBusiness; import com.eactive.eai.rms.onl.manage.comm.unifbwk.UnifbwkUISearch; +import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -54,12 +55,27 @@ public class UnifBwkTpService extends AbstractDataService findAllwithSearch(String searchBzwkName) { QUnifBwkTp qUnifBwkTp = QUnifBwkTp.unifBwkTp; + + BooleanBuilder builder = new BooleanBuilder(); + + if(StringUtils.isNotBlank(searchBzwkName)) { + + String[] keywords = searchBzwkName.split(","); + + for(String keyword : keywords) { + + String param = keyword.trim(); + + BooleanExpression predicate = QUnifBwkTp.unifBwkTp.bzwkdsticname + .containsIgnoreCase(param) + .or(qUnifBwkTp.eaibzwkdstcd.containsIgnoreCase(param)); + + builder.or(predicate); + } + + } - BooleanExpression predicate = QUnifBwkTp.unifBwkTp.bzwkdsticname - .containsIgnoreCase(searchBzwkName) - .or(qUnifBwkTp.eaibzwkdstcd.containsIgnoreCase(searchBzwkName)); - - return repository.findAll(predicate, qUnifBwkTp.eaibzwkdstcd.asc()); + return repository.findAll(builder, qUnifBwkTp.eaibzwkdstcd.asc()); } public Page findPageWithSearch(Pageable pageable, UnifbwkUISearch unifbwkUISearch) { diff --git a/src/main/java/com/eactive/eai/rms/onl/adapter/http/httpStatus/HttpStatusController.java b/src/main/java/com/eactive/eai/rms/onl/adapter/http/httpStatus/HttpStatusController.java index e4a45da..6ca21eb 100644 --- a/src/main/java/com/eactive/eai/rms/onl/adapter/http/httpStatus/HttpStatusController.java +++ b/src/main/java/com/eactive/eai/rms/onl/adapter/http/httpStatus/HttpStatusController.java @@ -104,7 +104,7 @@ public class HttpStatusController extends BaseController { list.removeIf(m -> m.get("adapterGroupSimple") == null || m.get("adapterGroupSimple") == ""); // 어댑터 업무그룹별 정렬 - String[] compareParam = { "adapterGroupName", "eaiSvrInstNm" }; + String[] compareParam = { "adapterStatus", "adapterGroupName", "eaiSvrInstNm" }; MapComparator comp = new MapComparator(compareParam); Collections.sort(list, comp); return ResponseEntity.ok(new GridResponse<>(list)); diff --git a/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketProcessController.java b/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketProcessController.java index e7400ce..29966a1 100644 --- a/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketProcessController.java +++ b/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketProcessController.java @@ -129,8 +129,8 @@ public class SocketProcessController extends BaseController{ pageVo.setTotalCount(list.size()); //어댑터 업무그룹별 정렬 - String[] compareParam = {"AdptrBzwkGroupName","EaiSevrInstncName"}; - + String[] compareParam = {"Status","AdptrBzwkGroupName","EaiSevrInstncName"}; + MapComparator comp = new MapComparator(compareParam); Collections.sort(list,comp); diff --git a/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketStatusController.java b/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketStatusController.java index 1bb219f..c91a1c0 100644 --- a/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketStatusController.java +++ b/src/main/java/com/eactive/eai/rms/onl/adapter/socket/SocketStatusController.java @@ -91,7 +91,7 @@ public class SocketStatusController extends BaseController { List urls = new ArrayList<>(); for (EAIServer serverMap : serverList) { String url = "http://" + serverMap.getEaisevrip() + ":" + serverMap.getSevrlsnportname() - + HostInfomationForm.WEB_AGENT_CONTEXT_PATH + AGENT_PAGE_STATUS + "?adapterType=SOC" + + HostInfomationForm.WEB_AGENT_CONTEXT_PATH + AGENT_PAGE_STATUS + "?adapterType=NET" + "&eaiSvrInstNm=" + serverMap.getEaisevrinstncname(); urls.add(url); logger.debug(url); @@ -120,7 +120,7 @@ public class SocketStatusController extends BaseController { List> list = gUtil.flushXmlToClient(urls); // 어댑터 업무그룹별 정렬 - String[] compareParam = { "AdptrBzwkGroupName", "EaiSevrInstncName", "AdptrBzwkName" }; + String[] compareParam = { "Status", "AdptrBzwkGroupName", "EaiSevrInstncName", "AdptrBzwkName" }; MapComparator comp = new MapComparator(compareParam); Collections.sort(list, comp); diff --git a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceController.java b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceController.java index ecb0b7c..0cfa70f 100644 --- a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceController.java +++ b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceController.java @@ -21,6 +21,7 @@ import org.springframework.dao.DuplicateKeyException; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -208,7 +209,6 @@ public class ApiInterfaceController extends OnlBaseAnnotationController { } } - @PostMapping(value = "/onl/transaction/apim/apiInterfaceMan.excel", params = "cmd=DETAIL_EXPORT_TO_EXCEL") public ResponseEntity detailExportToExcel(@RequestParam(name = "eaiSvcName") String eaiSvcName) throws Exception { // 단일 파일 처리 @@ -228,20 +228,22 @@ public class ApiInterfaceController extends OnlBaseAnnotationController { } @PostMapping(value = "/onl/transaction/apim/apiInterfaceMan.file", params = "cmd=LIST_IMPORT_FILE") - public ResponseEntity listImportFromExcel(@RequestParam("file") MultipartFile file) { + public ResponseEntity listImportFromJson(@RequestParam("file") MultipartFile file, boolean importDupliCheck) { try { if (file != null) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()).toLowerCase(); - if("xls".equals(extension) || "xlsx".equals(extension)){ - ApiInterfaceReloadSyncSet apiInterfaceExportSetUI = service.importInterfaceFromExcel(file); - reloadSync(apiInterfaceExportSetUI.getApiInterfaceUI()); - return ResponseEntity.ok().body("File successfully imported"); - } else if("json".equals(extension)) { - ApiInterfaceReloadSyncSet apiInterfaceExportSetUI = service.importInterfaceFromJson(file); + if("json".equals(extension)) { + ApiInterfaceReloadSyncSet apiInterfaceExportSetUI = service.importInterfaceFromJson(file, importDupliCheck); reloadSync(apiInterfaceExportSetUI.getApiInterfaceUI()); return ResponseEntity.ok().body("File successfully imported"); + } else { + throw new IllegalStateException("파일 [ " + file.getOriginalFilename() + " ] 의 확장자가 JSON 이 아닙니다. 다시 시도하세요."); } } + } catch (IllegalStateException dupEx) { + return ResponseEntity + .status(HttpStatus.CONFLICT) + .body(dupEx.getMessage()); } catch (Exception e) { logger.error("Error processing file", e); return ResponseEntity.internalServerError().body("Error processing file - "+e.getMessage() ); @@ -269,10 +271,10 @@ public class ApiInterfaceController extends OnlBaseAnnotationController { } @PostMapping(value = "/onl/transaction/apim/apiInterfaceMan.json", params = "cmd=CLONE") - public ResponseEntity cloneApiInterface(String orgApiInterfaceId, String newBizCode, String newApiInterfaceId, String newInboundHttpMethod, String newInboundRestPath) throws BizException { + public ResponseEntity cloneApiInterface(String orgApiInterfaceId, String newBizCode, String newApiInterfaceId, String newInboundHttpMethod, String newInboundRestPath, boolean importDupliCheck) throws BizException { try { ApiInterfaceUI orgApiInterfaceUI = service.selectDetail(orgApiInterfaceId); - ApiInterfaceUI apiInterfaceUI = service.cloneApiInterface(orgApiInterfaceUI, newBizCode, newApiInterfaceId, newInboundHttpMethod, newInboundRestPath); + ApiInterfaceUI apiInterfaceUI = service.cloneApiInterface(orgApiInterfaceUI, newBizCode, newApiInterfaceId, newInboundHttpMethod, newInboundRestPath, importDupliCheck); Map resultMap = reloadSync(apiInterfaceUI); return ResponseEntity.ok(resultMap); } catch(Exception e) { diff --git a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceService.java b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceService.java index c401f87..416553c 100644 --- a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceService.java +++ b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ApiInterfaceService.java @@ -588,6 +588,31 @@ public class ApiInterfaceService extends OnlBaseService { // 비표준에서 표준으로 가는 경우 표준으로 전환하기 위한 정보 이므로 내부로 갈 때만 처리 String eaiServiceName = vo.getEaiSvcName(); + + // 25.11.25 HS04 APIFULLPATH 추가. + List adapters = adapterGroup.getAdapters(); + + for (AdapterUI adapter : adapters) { + + // propGroup NULL 체크 + if(adapter.getAdapterPropGroup() == null) continue; + + List props = adapter.getAdapterPropGroup().getAdapterProps(); + + if (props != null) { + for (AdapterPropUI prop : props) { + if("API_PATH".equals(prop.getPrptyname())) { + + String fullPath = prop.getPrpty2val() + "/" + vo.getInboundRestPath(); + vo.setApiFullPath(fullPath); + + break; + } + } + } + + } + if (!"RST".equals(adapterGroup.getAdptrcd())) { throw new RuntimeException("인바운드 어댑터가 타입이 REST가 아닙니다. 타입을 확인하세요"); @@ -836,7 +861,8 @@ public class ApiInterfaceService extends OnlBaseService { apiInterfaceUI.setSendRecvType(sendRecvType); apiInterfaceUI.setInOutType(inOutType); } - + + /* 25.11.25 광주은행 엑셀 가져오기 기능 사용안함. public ApiInterfaceUI importInterfaceExcelSheet(Sheet sheet) throws Exception { String bizCode = PoiUtils.getCellValue(sheet, 1, 3); String elinkServiceId = PoiUtils.getCellValue(sheet, 1, 5); @@ -910,16 +936,27 @@ public class ApiInterfaceService extends OnlBaseService { return apiInterfaceUI; } + */ - private void importApiInterfaceUi(ApiInterfaceUI apiInterfaceUI) throws Exception { + private void importApiInterfaceUi(ApiInterfaceUI apiInterfaceUI, boolean importDupliCheck) throws Exception { String elinkServiceId = apiInterfaceUI.getEaiSvcName(); - if (!eaiMessageQueryService.existsById(elinkServiceId)) { - insert(apiInterfaceUI); + + // 중복검사 실시 + boolean elinkServiceIdExists = eaiMessageQueryService.existsById(elinkServiceId); + + // 아이디가 중복 일 경우, 중복검사 체크여부에 따라 업데이트 진행. + if (elinkServiceIdExists) { + // 중복검사 체크시 반환시킴 + if (importDupliCheck) { + throw new IllegalStateException("ApiInterfaceId already exists [ " + elinkServiceId + " ]" ); + } else { + update(apiInterfaceUI); + } } else { - update(apiInterfaceUI); + insert(apiInterfaceUI); } } - + /* 25.11.25 광주은행 엑셀 가져오기 기능 사용안함. public ApiInterfaceReloadSyncSet importInterfaceFromExcel(MultipartFile file) throws Exception { if (file.isEmpty()) { throw new IOException("File is empty"); @@ -958,8 +995,9 @@ public class ApiInterfaceService extends OnlBaseService { } return apiInterfaceReloadSyncSet; } + */ - public ApiInterfaceReloadSyncSet importInterfaceFromJson(MultipartFile file) throws Exception { + public ApiInterfaceReloadSyncSet importInterfaceFromJson(MultipartFile file, boolean importDupliCheck) throws Exception { if (file.isEmpty()) { throw new IOException("File is empty"); } @@ -983,7 +1021,7 @@ public class ApiInterfaceService extends OnlBaseService { importAndAddReloadSetTransform(transformUIList, apiInterfaceExportSetUI.getRequestTransform()); importAndAddReloadSetTransform(transformUIList, apiInterfaceExportSetUI.getResponseTransform()); - importApiInterfaceUi(apiInterfaceExportSetUI.getApiInterfaceUI()); + importApiInterfaceUi(apiInterfaceExportSetUI.getApiInterfaceUI(), importDupliCheck); apiInterfaceReloadSyncSet.setApiInterfaceUI(apiInterfaceExportSetUI.getApiInterfaceUI()); return apiInterfaceReloadSyncSet; @@ -1108,12 +1146,17 @@ public class ApiInterfaceService extends OnlBaseService { return updatedString; } - public ApiInterfaceUI cloneApiInterface(ApiInterfaceUI orgApiInterfaceUI, String newBizCd, String newApiInterfaceId, String newInboundHttpMethod, String newInboundRestPath) throws Exception { + public ApiInterfaceUI cloneApiInterface(ApiInterfaceUI orgApiInterfaceUI, String newBizCd, + String newApiInterfaceId, String newInboundHttpMethod, + String newInboundRestPath, boolean importDupliCheck) throws Exception { + Optional optional = eaiMessageQueryService.findById(newApiInterfaceId); if (optional.isPresent()) { String bzwkDstcd = optional.get().getEaibzwkdstcd(); throw new BizException("[" + bzwkDstcd + "][" + newApiInterfaceId + "]로 이미 등록된 인터페이스입니다.\n조회가 되지 않을 시 담당자에게 문의바랍니다."); } + + importDupliCheck = false; // 중복검사 완료. ApiInterfaceUI apiInterfaceUI = orgApiInterfaceUI; apiInterfaceUI.setEaiBzwkDstcd(newBizCd); @@ -1132,7 +1175,7 @@ public class ApiInterfaceService extends OnlBaseService { apiInterfaceUI.setResponseTransform(changeToTargetTransformUI(transform2Service.getTransformUiToExport(apiInterfaceUI.getResponseTransform()), newBizCd, newApiInterfaceId, apiInterfaceUI.getOutboundResponseLayout(), apiInterfaceUI.getInboundResponseLayout())); } - importApiInterfaceUi(apiInterfaceUI); + importApiInterfaceUi(apiInterfaceUI, importDupliCheck); return apiInterfaceUI; } diff --git a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/mapping/ApiInterfaceUIMapper.java b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/mapping/ApiInterfaceUIMapper.java index c70d363..c933b63 100644 --- a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/mapping/ApiInterfaceUIMapper.java +++ b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/mapping/ApiInterfaceUIMapper.java @@ -148,6 +148,7 @@ public interface ApiInterfaceUIMapper { @Mapping(target = "eaisendrecv", source = "sendRecvType") @Mapping(target = "eaidirection", source = "inOutType") @Mapping(target = "standardMessageItems", source = "standardMessageItems") + @Mapping(target = "apiFullPath", source = "apiFullPath") StandardMessageInfo toStandardMessageInfo(ApiInterfaceUI vo); @AfterMapping diff --git a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ui/ApiInterfaceUI.java b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ui/ApiInterfaceUI.java index 82ee29f..a464377 100644 --- a/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ui/ApiInterfaceUI.java +++ b/src/main/java/com/eactive/eai/rms/onl/transaction/apim/ui/ApiInterfaceUI.java @@ -49,6 +49,8 @@ public class ApiInterfaceUI { private List headerValues; private List standardMessageItems; private List inboundResponseStandardMessageItems ; + + private String apiFullPath; //ASYNC-SYNC 용 private String inboundResponseHttpMethod; diff --git a/src/main/resources/logback-dev.xml b/src/main/resources/logback-dev.xml index 7ccceed..c0df758 100644 --- a/src/main/resources/logback-dev.xml +++ b/src/main/resources/logback-dev.xml @@ -1,6 +1,6 @@ - + diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index eaa7baa..bf687a4 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,6 +1,6 @@ - +