Merge branch 'jenkins_with_weblogic'
# Conflicts: # WebContent/WEB-INF/properties/env.P.properties
This commit is contained in:
+4
-1
@@ -239,4 +239,7 @@ gradle-app.setting
|
||||
Doc/
|
||||
docs
|
||||
build-gf63.sh
|
||||
gradle-gf63.sh
|
||||
gradle-gf63.sh
|
||||
|
||||
|
||||
eapim-admin-kjb/
|
||||
@@ -2,14 +2,11 @@
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<jta-data-source>jdbc/dsOBP_EMS</jta-data-source>
|
||||
<properties>
|
||||
<property name="hibernate.dialect"
|
||||
value="org.hibernate.dialect.Oracle12cDialect" />
|
||||
<property name="javax.persistence.validation.mode"
|
||||
value="NONE" />
|
||||
<property name="eclipselink.weaving.validation" value="false" />
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
|
||||
<property name="javax.persistence.validation.mode" value="NONE" />
|
||||
<property name="eclipselink.weaving.validation" value="false" />
|
||||
</properties>
|
||||
<class>com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness
|
||||
</class>
|
||||
<class>com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness</class>
|
||||
<class>com.eactive.eai.data.entity.onl.unifbwk.UnifBwkTp</class>
|
||||
<exclude-unlisted-classes>false</exclude-unlisted-classes>
|
||||
</persistence-unit>
|
||||
@@ -17,14 +14,11 @@
|
||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||
<jta-data-source>jdbc/dsOBP_EMS</jta-data-source>
|
||||
<properties>
|
||||
<property name="hibernate.dialect"
|
||||
value="org.hibernate.dialect.Oracle12cDialect" />
|
||||
<property name="javax.persistence.validation.mode"
|
||||
value="NONE" />
|
||||
<property name="eclipselink.weaving.validation" value="false" />
|
||||
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
|
||||
<property name="javax.persistence.validation.mode" value="NONE" />
|
||||
<property name="eclipselink.weaving.validation" value="false" />
|
||||
</properties>
|
||||
<class>com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness
|
||||
</class>
|
||||
<class>com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness</class>
|
||||
<class>com.eactive.eai.data.entity.onl.unifbwk.UnifBwkTp</class>
|
||||
<exclude-unlisted-classes>false</exclude-unlisted-classes>
|
||||
</persistence-unit>
|
||||
@@ -41,9 +41,7 @@
|
||||
</context:component-scan>
|
||||
|
||||
<!-- elink-common 적용 후 추가 -->
|
||||
<context:component-scan
|
||||
base-package="com.eactive.eai.adapter.loader">
|
||||
</context:component-scan>
|
||||
<context:component-scan base-package="com.eactive.eai.adapter.loader" />
|
||||
<context:component-scan base-package="com.eactive.eai.common.b2badaptermapping.loader"/>
|
||||
<context:component-scan base-package="com.eactive.eai.common.b2bextractor.loader"/>
|
||||
<context:component-scan base-package="com.eactive.eai.common.b2bservice.loader"/>
|
||||
@@ -66,15 +64,10 @@
|
||||
<context:component-scan base-package="com.eactive.eai.common.sysdomain.loader"/>
|
||||
<context:component-scan base-package="com.eactive.eai.common.unifbwk.loader"/>
|
||||
<context:component-scan base-package="com.eactive.eai.common.usedate.loader"/>
|
||||
<context:component-scan
|
||||
base-package="com.eactive.eai.flowcontrol.jms.loader">
|
||||
</context:component-scan>
|
||||
<context:component-scan
|
||||
base-package="com.eactive.eai.inbound.error.loader">
|
||||
</context:component-scan>
|
||||
<context:component-scan
|
||||
base-package="com.eactive.apim.portal">
|
||||
</context:component-scan>
|
||||
<context:component-scan base-package="com.eactive.eai.flowcontrol.jms.loader" />
|
||||
<context:component-scan base-package="com.eactive.eai.inbound.error.loader" />
|
||||
<context:component-scan base-package="com.eactive.apim.portal" />
|
||||
|
||||
|
||||
<bean id="cacheManager"
|
||||
class="org.springframework.cache.ehcache.EhCacheCacheManager">
|
||||
@@ -92,9 +85,9 @@
|
||||
<!-- schema 를 설정 하지 않으면 RoutingDataSource에 의해 각 설정에 맞는 DB에 접근 한다. -->
|
||||
<prop key="hibernate.hbm2ddl.auto">none</prop>
|
||||
<prop key="hibernate.format_sql">true</prop>
|
||||
<prop key="hibernate.show_sql">true</prop>
|
||||
<prop key="hibernate.dialect">${hibernate.dialect:org.hibernate.dialect.Oracle12cDialect}
|
||||
</prop>
|
||||
<prop key="hibernate.show_sql">false</prop> <!-- true 할경우 STDOUT 출력이 강제됨 -->
|
||||
<prop key="hibernate.type">trace</prop>
|
||||
<prop key="hibernate.dialect">${hibernate.dialect:org.hibernate.dialect.Oracle12cDialect}</prop>
|
||||
<prop key="hibernate.jdbc.batch_size">100</prop>
|
||||
<prop key="hibernate.jdbc.fetch_size">100</prop>
|
||||
|
||||
|
||||
@@ -52,8 +52,10 @@
|
||||
</bean>
|
||||
<!-- <bean id="passwordEncoder"-->
|
||||
<!-- class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />-->
|
||||
<bean id="passwordEncoder"
|
||||
class="org.springframework.security.crypto.password.StandardPasswordEncoder" />
|
||||
<bean id="passwordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" />
|
||||
|
||||
<!-- 광주은행 전용 PasswordEncoder -->
|
||||
<bean id="kjbSafedbPasswordEncoder" class="com.eactive.ext.kjb.spring.KjbSafedbPasswordEncoder" />
|
||||
|
||||
<import resource="applicationContext-datasource-${eai.datasource.type}.xml"/>
|
||||
<import resource="applicationContext-jdbc-${eai.datasource.type}.xml"/>
|
||||
|
||||
@@ -14,5 +14,5 @@ eai.tableowner=EMSADM
|
||||
# P/T/D/S
|
||||
eai.systemmode=P
|
||||
eai.drmode=N
|
||||
# black / blue / green / orange / yellow
|
||||
# black / blue / green / orange / yellow
|
||||
theme.color=blue
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
<container-descriptor>
|
||||
<prefer-application-packages>
|
||||
<packate-name>org.apach.ignite.*</packate-name>
|
||||
<package-name>org.apach.ignite.*</package-name>
|
||||
<package-name>org.slf4j.*</package-name>
|
||||
<package-name>ch.qos.logback.*</package-name>
|
||||
</prefer-application-packages>
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<%@ page import="java.util.Enumeration" %>
|
||||
<%@page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" trimDirectiveWhitespaces="true"%>
|
||||
<%
|
||||
Enumeration<String> names = request.getHeaderNames();
|
||||
while (names.hasMoreElements()) {
|
||||
String name = names.nextElement();
|
||||
out.println(name + ": " + request.getHeader(name));
|
||||
}
|
||||
%>
|
||||
---------
|
||||
request.getScheme(): <%=request.getScheme()%>
|
||||
@@ -86,30 +86,33 @@
|
||||
$("#loginForm").submit();
|
||||
}
|
||||
function changePwd(){
|
||||
if ($("input[name=userId]").val() == null || $("input[name=userId]").val().length == 0 ){
|
||||
if ($("input[name=resetUserId]").val() == null || $("input[name=resetUserId]").val().length == 0 ){
|
||||
alert("<%= localeMessage.getString("login.checkid") %>");
|
||||
$("input[name=userId]").trigger("focus");
|
||||
$("input[name=resetUserId]").trigger("focus");
|
||||
return;
|
||||
}
|
||||
if ($("input[name=password]").val() == null || $("input[name=password]").val().trim().length == 0 ){
|
||||
if ($("input[name=resetPassword]").val() == null || $("input[name=resetPassword]").val().trim().length == 0 ){
|
||||
alert("<%= localeMessage.getString("login.checkpwd1") %>");
|
||||
$("input[name=password]").trigger("focus");
|
||||
$("input[name=resetPassword]").trigger("focus");
|
||||
return;
|
||||
}
|
||||
if ($("input[name=password]").length == 0){
|
||||
if ($("input[name=changePassword]").val() == null || $("input[name=changePassword]").val().trim().length == 0 ){
|
||||
alert("<%= localeMessage.getString("login.checkpwd2") %>");
|
||||
$("input[name=changePassword]").trigger("focus");
|
||||
return ;
|
||||
}
|
||||
if ($("input[name=changePassword]").length == 0){
|
||||
if ($("input[name=confirmPassword]").val() == null || $("input[name=confirmPassword]").val().trim().length == 0 ){
|
||||
alert("<%= localeMessage.getString("login.checkpwd3") %>");
|
||||
return ;
|
||||
}
|
||||
if ($("input[name=confirmPassword]").val() != $("input[name=changePassword]").val()){
|
||||
if ($("input[name=confirmPassword]").val() != $("input[name=confirmPassword]").val()){
|
||||
alert("<%= localeMessage.getString("login.checkpwd4") %>");
|
||||
$("input[name=confirmPassword]").trigger("focus");
|
||||
return ;
|
||||
}
|
||||
if ($("input[name=userId]").val() == $("input[name=changePassword]").val()){
|
||||
if ($("input[name=resetUserId]").val() == $("input[name=changePassword]").val()){
|
||||
alert("<%= localeMessage.getString("login.checkpwd5") %>");
|
||||
$("input[name=changePassword]").trigger("focus");
|
||||
return ;
|
||||
}
|
||||
|
||||
@@ -121,21 +124,6 @@
|
||||
--%>
|
||||
$("form").submit();
|
||||
}
|
||||
|
||||
function openPwdChgWindow() {
|
||||
|
||||
<%
|
||||
if(sysMode.equals("T") || sysMode.equals("D")) {
|
||||
%>
|
||||
windowOpen("http://ssodev.kbankwithu.com:7010", "PopupWindow", 1024, 768);
|
||||
<%
|
||||
} else {
|
||||
%>
|
||||
windowOpen("https://ssoap.kbankwithu.com/nls3/clientLogin.jsp", "PopupWindow", 1024, 768);
|
||||
<%
|
||||
}
|
||||
%>
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
$("input[name=userId]").keydown(function(event){
|
||||
@@ -215,18 +203,18 @@
|
||||
<input type="button" id ="btn_login" class="form-control btn btn-primary rounded submit px-3" value="Login">
|
||||
</div>
|
||||
<div style="text-align: right !important;" class="form-group">
|
||||
<a style="font-size: 12px !important;" href="#pwdChgSsoModal" onclick="openPwdChgWindow()" >Password Change</a>
|
||||
<!-- <a style="font-size: 12px !important;" href="#pwdChgModal" data-toggle="modal" >Password Change</a> -->
|
||||
<a style="font-size: 12px !important;" href="#pwdChgModal" data-toggle="modal" >Password Change</a>
|
||||
</div>
|
||||
<p style="color:red;"><%=resultMsg %></p>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<%-- <div class="modal fade" id="pwdChgModal" tabindex="-1" role="dialog" aria-labelledby="pwdChgModalLabel" aria-hidden="true">
|
||||
<div class="modal fade" id="pwdChgModal" tabindex="-1" role="dialog" aria-labelledby="pwdChgModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
@@ -238,10 +226,10 @@
|
||||
<form name="form" id="modalLoginForm" action="<c:url value="/changePassword.do"/>" method="post">
|
||||
<div class="modal-body">
|
||||
<div class="form-group d-flex">
|
||||
<input type="text" name="userId" class="form-control rounded-left" placeholder="User Id" required>
|
||||
<input type="text" name="resetUserId" class="form-control rounded-left" placeholder="User Id" required>
|
||||
</div>
|
||||
<div class="form-group d-flex">
|
||||
<input type="password" name="password" class="form-control rounded-left" placeholder="<%= localeMessage.getString("login.placeholderCurrentPassword") %>" required>
|
||||
<input type="password" name="resetPassword" class="form-control rounded-left" placeholder="<%= localeMessage.getString("login.placeholderCurrentPassword") %>" required>
|
||||
</div>
|
||||
<p><%= localeMessage.getString("login.toChangePasswordMessage") %></p>
|
||||
<div class="form-group d-flex">
|
||||
@@ -257,7 +245,7 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div> --%>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -205,14 +205,11 @@
|
||||
|
||||
if (isDetail){
|
||||
$("#title").append(" 수정")
|
||||
$("#btn_modify").prop('disabled', true);
|
||||
$("#btn_unmask").show();
|
||||
buttonControl(true);
|
||||
} else {
|
||||
$("#title").append(" 등록")
|
||||
$("#managerInfoSectionTitle").hide();
|
||||
$("#btn_modify").html('<i class="material-icons">save</i> <%= localeMessage.getString("button.register") %></button>');
|
||||
$("#btn_unmask").hide();
|
||||
buttonControl(false);
|
||||
}
|
||||
|
||||
@@ -397,69 +394,6 @@
|
||||
downloadFile(fileId, '1'); // fileSn은 '1'로 가정
|
||||
});
|
||||
|
||||
$("#btn_unmask").click(function () {
|
||||
if (!isDetail) {
|
||||
alert("등록된 정보만 마스킹 해제할 수 있습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var reason = prompt("마스킹 해제 사유를 입력해 주세요");
|
||||
|
||||
if (reason != null && reason.trim() !== '') {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
data: {
|
||||
cmd: "UNMASK",
|
||||
id: key,
|
||||
reason: reason // reason 파라미터 추가
|
||||
},
|
||||
success: function (json) {
|
||||
var portalOrgData = json.portalOrg;
|
||||
var corporateManagerData = json.corporateManager;
|
||||
|
||||
// 마스킹 해제된 데이터를 화면에 반영
|
||||
$("#orgName").val(portalOrgData.orgName);
|
||||
$("#orgCode").val(portalOrgData.orgCode);
|
||||
$("#compRegNo").val(portalOrgData.compRegNo);
|
||||
$("#corpRegNo").val(portalOrgData.corpRegNo);
|
||||
$("#ceoName").val(portalOrgData.ceoName);
|
||||
$("#orgAddr").val(portalOrgData.orgAddr);
|
||||
|
||||
$("#ipListBody").empty(); // 기존 IP 목록 삭제
|
||||
if (portalOrgData.ipWhitelist) {
|
||||
var ipList = portalOrgData.ipWhitelist.split(',');
|
||||
ipList.forEach(function(ip, index) {
|
||||
var trimmedIp = ip.trim();
|
||||
if (trimmedIp) {
|
||||
addIpToTable(trimmedIp, index + 1);
|
||||
}
|
||||
});
|
||||
$("#ipWhitelist").val(portalOrgData.ipWhitelist);
|
||||
}
|
||||
|
||||
if (corporateManagerData) {
|
||||
$("#userName").text(corporateManagerData.userName);
|
||||
$("#userStatusDescription").text(corporateManagerData.userStatusDescription);
|
||||
$("#emailAddr").text(corporateManagerData.emailAddr);
|
||||
$("#mobileNumber").text(corporateManagerData.mobileNumber);
|
||||
}
|
||||
|
||||
// 마스킹 해제 성공 시 수정 버튼 활성화
|
||||
$("#btn_modify").prop('disabled', false);
|
||||
$("#btn_unmask").prop('disabled', true); // 마스킹 해제 버튼 비활성화
|
||||
alert("마스킹 해제가 완료되었습니다. 이제 데이터를 수정할 수 있습니다.");
|
||||
},
|
||||
error: function (e) {
|
||||
alert("마스킹 해제 중 오류가 발생했습니다. " + e.responseText);
|
||||
}
|
||||
});
|
||||
} else if (reason !== null) {
|
||||
alert("마스킹 해제 사유를 입력해 주세요.");
|
||||
}
|
||||
});
|
||||
|
||||
$("#btn_modify").click(function(){
|
||||
if (!checkRequired("ajaxForm")) return;
|
||||
|
||||
@@ -611,7 +545,6 @@
|
||||
</div><!-- end content_top -->
|
||||
<div class="content_middle">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_unmask" level="W" status="DETAIL"><i class="material-icons">lock_open</i> 마스킹해제</button>
|
||||
<button type="button" class="cssbtn" id="btn_modify" level="W" status="DETAIL,NEW"><i class="material-icons">save</i> <%= localeMessage.getString("button.modify") %></button>
|
||||
<button type="button" class="cssbtn" id="btn_delete" level="W" status="DETAIL"><i class="material-icons">delete</i> <%= localeMessage.getString("button.delete") %></button>
|
||||
<button type="button" class="cssbtn" id="btn_previous" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> <%= localeMessage.getString("button.previous") %></button>
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
.setFormat(nameOptionFormat).rendering();
|
||||
});
|
||||
|
||||
setSearchable('searchOrgId');
|
||||
|
||||
putSelectFromParam();
|
||||
select_approvalStatus = ": ;" + getGridSelectText("CODE", "NAME", json.approvalStatusRows);
|
||||
select_userStatus = ": ;" + getGridSelectText("CODE", "NAME", json.userStatusRows);
|
||||
@@ -86,7 +88,7 @@
|
||||
'<%= localeMessage.getString("portalUser.orgName") %>',
|
||||
'<%= localeMessage.getString("portalUser.name") %>',
|
||||
'<%= localeMessage.getString("portalUser.userId") %>',
|
||||
'<%= localeMessage.getString("portalUser.mobile") %>',
|
||||
<%--'<%= localeMessage.getString("portalUser.mobile") %>',--%>
|
||||
'<%= localeMessage.getString("portalUser.roleName") %>',
|
||||
'<%= localeMessage.getString("portalUser.userStatus") %>',
|
||||
'<%= localeMessage.getString("portalUser.createOn") %>',
|
||||
@@ -98,7 +100,7 @@
|
||||
{name: 'portalOrgUIs.orgName', align: 'center', width: "120"},
|
||||
{name: 'userName', align: 'center', width: "80" },
|
||||
{name: 'loginId', align: 'center', width: "150" },
|
||||
{name: 'mobileNumber', align: 'center', width: "100" },
|
||||
// {name: 'mobileNumber', align: 'center', width: "100" },
|
||||
{name: 'roleCodeDescription', align: 'center', width: "80"},
|
||||
{name: 'userStatusDescription', align: 'center', width: "50"},
|
||||
{name: 'createdDate', align: 'center', width: "100", formatter: timeStampFormat},
|
||||
@@ -232,7 +234,9 @@
|
||||
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.name") %>
|
||||
</th>
|
||||
<td><input type="text" name="searchUserName"></td>
|
||||
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.userId") %>
|
||||
|
||||
<th style="width:10%; min-width:100px;">
|
||||
<%= localeMessage.getString("portalUser.userId") %>
|
||||
</th>
|
||||
<td><input type="text" name="searchUserId" value="${param.searchUserId}"></td>
|
||||
<th style="width:10%; min-width:100px;"><%= localeMessage.getString("portalUser.mobileNumber") %>
|
||||
|
||||
@@ -66,16 +66,18 @@
|
||||
|
||||
// 현재 상태가 탈퇴인 경우
|
||||
if (status === STATUS.REMOVED) {
|
||||
$("#btn_modify").show().prop('disabled', true);
|
||||
$("#btn_modify").show().prop('disabled', false);
|
||||
return;
|
||||
}
|
||||
|
||||
// 일반 상태
|
||||
$("#btn_modify").show().prop('disabled', !isUnmasked);
|
||||
/* $("#btn_modify").show().prop('disabled', !isUnmasked);
|
||||
if (isUnmasked) {
|
||||
$("input, select").prop('disabled', false);
|
||||
updateOrgControl();
|
||||
}
|
||||
} */
|
||||
// 25.09.29 - 항상 해제
|
||||
$("#btn_modify").show().prop('disabled', false);
|
||||
}
|
||||
|
||||
function init() {
|
||||
@@ -183,6 +185,8 @@
|
||||
$('#orgInfoSection').hide();
|
||||
}
|
||||
|
||||
// 25.09.23 - 마스킹 해제 상태를 기본으로 적용 / Rinjae
|
||||
updateButtonStates($("#userStatus").val(), true);
|
||||
},
|
||||
error: function (e) {
|
||||
alert(e.responseText);
|
||||
@@ -259,7 +263,7 @@
|
||||
}
|
||||
|
||||
const fullLoginId = id + "@" + domain;
|
||||
const emailPattern = /^[A-Za-z][A-Za-z0-9._-]*@[A-Za-z0-9][-A-Za-z0-9.]+\.[A-Za-z]{2,}$/;
|
||||
const emailPattern = /^[A-Za-z0-9._-]*@[A-Za-z0-9][-A-Za-z0-9.]+\.[A-Za-z]{2,}$/;
|
||||
if (!emailPattern.test(fullLoginId)) {
|
||||
alert(fullLoginId + " 은 올바른 이메일 형식이 아닙니다.");
|
||||
return;
|
||||
@@ -530,9 +534,11 @@
|
||||
</div>
|
||||
<div class="content_middle">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_unmask" level="W" status="DETAIL">
|
||||
<!-- 2025.09.23 - 마스킹 해제 상태를 기본으로 적용 / Rinjae -->
|
||||
<%--<button type="button" class="cssbtn" id="btn_unmask" level="W" status="DETAIL">
|
||||
<i class="material-icons">lock_open</i> 마스킹해제
|
||||
</button>
|
||||
</button>--%>
|
||||
|
||||
<button type="button" class="cssbtn" id="btn_modify" level="W" status="DETAIL,NEW">
|
||||
<i class="material-icons">save</i> <%= localeMessage.getString("button.modify") %>
|
||||
</button>
|
||||
@@ -554,9 +560,11 @@
|
||||
</th>
|
||||
<td colspan="3">
|
||||
<div class="input-group" style="width: 50%;">
|
||||
<input type="text" id="loginId" style="width:10%; display: inline-block;" maxlength="30" onkeyup="validateEmailId(this)"/>
|
||||
<input type="text" id="loginId" style="width:10%; display: inline-block; ime-mode: disable;" maxlength="30" onkeyup="validateEmailId(this)"
|
||||
lang="en" />
|
||||
<span style="padding: 0 10px;">@</span>
|
||||
<input type="text" id="domain" style="width:20%; display: inline-block;" maxlength="50" onkeyup="validateDomainInput(this)"/>
|
||||
<input type="text" id="domain" style="width:20%; display: inline-block; ime-mode: disable;" maxlength="50" onkeyup="validateDomainInput(this)"
|
||||
lang="en" />
|
||||
<input type="hidden" name="loginId"/>
|
||||
<button type="button" class="smallBtn cssbtn" id="btn_check_id" level="R" status="NEW"
|
||||
style="margin-left: 10px; display: inline-block;">
|
||||
|
||||
@@ -48,6 +48,19 @@
|
||||
background-color: #eeeeee;
|
||||
border-color: #cccccc;
|
||||
}
|
||||
|
||||
/* input-group 안에서 invalid-feedback이 차지하는 공간 없애기, 유효성검사 할 때 현재 스타일 바뀌지않게 CSS 처리 */
|
||||
.input-group > .invalid-feedback {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
margin-top: .25rem;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
</style>
|
||||
<script language="javascript" >
|
||||
@@ -101,16 +114,31 @@
|
||||
standardMessageItems: [],
|
||||
inboundResponseStandardMessageItems: [],
|
||||
fromResponseAdapter: '',
|
||||
toResponseAdapter: '',
|
||||
inboundResponseHttpMethod: '',
|
||||
inboundResponseRestPath: '',
|
||||
syncAsyncType: 'sync'
|
||||
outboundResponseHttpMethod: '',
|
||||
outboundResponseRestPath: '',
|
||||
syncAsyncType: 'sync',
|
||||
wordType: '1',
|
||||
requestType:'S'
|
||||
},
|
||||
|
||||
// 컴퓨티드 프로퍼티
|
||||
get showInboundResponse() {
|
||||
return this.apiInterface.syncAsyncType === 'asyncSync';
|
||||
},
|
||||
|
||||
// 컴퓨티드 프로퍼티
|
||||
get showOutboundResponse() {
|
||||
return this.apiInterface.syncAsyncType === 'syncAsync';
|
||||
},
|
||||
}));
|
||||
|
||||
// 요청/응답 disable 처리.
|
||||
Alpine.store('formState', {
|
||||
isReqResDisabled: false
|
||||
});
|
||||
});
|
||||
|
||||
// Alpine 컴포넌트 접근을 위한 유틸리티 함수
|
||||
@@ -136,6 +164,7 @@
|
||||
new makeOptions("ADPTRBZWKGROUPNAME","ADPTRBZWKGROUPDESC").setObj($("select[name=fromAdapter]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setAttr('std','ADPTRMSGPTRNCD').setData(json.fromList).rendering();
|
||||
new makeOptions("ADPTRBZWKGROUPNAME","ADPTRBZWKGROUPDESC").setObj($("select[name=fromResponseAdapter]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setData(json.toList).rendering();
|
||||
new makeOptions("ADPTRBZWKGROUPNAME","ADPTRBZWKGROUPDESC").setObj($("select[name=toAdapter]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setData(json.toList).rendering();
|
||||
new makeOptions("ADPTRBZWKGROUPNAME","ADPTRBZWKGROUPDESC").setObj($("select[name=toResponseAdapter]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setData(json.fromList).rendering();
|
||||
//if(key == "") setSearchable(selectName); // 콤보에 searchable 설정
|
||||
|
||||
if (typeof callback === 'function') {
|
||||
@@ -196,27 +225,33 @@
|
||||
|
||||
// 어댑터 설정 정보 객체에 인바운드 응답 관련 설정 추가
|
||||
const adapterConfig = {
|
||||
inbound: {
|
||||
ioType: 'inbound',
|
||||
methodSelectId: '#inboundHttpMethod',
|
||||
restPathInputId: '#inboundRestPath',
|
||||
adapterUrlId: '#fromAdapterUrl',
|
||||
},
|
||||
outbound: {
|
||||
ioType: 'outbound',
|
||||
methodSelectId: '#outboundHttpMethod',
|
||||
restPathInputId: '#outboundRestPath',
|
||||
adapterUrlId: '#toAdapterUrl',
|
||||
standardOptionsId: '#standardOutboundOptions',
|
||||
commonFieldId: '#commonFieldPart'
|
||||
},
|
||||
inboundResponse: {
|
||||
methodSelectId: '#inboundResponseHttpMethod',
|
||||
restPathInputId: '#inboundResponseRestPath',
|
||||
adapterUrlId: '#fromResponseAdapterUrl',
|
||||
standardOptionsId: '#inboundResponseRestPart',
|
||||
commonFieldId: '#inboundResponseCommonFieldPart'
|
||||
}
|
||||
inbound: {
|
||||
ioType: 'inbound',
|
||||
methodSelectId: '#inboundHttpMethod',
|
||||
restPathInputId: '#inboundRestPath',
|
||||
adapterUrlId: '#fromAdapterUrl',
|
||||
},
|
||||
outbound: {
|
||||
ioType: 'outbound',
|
||||
methodSelectId: '#outboundHttpMethod',
|
||||
restPathInputId: '#outboundRestPath',
|
||||
adapterUrlId: '#toAdapterUrl',
|
||||
standardOptionsId: '#standardOutboundOptions',
|
||||
commonFieldId: '#commonFieldPart'
|
||||
},
|
||||
inboundResponse: {
|
||||
methodSelectId: '#inboundResponseHttpMethod',
|
||||
restPathInputId: '#inboundResponseRestPath',
|
||||
adapterUrlId: '#fromResponseAdapterUrl',
|
||||
standardOptionsId: '#inboundResponseRestPart',
|
||||
commonFieldId: '#inboundResponseCommonFieldPart'
|
||||
},
|
||||
outboundResponse: {
|
||||
methodSelectId: '#outboundResponseHttpMethod',
|
||||
restPathInputId: '#outboundResponseRestPath',
|
||||
adapterUrlId: '#toResponseAdapterUrl',
|
||||
standardOptionsId: '#outboundResponseRestPart'
|
||||
}
|
||||
};
|
||||
|
||||
// 어댑터 선택 변경 시 호출되는 함수 수정
|
||||
@@ -373,9 +408,13 @@
|
||||
$("select[name=authType]" ).val(data["authType"]);
|
||||
}
|
||||
$("select[name=fromResponseAdapter]" ).val(data["fromResponseAdapter"]);//fromResponseAdapter
|
||||
|
||||
$("select[name=toResponseAdapter]" ).val(data["toResponseAdapter"]);//toResponseAdapter
|
||||
|
||||
$('#inboundHttpMethod').val(data.inboundHttpMethod);
|
||||
$('#outboundHttpMethod').val(data.outboundHttpMethod);
|
||||
$('#inboundResponseHttpMethod').val(data.inboundResponseHttpMethod);
|
||||
$('#outboundResponseHttpMethod').val(data.outboundResponseHttpMethod);
|
||||
$('#svcLogLvelNo').val(data.svcLogLvelNo);
|
||||
|
||||
if(data['inboundRequestLayout']!=null && data['outboundRequestLayout']!=null){
|
||||
@@ -420,6 +459,12 @@
|
||||
const inOutType = data['eaiSvcName'].slice(-1);
|
||||
$('#inOutType').val(inOutType);
|
||||
|
||||
$("input[name=btnRadioReqRes][value='" + sendRecvType + "']").prop("checked", true);
|
||||
Alpine.store('formState').isReqResDisabled = true;
|
||||
$("input[name=btnRadioInOut][value='" + inOutType + "']").prop("checked", true);
|
||||
$("input[name=btnRadioInOut]").prop("disabled", true);
|
||||
|
||||
|
||||
$('#eaiBzwkDstcd').attr("readonly", "readonly");
|
||||
$('#eaiSvcName').attr("readonly", "readonly");
|
||||
$('#sendRecvType').attr("readonly", "readonly");
|
||||
@@ -439,6 +484,7 @@
|
||||
$('#cloneOrgInterfaceIdDesc').text(eaiSvcName);
|
||||
|
||||
$("#fromResponseAdapter").change();
|
||||
$("#toResponseAdapter").change();
|
||||
},
|
||||
error:function(e){
|
||||
alert(e.responseText);
|
||||
@@ -1057,6 +1103,14 @@
|
||||
}
|
||||
});
|
||||
|
||||
$("#toResponseAdapter").change(function() {
|
||||
const alpineData = getApiInterface();
|
||||
if (alpineData.syncAsyncType === 'syncAsync') {
|
||||
const adapterGroupName = $(this).val();
|
||||
adapterSelectChange('outboundResponse', adapterGroupName);
|
||||
}
|
||||
});
|
||||
|
||||
$('#outboundRestPath').on('input', function() {
|
||||
checkTagVariableUrl();
|
||||
});
|
||||
@@ -1278,18 +1332,34 @@
|
||||
<select id="eaiBzwkDstcd" class="form-select" name="eaiBzwkDstcd" style="width: 100%">
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label for="eaiSvcName"><span class="material-icons-outlined">badge</span> API 명</label>
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control" id="eaiSvcName" name="eaiSvcName" required>
|
||||
<span class="input-group-text" id="sendRecvTypeSpan" style="padding: 0; border: none;">
|
||||
<input type="text" id="sendRecvType" name="sendRecvType" class="ignore form-control" readonly="readonly" style="width: 40px; text-align: center; border-radius: 0; margin-left: -1px;" value="S">
|
||||
</span>
|
||||
<span class="input-group-text" id="inOutTypeSpan" style="padding: 0; border: none;">
|
||||
<input type="text" id="inOutType" name="inOutType" class="ignore form-control" readonly="readonly" style="width: 40px; text-align: center; border-radius: 0; margin-left: -1px;" value="1">
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-md-3">
|
||||
<label for="eaiSvcName">
|
||||
<span class="material-icons-outlined">badge</span> API 명
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
id="eaiSvcName"
|
||||
name="eaiSvcName"
|
||||
required>
|
||||
<span class="input-group-text" id="sendRecvTypeSpan" style="padding: 0; border: none;">
|
||||
<input type="text" id="sendRecvType" name="sendRecvType"
|
||||
class="ignore form-control"
|
||||
readonly="readonly"
|
||||
style="width: 40px; text-align: center; border-radius: 0; margin-left: -1px;"
|
||||
:value="apiInterface.requestType">
|
||||
</span>
|
||||
<span class="input-group-text" id="inOutTypeSpan" style="padding: 0; border: none;">
|
||||
<input type="text" id="inOutType" name="inOutType"
|
||||
class="ignore form-control"
|
||||
readonly="readonly"
|
||||
style="width: 40px; text-align: center; border-radius: 0; margin-left: -1px;"
|
||||
:value="apiInterface.wordType">
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group col-md-6">
|
||||
<label for="eaiSvcDesc"><span class="material-icons-outlined">chat</span> 설명</label>
|
||||
<input type="text" class="form-control" id="eaiSvcDesc" name="eaiSvcDesc" required></input>
|
||||
@@ -1303,47 +1373,81 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<div class="col-md-12">
|
||||
<!-- 기존 인터페이스 타입 영역을 Alpine 컴포넌트로 감싸기 -->
|
||||
<fieldset class="groupbox-border">
|
||||
<legend class="groupbox-border">INTERFACE TYPE</legend>
|
||||
<div class="row">
|
||||
<div class="form-group col-md-3">
|
||||
<label for="eaiBzwkDstcd"><span class="material-icons-outlined">sync</span> Sync/Async 타입</label><br>
|
||||
<div class="btn-group" id="btnGroupSyncAsync" role="group">
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeSync"
|
||||
value="sync"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeSync">
|
||||
<i class="bi bi-arrow-left-right"></i> Sync
|
||||
</label>
|
||||
<div class="btn-group" id="btnGroupSyncAsync" role="group">
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeSync"
|
||||
value="sync"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeSync">
|
||||
<i class="bi bi-arrow-repeat"></i> Sync
|
||||
</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeAsync"
|
||||
value="async"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeAsync">
|
||||
<i class="bi bi-arrow-left-right"></i> Async
|
||||
</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeAsyncSync"
|
||||
value="asyncSync"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeAsyncSync">
|
||||
<i class="bi bi-arrow-return-left"></i> A > S
|
||||
</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeSyncAsync"
|
||||
value="syncAsync"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeSyncAsync">
|
||||
<i class="bi bi-share-fill"></i> S > A
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label for="eaiBzwkDstcd">요청/응답 구분</label><br>
|
||||
<div class="btn-group" role="group" aria-label="Basic radio toggle button group">
|
||||
<input type="radio" class="btn-check" name="btnRadioReqRes" id="btnTypeRequest" x-model="apiInterface.requestType"
|
||||
value="S" :disabled="apiInterface.syncAsyncType !== 'async' || $store.formState.isReqResDisabled" checked>
|
||||
<label class="btn btn-outline-primary" for="btnTypeRequest"><i class="bi bi-arrow-bar-right"></i> 요청</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeAsync"
|
||||
value="async"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeAsync">
|
||||
<i class="bi bi-arrow-repeat"></i> Async
|
||||
</label>
|
||||
<input type="radio" class="btn-check" name="btnRadioReqRes" id="btnTypeResponse" x-model="apiInterface.requestType"
|
||||
value="R" :disabled="apiInterface.syncAsyncType !== 'async' || $store.formState.isReqResDisabled">
|
||||
<label class="btn btn-outline-primary" for="btnTypeResponse"><i class="bi bi-arrow-bar-left"></i> 응답</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-3">
|
||||
<label for="eaiBzwkDstcd">당/타발 구분</label><br>
|
||||
<div class="btn-group" role="group" aria-label="Basic radio toggle button group">
|
||||
<input type="radio" class="btn-check" name="btnRadioInOut" id="btnTypeInword" value="1" x-model="apiInterface.wordType" checked>
|
||||
<label class="btn btn-outline-primary" for="btnTypeInword"><i class="bi bi-arrow-right-circle"></i> 당발</label>
|
||||
|
||||
<input type="radio"
|
||||
class="btn-check"
|
||||
name="btnRadioSyncAsync"
|
||||
id="btnTypeAsyncSync"
|
||||
value="asyncSync"
|
||||
x-model="apiInterface.syncAsyncType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeAsyncSync">
|
||||
<i class="bi bi-arrow-return-left"></i> A > S
|
||||
</label>
|
||||
</div>
|
||||
<input type="radio" class="btn-check" name="btnRadioInOut" id="btnTypeOutword" value="2" x-model="apiInterface.wordType">
|
||||
<label class="btn btn-outline-primary" for="btnTypeOutword"><i class="bi bi-arrow-left-circle"></i> 타발</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<div class="col-md-10">
|
||||
<fieldset class="groupbox-border">
|
||||
<legend class="groupbox-border">TRANSACTION OPTIONS</legend>
|
||||
<div class="row">
|
||||
@@ -1354,6 +1458,7 @@
|
||||
<option value="1">[1]오류 로그만(900)</option>
|
||||
<option value="2">[2]인바운드(100,400)</option>
|
||||
<option value="3" selected>[3]전체로그</option>
|
||||
<option value="4">[4]업무데이터 제외</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-2">
|
||||
@@ -1408,21 +1513,38 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row"
|
||||
x-show="showInboundResponse">
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<label for="fromResponseAdapter">
|
||||
<span class="material-icons">keyboard_return</span>
|
||||
INBOUND (ASYNC) 응답 어댑터
|
||||
</label>
|
||||
<select id="fromResponseAdapter"
|
||||
class="form-select"
|
||||
name="fromResponseAdapter"
|
||||
required
|
||||
:disabled="!showInboundResponse">
|
||||
</select>
|
||||
<small id="fromResponseAdapterUrl" class="form-text text-muted"></small>
|
||||
</div>
|
||||
<div x-show="showInboundResponse">
|
||||
<label for="fromResponseAdapter">
|
||||
<span class="material-icons">keyboard_return</span>
|
||||
INBOUND (ASYNC) 응답 어댑터
|
||||
</label>
|
||||
<select id="fromResponseAdapter"
|
||||
class="form-select"
|
||||
name="fromResponseAdapter"
|
||||
required
|
||||
:disabled="!showInboundResponse">
|
||||
</select>
|
||||
<small id="fromResponseAdapterUrl" class="form-text text-muted"></small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group col-md-6">
|
||||
<!-- toAdapterUrl 겹치지 않도록 mt-3 속성 추가 -->
|
||||
<div class="mt-3" x-show="showOutboundResponse">
|
||||
<label for="toResponseAdapter">
|
||||
<span class="material-icons">keyboard_return</span>
|
||||
OUTBOUND (ASYNC) 응답 어댑터
|
||||
</label>
|
||||
<select id="toResponseAdapter"
|
||||
class="form-select"
|
||||
name="toResponseAdapter"
|
||||
required
|
||||
:disabled="!showOutboundResponse">
|
||||
</select>
|
||||
<small id="toResponseAdapterUrl" class="form-text text-muted"></small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
@@ -1438,8 +1560,8 @@
|
||||
<%= localeMessage.getString("apiInterface.recvMethod") %>
|
||||
</label>
|
||||
<select id="inboundHttpMethod" class="form-select" name="inboundHttpMethod" disabled>
|
||||
<option value="get">GET</option>
|
||||
<option value="post">POST</option>
|
||||
<option value="get">GET</option>
|
||||
<option value="put">PUT</option>
|
||||
<option value="patch">PATCH</option>
|
||||
<option value="delete">DELETE</option>
|
||||
@@ -1488,8 +1610,8 @@
|
||||
class="form-select"
|
||||
name="inboundResponseHttpMethod"
|
||||
disabled>
|
||||
<option value="get">GET</option>
|
||||
<option value="post">POST</option>
|
||||
<option value="get">GET</option>
|
||||
<option value="put">PUT</option>
|
||||
<option value="patch">PATCH</option>
|
||||
<option value="delete">DELETE</option>
|
||||
@@ -1528,34 +1650,34 @@
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<fieldset class="groupbox-border">
|
||||
<legend class="groupbox-border">OUTBOUND ROUTING</legend>
|
||||
<div id="outboundRoutingContent">
|
||||
<div class="row" id="standardOutboundOptions">
|
||||
<div class="form-group col-md-4">
|
||||
<label for="outboundHttpMethod">
|
||||
<span class="material-icons">http</span>
|
||||
송신 메소드
|
||||
</label>
|
||||
<select id="outboundHttpMethod" class="form-select" name="outboundHttpMethod" disabled>
|
||||
<option value="get">GET</option>
|
||||
<option value="post">POST</option>
|
||||
<option value="put">PUT</option>
|
||||
<option value="patch">PATCH</option>
|
||||
<option value="delete">DELETE</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-8">
|
||||
<label for="outboundRestPath">
|
||||
<span class="material-icons">link</span>
|
||||
<span class="badge badge-warning" id="tagVariableUrl" style="display: none">가변</span>
|
||||
송신 REST PATH(URL)
|
||||
</label>
|
||||
<input type="text" class="form-control" id="outboundRestPath"
|
||||
name="outboundRestPath" disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<fieldset class="groupbox-border">
|
||||
<legend class="groupbox-border">OUTBOUND ROUTING</legend>
|
||||
<div id="outboundRoutingContent">
|
||||
<div class="row" id="standardOutboundOptions">
|
||||
<div class="form-group col-md-4">
|
||||
<label for="outboundHttpMethod">
|
||||
<span class="material-icons">http</span>
|
||||
송신 메소드
|
||||
</label>
|
||||
<select id="outboundHttpMethod" class="form-select" name="outboundHttpMethod" disabled>
|
||||
<option value="post">POST</option>
|
||||
<option value="get">GET</option>
|
||||
<option value="put">PUT</option>
|
||||
<option value="patch">PATCH</option>
|
||||
<option value="delete">DELETE</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-8">
|
||||
<label for="outboundRestPath">
|
||||
<span class="material-icons">link</span>
|
||||
<span class="badge badge-warning" id="tagVariableUrl" style="display: none">가변</span>
|
||||
송신 REST PATH(URL)
|
||||
</label>
|
||||
<input type="text" class="form-control" id="outboundRestPath"
|
||||
name="outboundRestPath" disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div id="commonFieldPart" class="row" style="display:none">
|
||||
<div class="form-group col-md-12">
|
||||
<label for="standardMessageItemsButton">
|
||||
@@ -1569,10 +1691,48 @@
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outboundResponseMethodPathRow"
|
||||
x-show="showOutboundResponse">
|
||||
<div id="outboundResponseRestPart" class="row">
|
||||
<div class="form-group col-md-4">
|
||||
<label for="outboundResponseHttpMethod">
|
||||
<span class="material-icons">http</span>
|
||||
응답 수신 메소드
|
||||
</label>
|
||||
<select id="outboundResponseHttpMethod" class="form-select" name="outboundResponseHttpMethod" disabled>
|
||||
<option value="get">GET</option>
|
||||
<option value="post">POST</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group col-md-8">
|
||||
<label for="outboundResponseRestPath">
|
||||
<span class="material-icons">link</span>
|
||||
응답 수신 REST PATH(URL)
|
||||
</label>
|
||||
<input type="text" class="form-control" id="outboundResponseRestPath" name="outboundResponseRestPath" disabled>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="outboundResponseCommonFieldPart" class="row" style="display:none">
|
||||
<div class="form-group col-md-12">
|
||||
<label for="standardMessageItemsButton">
|
||||
<span class="material-icons-outlined">view_list</span>
|
||||
표준전문 공통부 값
|
||||
</label>
|
||||
<div class="d-grid gap-2">
|
||||
<button type="button" id="standardMessageItemsButton" class="btn btn-primary"
|
||||
data-bs-toggle="modal" data-bs-target="#stdCommonValueModal">
|
||||
수정
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse" id="collapseTransform">
|
||||
<div class="row">
|
||||
|
||||
+4
-2
@@ -35,7 +35,7 @@ java {
|
||||
languageVersion = JavaLanguageVersion.of(8)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
compileJava {
|
||||
options.encoding = 'UTF-8'
|
||||
sourceSets.main.java { srcDir generatedJavaDir }
|
||||
@@ -50,7 +50,7 @@ war {
|
||||
def profile = project.findProperty("profile") ?: "tomcat"
|
||||
|
||||
if (profile == "weblogic") {
|
||||
webXml = file("WebContent/WEB-INF/weblogic-web.xml")
|
||||
webXml = file("WebContent/WEB-INF/weblogic-web.xml")
|
||||
}
|
||||
|
||||
|
||||
@@ -76,6 +76,8 @@ dependencies {
|
||||
implementation project(':elink-online-common')
|
||||
implementation project(':elink-online-emsclient')
|
||||
implementation project(':elink-portal-common')
|
||||
implementation project(':kjb-safedb')
|
||||
implementation project(":eapim-admin-kjb")
|
||||
|
||||
/* Custom Libs */
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
pipeline {
|
||||
agent { label 'apipod01' }
|
||||
|
||||
environment {
|
||||
// Java 환경 설정
|
||||
JAVA_HOME = '/App/jenkins/jdks/jdk1.8.0_441'
|
||||
PATH = "${JAVA_HOME}/bin:${env.PATH}"
|
||||
|
||||
// Gradle 환경 설정
|
||||
GRADLE_HOME = '/App/jenkins/gradle-8.7'
|
||||
GRADLE_USER_HOME = '/App/jenkins/gradle-home'
|
||||
// GRADLE_OPTS = '--offline'
|
||||
|
||||
// Git 저장소 정보
|
||||
GIT_SERVER = '192.168.240.178:18081'
|
||||
GIT_CREDENTIALS_ID = 'git-ssh-credentials'
|
||||
|
||||
// 프로젝트 디렉토리 구조
|
||||
PROJECT_HOME = '/Data/jenkins/eapim'
|
||||
|
||||
BRANCH = 'jenkins_with_weblogic'
|
||||
}
|
||||
|
||||
|
||||
stages {
|
||||
stage('Git pull') {
|
||||
steps {
|
||||
echo "[admin] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-admin") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/eapim-admin", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
|
||||
echo "[online-core] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-online-core") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-online-core", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
echo "[online-core-jpa] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-online-core-jpa") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-online-core-jpa", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
|
||||
echo "[online-transformer] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-online-transformer") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-online-transformer", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
echo "[online-common] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-online-common") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-online-common", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
echo "[online-emsclient] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-online-emsclient") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-online-emsclient", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
echo "[portal-common] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/eapim-online/elink-portal-common") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/elink-portal-common", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
|
||||
|
||||
echo "[kjb-safedb] Git pull from branch: ${BRANCH}"
|
||||
dir("${PROJECT_HOME}/kjb-safedb") {
|
||||
git url: "ssh://git@${GIT_SERVER}/eapim/kjb-safedb", branch: "${BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
stage('Build') {
|
||||
steps {
|
||||
tool name: 'Oracle-JDK-1.8', type: 'hudson.model.JDK'
|
||||
|
||||
echo "[admin] Build project"
|
||||
dir("${PROJECT_HOME}/eapim-admin") {
|
||||
sh '${GRADLE_HOME}/bin/gradle clean build -x test -Pprofile=weblogic'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
stage('Archive WAR') {
|
||||
steps {
|
||||
echo "[admin] Archive WAR file"
|
||||
dir("${PROJECT_HOME}/eapim-admin/build/libs") {
|
||||
archiveArtifacts artifacts: '*.war', fingerprint: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,21 +36,39 @@ eLink 모듈을 참조하여 구성되어있으며, 추후 필요 모듈외에
|
||||
|
||||
|
||||
|
||||
### TOMCAT 기동 옵션 참조
|
||||
## TOMCAT 기동 옵션 참조
|
||||
### 로컬 개발용
|
||||
|
||||
```
|
||||
-Deai.datasource.type=DEV
|
||||
-Dinst.Name=apimsSvr11
|
||||
-Deai.tableowner=ems
|
||||
-Dinst.Name=emsSvr99
|
||||
-Deai.tableowner=EMSADM
|
||||
-Deai.systemmode=D
|
||||
-Dfile.encoding=utf-8
|
||||
-DLOGBACK_LOG_LEVEL=info
|
||||
-Dlogin.mode=db
|
||||
-DLOGBACK_LOG_LEVEL=DEBUG
|
||||
-Dlogback.configurationFile=classpath:logback-dev.xml
|
||||
-Dhibernate.dialect=org.hibernate.dialect.Oracle12cDialect
|
||||
-Dkjb_safedb.mode=fake
|
||||
```
|
||||
|
||||
### Gradle 빌드 옵션
|
||||
## Gradle 빌드 옵션
|
||||
```bash
|
||||
# Weblogic 배포용 (테스트 제외)
|
||||
gradle build -x test -Pprofile=weblogic
|
||||
```
|
||||
|
||||
- -Pprofile=weblogic 사용시 weblogic-web.xml 을 web.xml 로 사용 (DefaultServlet 이슈)
|
||||
- -Pprofile=weblogic 사용시 weblogic-web.xml 을 web.xml 로 사용 (DefaultServlet 이슈)
|
||||
|
||||
|
||||
## 광주은행 참고 사항
|
||||
### PORTAL Parameter
|
||||
- deploy.prod_use_proxy = N (개발/운영 망 간 연동 없음)
|
||||
- kjb.ums.eai_batch.url : EAI 배치 서버 URL (이메일 발송 용도)
|
||||
- 개발 : http://172.31.32.111:10230/BATAppWeb/EaiBatCall
|
||||
- QA : http://172.31.33.111:10430/BATAppWeb/EaiBatCall
|
||||
- 운영 : http://172.21.1.40:10860/BATAppWeb/EaiBatCall
|
||||
- 입력하지 않을 경우 EAI 배치 호출을 하지 않고 내부적으로 통신하지 않고 정상 처리(log 내 warning 로그)
|
||||
- kjb.ums.eai_batch.send_dir : EAI 배치 서버 파일 송신 디렉토리
|
||||
- Default : /Data/eapim/portal/sendmail
|
||||
|
||||
|
||||
+13
-6
@@ -7,9 +7,16 @@ include 'elink-online-common'
|
||||
include 'elink-online-emsclient'
|
||||
include 'elink-portal-common'
|
||||
|
||||
project (':elink-online-core-jpa').projectDir = new File(settingsDir, "../eapim-online/elink-online-core-jpa")
|
||||
project (':elink-online-core').projectDir = new File(settingsDir, "../eapim-online/elink-online-core")
|
||||
project (':elink-online-transformer').projectDir = new File(settingsDir, "../eapim-online/elink-online-transformer")
|
||||
project (':elink-online-common').projectDir = new File(settingsDir, "../eapim-online/elink-online-common")
|
||||
project (':elink-online-emsclient').projectDir = new File(settingsDir, "../eapim-online/elink-online-emsclient")
|
||||
project (':elink-portal-common').projectDir = new File(settingsDir, "../elink-portal-common")
|
||||
project(':elink-online-core-jpa').projectDir = new File(settingsDir, "../eapim-online/elink-online-core-jpa")
|
||||
project(':elink-online-core').projectDir = new File(settingsDir, "../eapim-online/elink-online-core")
|
||||
project(':elink-online-transformer').projectDir = new File(settingsDir, "../eapim-online/elink-online-transformer")
|
||||
project(':elink-online-common').projectDir = new File(settingsDir, "../eapim-online/elink-online-common")
|
||||
project(':elink-online-emsclient').projectDir = new File(settingsDir, "../eapim-online/elink-online-emsclient")
|
||||
project(':elink-portal-common').projectDir = new File(settingsDir, "../elink-portal-common")
|
||||
|
||||
|
||||
include 'kjb-safedb'
|
||||
project(':kjb-safedb').projectDir = new File(settingsDir, "../kjb-safedb")
|
||||
|
||||
include 'eapim-admin-kjb'
|
||||
project(':eapim-admin-kjb').projectDir = new File(settingsDir, "eapim-admin-kjb")
|
||||
@@ -71,6 +71,7 @@ public class MonitoringFrontFilter implements Filter {
|
||||
|| uri.indexOf(request.getContextPath() +"/LoginServlet") > -1
|
||||
|| uri.indexOf(request.getContextPath() +"/login/") > -1
|
||||
|| uri.indexOf(request.getContextPath() +"/dashboard") > -1
|
||||
|| uri.indexOf(request.getContextPath() +"/dashmain3.do") > -1
|
||||
|| uri.indexOf(request.getContextPath() + "/loginForm.do") > -1
|
||||
|| uri.indexOf(request.getContextPath() + "/login.do") > -1
|
||||
|| uri.indexOf(request.getContextPath() + "/ssoLogin.do") > -1
|
||||
|
||||
@@ -563,14 +563,14 @@ public class MainController implements InterceptorSkipController {
|
||||
@RequestMapping("/changePassword.do")
|
||||
public String changePassword(HttpServletRequest request,
|
||||
String changePassword, String confirmPassword,
|
||||
String userId, String password) {
|
||||
String resetUserId, String resetPassword) {
|
||||
HttpSession session = request.getSession();
|
||||
|
||||
try {
|
||||
|
||||
// 로그인 User ID 체크.
|
||||
Optional<UserInfo> userInfoOptional = userInfoService
|
||||
.findById(userId);
|
||||
.findById(resetUserId);
|
||||
|
||||
if (!userInfoOptional.isPresent()) {
|
||||
UserAccessLogger.log(request, LOG_CATEGORY_LOGIN, "F",
|
||||
@@ -604,8 +604,8 @@ public class MainController implements InterceptorSkipController {
|
||||
}
|
||||
|
||||
// 3. 비밀번호 체크
|
||||
if (!userInfo.getPassword().equals(Seed.encrypt(password))
|
||||
&& !userInfo.getUserid().equals(userId)) {
|
||||
if (!userInfo.getPassword().equals(Seed.encrypt(resetPassword))
|
||||
&& !userInfo.getUserid().equals(resetUserId)) {
|
||||
UserAccessLogger.log(request, LOG_CATEGORY_LOGIN, "F",
|
||||
localeMessage
|
||||
.getString("login.pwdmismatch5"));
|
||||
|
||||
+14
@@ -35,6 +35,20 @@ public class MonitoringPropertyService
|
||||
return property.map(MonitoringProperty::getPrpty2Val).orElse(null);
|
||||
}
|
||||
|
||||
public String getPropertyValue(String prptyGroupName, String prptyName, String defaultValue) {
|
||||
MonitoringPropertyId id = new MonitoringPropertyId();
|
||||
id.setPrptyGroupName(prptyGroupName);
|
||||
id.setPrptyName(prptyName);
|
||||
|
||||
Optional<MonitoringProperty> property = repository.findById(id);
|
||||
if (property.isPresent() && !property.get().getPrpty2Val().isEmpty()) {
|
||||
return property.get().getPrpty2Val();
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Iterable<MonitoringProperty> findAllByIdPrptyName(String prptyName) {
|
||||
BooleanExpression predicate = QMonitoringProperty.monitoringProperty.id.prptyName.eq(prptyName);
|
||||
return repository.findAll(predicate);
|
||||
|
||||
@@ -38,7 +38,8 @@ public class JobHistoryService extends AbstractEMSDataSerivce<JobHistory, String
|
||||
.select(qJobHistory.status)
|
||||
.from(qJobHistory)
|
||||
.where(qJobHistory.endDate.eq(maxEndDateQuery))
|
||||
.fetchOne();
|
||||
.fetchFirst(); // unique 에러 발생 대응
|
||||
//.fetchOne();
|
||||
}
|
||||
|
||||
public void updateStatus(String jobName, String startDate, String endDate, String status) throws Exception {
|
||||
|
||||
+1
@@ -11,6 +11,7 @@ public class PortalUserUISearch {
|
||||
private String searchUserId;
|
||||
private String searchUserName;
|
||||
private String searchOrgId;
|
||||
private String searchOrgName;
|
||||
private String searchEmailAddr;
|
||||
private String searchMobileNumber;
|
||||
private String searchRoleCode;
|
||||
|
||||
@@ -103,7 +103,7 @@ public class PortalApprovalManService extends BaseService {
|
||||
Optional<PortalUser> optUser = portalUserRepository.findById(approval.getTargetId());
|
||||
optUser.ifPresent(user -> {
|
||||
PortalUserUI userUI = isMasked ?
|
||||
portalUserManService.selectDetail(user.getId()) :
|
||||
portalUserManService.selectDetail(user.getId(), true) :
|
||||
portalUserManService.selectDetailUnmask(user.getId());
|
||||
|
||||
// IP 마스킹 상태만 재설정
|
||||
@@ -142,6 +142,10 @@ public class PortalApprovalManService extends BaseService {
|
||||
AppRequest appRequest = optRequest.get();
|
||||
appApprovalUI.setRequestType(appRequest.getType());
|
||||
|
||||
// null 처리 필요
|
||||
if (appRequest.getApiGroupList() == null || appRequest.getApiGroupList().isEmpty()) {
|
||||
appRequest.setApiGroupList("");
|
||||
}
|
||||
String[] apiGroupList = appRequest.getApiGroupList().split(",");
|
||||
for (String apiGroupId : apiGroupList) {
|
||||
apiGroupService.findByIdWithApiList(apiGroupId).ifPresent(apiGroup ->
|
||||
|
||||
+4
-2
@@ -7,6 +7,7 @@ import com.eactive.apim.portal.approval.entity.Approval;
|
||||
import com.eactive.apim.portal.approval.service.ApprovalDeployException;
|
||||
import com.eactive.apim.portal.approval.statemachine.listener.ApprovalListener;
|
||||
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
|
||||
import com.eactive.apim.portal.template.entity.MessageCode;
|
||||
import com.eactive.apim.portal.template.service.MessageRecipient;
|
||||
import com.eactive.apim.portal.template.service.MessageSendService;
|
||||
import com.eactive.eai.agent.command.CommonCommand;
|
||||
@@ -97,7 +98,6 @@ public class PortalAppApprovalListener implements ApprovalListener {
|
||||
|
||||
@Override
|
||||
public void execute(Approval approval, Map<String, Object> option1) throws ApprovalDeployException {
|
||||
|
||||
Optional<AppRequest> optRequest = appRequestRepository.findAppRequestByApproval(approval);
|
||||
|
||||
AppRequest appRequest = optRequest.orElseGet(null);
|
||||
@@ -135,7 +135,8 @@ public class PortalAppApprovalListener implements ApprovalListener {
|
||||
recipient.setUserId(appRequest.getApproval().getRequester().getEmailAddr());
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("apiKey", appRequest.getClientName());
|
||||
messageSendService.sendMessage("APP_REGISTER_APPROVED", recipient, params);
|
||||
// messageSendService.sendMessage("APP_REGISTER_APPROVED", recipient, params);
|
||||
messageSendService.sendMessage(MessageCode.APP_REGISTER_APPROVED, recipient, params);
|
||||
}
|
||||
|
||||
private String determineAction(AppRequestType type) {
|
||||
@@ -159,6 +160,7 @@ public class PortalAppApprovalListener implements ApprovalListener {
|
||||
}
|
||||
|
||||
private void syncTargetServer(String server, String action, CredentialUI credentialUI) throws ApprovalDeployException {
|
||||
//TODO: Proxy 제거 작업 필요
|
||||
|
||||
// 프록시를 통한 스테이징 서버 호출 추가
|
||||
Map<String, String> properties = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY_GROUP);
|
||||
|
||||
+42
-34
@@ -9,6 +9,7 @@ import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.OrgStatus;
|
||||
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
|
||||
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
||||
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
||||
import com.eactive.apim.portal.template.entity.MessageCode;
|
||||
import com.eactive.apim.portal.template.service.MessageRecipient;
|
||||
import com.eactive.apim.portal.template.service.MessageSendService;
|
||||
import com.eactive.eai.rms.data.entity.onl.apim.portalorg.PortalOrgService;
|
||||
@@ -87,7 +88,7 @@ public class PortalUserApprovalListener implements ApprovalListener {
|
||||
portalOrg.setOrgStatus(OrgStatus.ACTIVE);
|
||||
portalOrgService.save(portalOrg);
|
||||
|
||||
syncStaging(portalOrgUIMapper.toVo(portalOrg));
|
||||
// syncStaging(portalOrgUIMapper.toVo(portalOrg));
|
||||
sendApprovalResult(portalUser);
|
||||
}
|
||||
|
||||
@@ -96,42 +97,49 @@ public class PortalUserApprovalListener implements ApprovalListener {
|
||||
recipient.setPhone(portalUser.getMobileNumber());
|
||||
recipient.setUserId(portalUser.getEmailAddr());
|
||||
Map<String, String> params = new HashMap<>();
|
||||
messageSendService.sendMessage("USER_REGISTER_APPROVED", recipient, params);
|
||||
messageSendService.sendMessage(MessageCode.MANAGER_WITH_ORG_REGISTER_APPROVED, recipient, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 광주은행에서는 사용하지 않음. (개발/운영 완전 분리)
|
||||
* @param portalOrgUI
|
||||
* @throws ApprovalDeployException
|
||||
*/
|
||||
private void syncStaging(PortalOrgUI portalOrgUI) throws ApprovalDeployException {
|
||||
// 프록시를 통한 스테이징 서버 호출 추가
|
||||
Map<String, String> properties = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY_GROUP);
|
||||
String apiKey = properties.get("apiKey");
|
||||
String proxyUrl = properties.get("portal.url");
|
||||
String timeout = properties.getOrDefault("deploy.proxy_timeout", "10000");
|
||||
String proxyEndpoint = proxyUrl + "/_onl/apim/portalorg/portalOrgMan.json";
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
headers.set("X-API-KEY", apiKey);
|
||||
headers.set("target_host", "stg");
|
||||
headers.set("action", "insert");
|
||||
|
||||
portalOrgUI.setCompRegFile(null);
|
||||
HttpEntity<PortalOrgUI> request = new HttpEntity<>(portalOrgUI, headers);
|
||||
|
||||
try {
|
||||
ResponseEntity<String> response = createRestTemplateWithTimeout(Integer.parseInt(timeout)).exchange(
|
||||
proxyEndpoint,
|
||||
HttpMethod.POST,
|
||||
request,
|
||||
String.class
|
||||
);
|
||||
|
||||
if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
logger.error("Failed to sync with staging server. Status: {}, Body: {}", response.getStatusCode(), response.getBody());
|
||||
throw new ApprovalDeployException("기관 정보 배포에 실패 했습니다.");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to sync with staging server. {}", e.getMessage());
|
||||
throw new ApprovalDeployException("기관 정보 배포에 실패 했습니다.");
|
||||
}
|
||||
throw new RuntimeException("Unable use this method(syncStaging())");
|
||||
|
||||
// // 프록시를 통한 스테이징 서버 호출 추가
|
||||
// Map<String, String> properties = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY_GROUP);
|
||||
// String apiKey = properties.get("apiKey");
|
||||
// String proxyUrl = properties.get("portal.url");
|
||||
// String timeout = properties.getOrDefault("deploy.proxy_timeout", "10000");
|
||||
// String proxyEndpoint = proxyUrl + "/_onl/apim/portalorg/portalOrgMan.json";
|
||||
//
|
||||
// HttpHeaders headers = new HttpHeaders();
|
||||
// headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
// headers.set("X-API-KEY", apiKey);
|
||||
// headers.set("target_host", "stg");
|
||||
// headers.set("action", "insert");
|
||||
//
|
||||
// portalOrgUI.setCompRegFile(null);
|
||||
// HttpEntity<PortalOrgUI> request = new HttpEntity<>(portalOrgUI, headers);
|
||||
//
|
||||
// try {
|
||||
// ResponseEntity<String> response = createRestTemplateWithTimeout(Integer.parseInt(timeout)).exchange(
|
||||
// proxyEndpoint,
|
||||
// HttpMethod.POST,
|
||||
// request,
|
||||
// String.class
|
||||
// );
|
||||
//
|
||||
// if (!response.getStatusCode().is2xxSuccessful()) {
|
||||
// logger.error("Failed to sync with staging server. Status: {}, Body: {}", response.getStatusCode(), response.getBody());
|
||||
// throw new ApprovalDeployException("기관 정보 배포에 실패 했습니다.");
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// logger.error("Failed to sync with staging server. {}", e.getMessage());
|
||||
// throw new ApprovalDeployException("기관 정보 배포에 실패 했습니다.");
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -56,15 +56,6 @@ public class PortalOrgManController extends BaseAnnotationController {
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=UNMASK")
|
||||
public ResponseEntity<Map<String, Object>> selectDetailUnmask(String id, String reason) {
|
||||
if (StringUtils.isBlank(reason)) {
|
||||
throw new BizException("마스킹 해제 사유를 입력해 주세요.");
|
||||
}
|
||||
Map<String, Object> result = portalOrgManService.selectDetailWithUsersUnmask(id);
|
||||
return ResponseEntity.ok(result);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=LIST_INIT_COMBO")
|
||||
public ResponseEntity<Map<String, Object>> initCombo() {
|
||||
List<ComboVo> approvalStatusList = comboService.getMonitoringCodeSortedBySeq("APPROVE_STATUS_CODE"); // 승인상태코드
|
||||
|
||||
@@ -172,25 +172,9 @@ public class PortalOrgManService extends BaseService {
|
||||
private PortalUserCorpManagerUI convertCorporateManagerToUIWithMaskOption(PortalUser corporateManager, boolean isMasked) {
|
||||
PortalUserCorpManagerUI ui = portalUserCorpManagerUIMapper.toVo(corporateManager);
|
||||
|
||||
if (ui != null && isMasked) {
|
||||
if (StringUtils.isNotBlank(ui.getUserName())) {
|
||||
ui.setUserName(MaskingUtils.maskName(ui.getUserName()));
|
||||
}
|
||||
if (StringUtils.isNotBlank(ui.getEmailAddr())) {
|
||||
ui.setEmailAddr(MaskingUtils.maskEmailId(ui.getEmailAddr()));
|
||||
}
|
||||
if (StringUtils.isNotBlank(ui.getMobileNumber())) {
|
||||
ui.setMobileNumber(MaskingUtils.maskPhoneNumber(ui.getMobileNumber()));
|
||||
}
|
||||
}
|
||||
|
||||
return ui;
|
||||
}
|
||||
|
||||
public Map<String, Object> selectDetailWithUsersUnmask(String id) {
|
||||
return getDetailWithUsers(id, false);
|
||||
}
|
||||
|
||||
private void setFileInfo(PortalOrg portalOrg, PortalOrgUI ui) {
|
||||
Optional.ofNullable(portalOrg.getCompRegFile())
|
||||
.filter(StringUtils::isNotBlank)
|
||||
|
||||
@@ -47,12 +47,13 @@ public class PortalUserManController extends BaseAnnotationController {
|
||||
return ResponseEntity.ok(new GridResponse<>(page));
|
||||
}
|
||||
|
||||
// 2025.09.23 : 마스킹 해제를 기본상태로 변경 / Rinjae
|
||||
/* 마스킹 처리된 값
|
||||
* 수정버튼 비활성화. -> "마스킹해제" 버튼 클릭후 언마스크
|
||||
* */
|
||||
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=DETAIL")
|
||||
public ResponseEntity<PortalUserUI> selectDetail(String id) {
|
||||
PortalUserUI portalUserUI = portalUserManService.selectDetail(id);
|
||||
PortalUserUI portalUserUI = portalUserManService.selectDetail(id, false);
|
||||
return ResponseEntity.ok(portalUserUI);
|
||||
}
|
||||
|
||||
@@ -61,7 +62,7 @@ public class PortalUserManController extends BaseAnnotationController {
|
||||
if (StringUtils.isBlank(reason)) {
|
||||
throw new BizException("마스킹 해제 사유를 입력해 주세요.");
|
||||
}
|
||||
PortalUserUI portalUserUI = portalUserManService.selectDetailUnmask(id);
|
||||
PortalUserUI portalUserUI = portalUserManService.selectDetail(id, false);
|
||||
return ResponseEntity.ok(portalUserUI);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import com.eactive.eai.rms.onl.apim.masking.MaskingUtils;
|
||||
import com.eactive.eai.rms.onl.apim.portalorg.PortalOrgManService;
|
||||
import com.eactive.eai.rms.onl.common.exception.BizException;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
@@ -31,6 +32,7 @@ import java.util.List;
|
||||
@Service
|
||||
@Transactional(transactionManager = "transactionManagerForEMS")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class PortalUserManService extends BaseService {
|
||||
|
||||
private final PortalUserService portalUserService;
|
||||
@@ -39,13 +41,16 @@ public class PortalUserManService extends BaseService {
|
||||
private final PortalOrgService portalOrgService;
|
||||
private final FileService fileService;
|
||||
private final PortalOrgManService portalOrgManService;
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
// private final PasswordEncoder passwordEncoder;
|
||||
private final PasswordEncoder kjbSafedbPasswordEncoder;
|
||||
private final PortalUserTermsService portalUserTermsService;
|
||||
|
||||
|
||||
public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) {
|
||||
Page<PortalUser> portalUser = portalUserService.findAll(pageable, portalUserUISearch);
|
||||
return portalUser.map(entity -> {
|
||||
PortalUserUI ui = convertToUIWithMaskOption(entity, true);
|
||||
PortalUserUI ui = convertToUIWithMaskOption(entity, false);
|
||||
|
||||
if (entity.getPortalOrg() != null) {
|
||||
setPortalOrgUI(entity, ui);
|
||||
}
|
||||
@@ -53,9 +58,10 @@ public class PortalUserManService extends BaseService {
|
||||
});
|
||||
}
|
||||
|
||||
public PortalUserUI selectDetail(String id) {
|
||||
public PortalUserUI selectDetail(String id, boolean isMasked) {
|
||||
PortalUser portalUser = portalUserService.getById(id);
|
||||
PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, true);
|
||||
PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, isMasked);
|
||||
|
||||
if (portalUser.getPortalOrg() != null) {
|
||||
setPortalOrgUI(portalUser, portalUserUI);
|
||||
}
|
||||
@@ -63,12 +69,7 @@ public class PortalUserManService extends BaseService {
|
||||
}
|
||||
|
||||
public PortalUserUI selectDetailUnmask(String id) {
|
||||
PortalUser portalUser = portalUserService.getById(id);
|
||||
PortalUserUI portalUserUI = convertToUIWithMaskOption(portalUser, false);
|
||||
if (portalUser.getPortalOrg() != null) {
|
||||
setPortalOrgUI(portalUser, portalUserUI);
|
||||
}
|
||||
return portalUserUI;
|
||||
return selectDetail(id, false);
|
||||
}
|
||||
|
||||
private void setPortalOrgUI(PortalUser portalUser, PortalUserUI portalUserUI) {
|
||||
@@ -123,7 +124,7 @@ public class PortalUserManService extends BaseService {
|
||||
}
|
||||
|
||||
PortalUser portalUser = portalUserUIMapper.toEntity(portalUserUI);
|
||||
portalUser.setPasswordHash(passwordEncoder.encode("!" + portalUserUI.getLoginId()));
|
||||
portalUser.setPasswordHash(kjbSafedbPasswordEncoder.encode("!" + portalUserUI.getLoginId()));
|
||||
portalUser.setLoginFailureCount(0);
|
||||
portalUser.setAccountLockYn("N");
|
||||
portalUser.setEmailAddr(portalUserUI.getLoginId());
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.eactive.eai.rms.onl.apim.template;
|
||||
|
||||
import com.eactive.apim.portal.template.entity.MessageCode;
|
||||
import com.eactive.apim.portal.template.entity.MessageTemplate;
|
||||
import com.eactive.eai.rms.common.base.BaseService;
|
||||
import com.eactive.eai.rms.data.entity.onl.apim.template.MessageTemplateSearch;
|
||||
|
||||
@@ -216,6 +216,20 @@ public class ApiInterfaceService extends OnlBaseService {
|
||||
apiInterfaceUI.setInboundResponseStandardMessageItems(convertMapToStdMessageItems(restOption.getStandardCommonFields()));
|
||||
}
|
||||
}
|
||||
|
||||
if("syncAsync".equals(apiInterfaceUI.getSyncAsyncType()) && serviceMessageEntityList != null && serviceMessageEntityList.size() > 1){
|
||||
ServiceMessageEntity extraServiceMessageEntity = serviceMessageEntityList.get(1);
|
||||
apiInterfaceUI.setToResponseAdapter(extraServiceMessageEntity.getPsvsysadptrbzwkgroupname());
|
||||
String restOptionStr = extraServiceMessageEntity.getRestoption();
|
||||
|
||||
if(StringUtils.isNotBlank(restOptionStr)) {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
RestOption restOption = mapper.readValue(restOptionStr, RestOption.class);
|
||||
|
||||
apiInterfaceUI.setOutboundResponseHttpMethod(restOption.getMethod());
|
||||
apiInterfaceUI.setOutboundResponseRestPath(restOption.getExtraPath());
|
||||
}
|
||||
}
|
||||
|
||||
apiInterfaceUI.setTransformYn(transformYn);
|
||||
apiInterfaceUI.setErrTransformYn(errTransformYn); // 추가
|
||||
@@ -430,8 +444,8 @@ public class ApiInterfaceService extends OnlBaseService {
|
||||
public void setServiceMessageRoutingInfo(ApiInterfaceUI vo, EAIMessageEntity eaiMessageEntity, List<ServiceMessageEntity> serviceMessageEntityList) throws Exception {
|
||||
// 기본 요청 ServiceMessageEntity 설정
|
||||
ServiceMessageEntity requestEntity = serviceMessageEntityList.get(0);
|
||||
|
||||
if ("async".equals(vo.getSyncAsyncType())) {
|
||||
|
||||
if ("async".equals(vo.getSyncAsyncType()) || "syncAsync".equals(vo.getSyncAsyncType())) {
|
||||
requestEntity.setPsvintfacdsticname("ASYN");
|
||||
}
|
||||
|
||||
@@ -462,6 +476,32 @@ public class ApiInterfaceService extends OnlBaseService {
|
||||
|
||||
setRouteInfo(vo, vo.getInboundResponseHttpMethod(), vo.getInboundResponseRestPath(), vo.getFromResponseAdapter(), responseEntity, vo.getInboundResponseStandardMessageItems());
|
||||
}
|
||||
|
||||
// syncAsync 타입인 경우 응답용 ServiceMessageEntity 추가 처리
|
||||
if ("syncAsync".equals(vo.getSyncAsyncType())) {
|
||||
ServiceMessageEntity responseEntity;
|
||||
|
||||
// ServiceMessageEntity가 없으면 새로 생성
|
||||
if (serviceMessageEntityList.size() < 2) {
|
||||
responseEntity = new ServiceMessageEntity();
|
||||
responseEntity.setId(new ServiceMessageEntityId(vo.getEaiSvcName(), 2));
|
||||
responseEntity.setEaimessage(eaiMessageEntity);
|
||||
serviceMessageEntityList.add(responseEntity);
|
||||
} else {
|
||||
responseEntity = serviceMessageEntityList.get(1);
|
||||
}
|
||||
|
||||
// ServiceMessageEntity 설정
|
||||
responseEntity.setPsvsysadptrbzwkgroupname(vo.getToResponseAdapter());
|
||||
responseEntity.setPsvintfacdsticname("ASYN");
|
||||
|
||||
// REST 정보 설정
|
||||
AdapterGroupUI responseAdapter = adapterService.selectDetail(vo.getToResponseAdapter());
|
||||
String responseRoutName = getOutboundProcessorName(responseAdapter);
|
||||
responseEntity.setOutbndroutname(responseRoutName);
|
||||
|
||||
setRouteInfo(vo, vo.getOutboundResponseHttpMethod(), vo.getOutboundResponseRestPath(), vo.getToResponseAdapter(), responseEntity, vo.getStandardMessageItems());
|
||||
}
|
||||
}
|
||||
|
||||
public static List<StdMessageItemUI> convertMapToStdMessageItems(Map<String, String> standardCommonFields) {
|
||||
|
||||
@@ -54,6 +54,11 @@ public class ApiInterfaceUI {
|
||||
private String inboundResponseHttpMethod;
|
||||
private String inboundResponseRestPath;
|
||||
private String fromResponseAdapter;
|
||||
|
||||
//SYNC-ASYNC 용
|
||||
private String outboundResponseHttpMethod;
|
||||
private String outboundResponseRestPath;
|
||||
private String toResponseAdapter;
|
||||
|
||||
private String inboundErrResponseLayout;
|
||||
private String errResponseTransform;
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.eactive.ext.kjb.spring;
|
||||
|
||||
import com.eactive.ext.kjb.safedb.KjbSafedbWrapper;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
|
||||
public class KjbSafedbPasswordEncoder implements PasswordEncoder {
|
||||
@Override
|
||||
public String encode(CharSequence rawPassword) {
|
||||
KjbSafedbWrapper safedb = KjbSafedbWrapper.getInstance();
|
||||
return safedb.encryptPassword(rawPassword.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(CharSequence rawPassword, String encodedPassword) {
|
||||
KjbSafedbWrapper safedb = KjbSafedbWrapper.getInstance();
|
||||
String encoded = safedb.encryptPassword(rawPassword.toString());
|
||||
return encoded.equals(encodedPassword);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
package com.eactive.ext.kjb.ums;
|
||||
|
||||
import com.eactive.apim.portal.template.entity.MessageRequest;
|
||||
import com.eactive.eai.rms.common.base.BaseService;
|
||||
import com.eactive.eai.rms.data.entity.man.monitoringProperty.service.MonitoringPropertyService;
|
||||
import com.eactive.ext.kjb.common.KjbProperty;
|
||||
import com.eactive.ext.kjb.safedb.KjbSafedbWrapper;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.JsonObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
|
||||
@Service
|
||||
@Transactional(transactionManager = "transactionManagerForEMS")
|
||||
@Slf4j
|
||||
public class KjbUmsService extends BaseService {
|
||||
public static final String PROP_GORUP_ID = "Monitoring";
|
||||
public static final String PROP_EAI_BATCH_URL = "kjb.ums.eai_batch.url";
|
||||
public static final String PROP_EAI_BATCH_SEND_DIR = "kjb.ums.eai_batch.send_dir";
|
||||
|
||||
|
||||
private final KjbSafedbWrapper kjbSafedbWrapper;
|
||||
|
||||
private final KjbProperty prop;
|
||||
|
||||
|
||||
@Autowired
|
||||
public KjbUmsService(KjbSafedbWrapper kjbSafedbWrapper,
|
||||
MonitoringPropertyService monitoringPropertyService) {
|
||||
this.kjbSafedbWrapper = kjbSafedbWrapper;
|
||||
|
||||
KjbProperty prop = new KjbProperty();
|
||||
prop.setEaiBatchUrl(monitoringPropertyService.getPropertyValue(PROP_GORUP_ID, PROP_EAI_BATCH_URL, ""));
|
||||
prop.setEaiBatchSendDir(monitoringPropertyService.getPropertyValue(PROP_GORUP_ID, PROP_EAI_BATCH_SEND_DIR, "/Data/files/send"));
|
||||
|
||||
this.prop = prop;
|
||||
}
|
||||
|
||||
public KjbUmsService(KjbSafedbWrapper kjbSafedbWrapper,
|
||||
KjbProperty property) {
|
||||
this.kjbSafedbWrapper = kjbSafedbWrapper;
|
||||
this.prop = property;
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
private void init() {
|
||||
if (prop.getEaiBatchUrl().isEmpty()) {
|
||||
log.warn("{} 가 설정되지 않음. 실제 EAI 배치 연동 없이 동작함", PROP_EAI_BATCH_URL);
|
||||
}
|
||||
|
||||
log.info("EAI Batch URL: {}", prop.getEaiBatchUrl());
|
||||
log.info("EAI Batch Send Dir: {}", prop.getEaiBatchSendDir());
|
||||
|
||||
|
||||
// 디렉토리 검사(쓰기 권한 포함)
|
||||
Path sendDirPath = Paths.get(prop.getEaiBatchSendDir());
|
||||
if (!sendDirPath.toFile().exists()) {
|
||||
// 생성 시도
|
||||
boolean created = sendDirPath.toFile().mkdirs();
|
||||
if (!created) {
|
||||
log.error("EAI_BATCH_SEND_DIR 디렉토리를 생성할 수 없음: {}", prop.getEaiBatchSendDir());
|
||||
throw new IllegalStateException("EAI_BATCH_SEND_DIR 디렉토리를 생성할 수 없음: " + prop.getEaiBatchSendDir());
|
||||
}
|
||||
}
|
||||
|
||||
if (!sendDirPath.toFile().isDirectory()) {
|
||||
log.error("EAI_BATCH_SEND_DIR 가 디렉토리가 아님: {}", prop.getEaiBatchSendDir());
|
||||
throw new IllegalStateException("EAI_BATCH_SEND_DIR 가 디렉토리가 아님: " + prop.getEaiBatchSendDir());
|
||||
}
|
||||
|
||||
if (!sendDirPath.toFile().canWrite()) {
|
||||
log.error("EAI_BATCH_SEND_DIR 에 쓰기 권한이 없음: {}", prop.getEaiBatchSendDir());
|
||||
throw new IllegalStateException("EAI_BATCH_SEND_DIR 에 쓰기 권한이 없음: " + prop.getEaiBatchSendDir());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void sendEmail(MessageRequest messageRequest) {
|
||||
log.debug("sendEmail() called - EAI_BATCH_URL: {}, EAI_BATCH_SEND_DIR: {}", prop.getEaiBatchUrl(), prop.getEaiBatchSendDir());
|
||||
log.debug("MessageRequest ID: {}, Email: {}", messageRequest.getId(), messageRequest.getEmail());
|
||||
|
||||
|
||||
if (StringUtils.isEmpty(messageRequest.getId())) {
|
||||
log.warn("MessageRequest ID is empty");
|
||||
throw new IllegalArgumentException("MessageRequest ID is required");
|
||||
}
|
||||
|
||||
if (StringUtils.isEmpty(messageRequest.getEmail())) {
|
||||
log.warn("MessageRequest Email is empty for ID: {}", messageRequest.getId());
|
||||
throw new IllegalArgumentException("MessageRequest Email is required for ID: " + messageRequest.getId());
|
||||
}
|
||||
|
||||
|
||||
String filename = "EMAIL_" + messageRequest.getId() + ".json";
|
||||
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
jsonObject.addProperty("EMAIL", kjbSafedbWrapper.encryptNotRnnoString(messageRequest.getEmail()));
|
||||
|
||||
|
||||
Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
||||
String jsonString = gson.toJson(jsonObject);
|
||||
byte[] jsonBytes = null;
|
||||
|
||||
try {
|
||||
jsonBytes = jsonString.getBytes("euc-kr");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
|
||||
}
|
||||
|
||||
log.debug("Generated JSON({} bytes): {}", jsonBytes.length, jsonString);
|
||||
log.debug("euc-kr first 10 bytes: {}...", Arrays.toString(Arrays.copyOfRange(jsonBytes, 0, 10)));
|
||||
}
|
||||
}
|
||||
@@ -2596,4 +2596,8 @@ auditLogMan.parameters = Parameters
|
||||
auditLogMan.remoteAddress = Remote Address
|
||||
auditLogMan.systemCode = System Code
|
||||
auditLogMan.title = Search Audit Log
|
||||
auditLogMan.userId = User ID
|
||||
auditLogMan.userId = User ID
|
||||
|
||||
|
||||
safeDB.decryptError = SafeDB Decrypt Error
|
||||
safeDB.encryptError = SafeDB Encrypt Error
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user