Merge branch 'master' of https://git.eactive.synology.me:8090/eapim/djbank/eapim-admin.git
eapim-admin CI / build (push) Has been cancelled

This commit is contained in:
eastargh
2026-07-06 16:34:55 +09:00
16 changed files with 268 additions and 83 deletions
@@ -54,10 +54,18 @@ function detail(key){
$('#systemCode').val(data.systemCode); $('#systemCode').val(data.systemCode);
$('#logTypeText').val(data.logTypeText); $('#logTypeText').val(data.logTypeText);
$('#remoteAddress').val(data.remoteAddress); $('#remoteAddress').val(data.remoteAddress);
$('#logMsg').val(data.message);
$('#logSubMsg').val(data.command); $('#logSubMsg').val(data.command);
$('#parameters').val(data.parameters); $('#parameters').val(data.parameters);
// 사유(message)는 값이 있을 때만 노출
if (data.message) {
$('#logMsg').val(data.message);
$('#messageRow').show();
} else {
$('#logMsg').val('');
$('#messageRow').hide();
}
}, },
error:function(e){ error:function(e){
alert(e.responseText); alert(e.responseText);
@@ -121,6 +129,9 @@ $(document).ready(function() {
<tr> <tr>
<th><%= localeMessage.getString("auditLogMan.command") %></th><td><input type="text" id="logSubMsg" name="logSubMsg" readonly="readonly"/></td> <th><%= localeMessage.getString("auditLogMan.command") %></th><td><input type="text" id="logSubMsg" name="logSubMsg" readonly="readonly"/></td>
</tr> </tr>
<tr id="messageRow" style="display:none;">
<th><%= localeMessage.getString("auditLogMan.message") %></th><td><textarea id="logMsg" name="logMsg" style="width:100%;height:80px" readonly="readonly"></textarea></td>
</tr>
<tr height="100px"> <tr height="100px">
<th><%= localeMessage.getString("auditLogMan.parameters") %></th><td><textarea id="parameters" name="parameters" style="width:100%;height:200px" readonly="readonly"></textarea></td> <th><%= localeMessage.getString("auditLogMan.parameters") %></th><td><textarea id="parameters" name="parameters" style="width:100%;height:200px" readonly="readonly"></textarea></td>
</tr> </tr>
+82
View File
@@ -531,6 +531,88 @@
} }
}, 200); }, 200);
} }
/**
* 사유 입력 모달 - 확인 시 입력한 사유 문자열을 onConfirm(reason)으로 전달
* @param {string} message - 안내 메시지
* @param {object} options - (title, confirmText, cancelText, placeholder, required, onConfirm, onCancel)
* required 기본 true (빈 사유 차단)
*/
function showReasonPrompt(message, options) {
options = options || {};
var title = options.title || '사유 입력';
var confirmText = options.confirmText || '확인';
var cancelText = options.cancelText || '취소';
var placeholder = options.placeholder || '사유를 입력하세요.';
var required = options.required !== false;
var onConfirm = options.onConfirm || function(){};
var onCancel = options.onCancel || function(){};
// 기존 모달 제거
$('#commonReasonModal').remove();
var iconHtml = getAlertIcon('warning');
var modalHtml =
'<div id="commonReasonModal" class="common-alert-overlay">' +
'<div class="common-alert-modal alert-warning">' +
'<div class="common-alert-header">' +
'<span class="common-alert-icon">' + iconHtml + '</span>' +
'<span class="common-alert-title">' + title + '</span>' +
'</div>' +
'<div class="common-alert-body">' +
'<p class="common-alert-message">' + message + '</p>' +
'<textarea id="commonReasonInput" maxlength="200" placeholder="' + placeholder + '" style="width:100%;height:80px;margin-top:10px;box-sizing:border-box;font-size:13px;padding:8px;border:1px solid #ddd;border-radius:4px;resize:vertical;"></textarea>' +
'<p id="commonReasonError" style="display:none;color:#f44336;font-size:12px;margin:6px 0 0;">사유를 입력해 주세요.</p>' +
'</div>' +
'<div class="common-alert-footer">' +
'<button type="button" class="common-confirm-cancel-btn" id="commonReasonCancelBtn">' + cancelText + '</button>' +
'<button type="button" class="common-alert-btn" id="commonReasonOkBtn">' + confirmText + '</button>' +
'</div>' +
'</div>' +
'</div>';
$('body').append(modalHtml);
setTimeout(function() {
$('#commonReasonModal').addClass('show');
$('#commonReasonInput').focus();
}, 10);
// 확인 버튼
$('#commonReasonOkBtn').on('click', function() {
var reason = $.trim($('#commonReasonInput').val());
if (required && reason === '') {
$('#commonReasonError').show();
$('#commonReasonInput').focus();
return;
}
closeCommonReason(function() { onConfirm(reason); });
});
// 취소 버튼
$('#commonReasonCancelBtn').on('click', function() {
closeCommonReason(onCancel);
});
// ESC 키로 취소
$(document).on('keydown.commonReason', function(e) {
if (e.keyCode === 27) {
closeCommonReason(onCancel);
}
});
}
function closeCommonReason(callback) {
$('#commonReasonModal').removeClass('show');
setTimeout(function() {
$('#commonReasonModal').remove();
$(document).off('keydown.commonReason');
if (typeof callback === 'function') {
callback();
}
}, 200);
}
</script> </script>
<!-- 공용 Alert 모달 스타일 --> <!-- 공용 Alert 모달 스타일 -->
@@ -312,7 +312,9 @@ $(document).ready(function() {
<div class="content_middle" id="content_middle"> <div class="content_middle" id="content_middle">
<div class="search_wrap"> <div class="search_wrap">
<button type="button" class="cssbtn" id="btn_new" level="W"><i class="material-icons">add</i> <%= localeMessage.getString("button.new") %></button> <button type="button" class="cssbtn" id="btn_new" level="W"><i class="material-icons">add</i> <%= localeMessage.getString("button.new") %></button>
<c:if test="${hardDeleteEnabled}">
<button type="button" class="cssbtn" id="btn_delete_selected" level="W" style="background-color: #dc3545; border-color: #dc3545; color: white;"><i class="material-icons">delete_forever</i> 선택 삭제</button> <button type="button" class="cssbtn" id="btn_delete_selected" level="W" style="background-color: #dc3545; border-color: #dc3545; color: white;"><i class="material-icons">delete_forever</i> 선택 삭제</button>
</c:if>
<button type="button" class="cssbtn" id="btn_search" level="R"><i class="material-icons">search</i> <%= localeMessage.getString("button.search") %></button> <button type="button" class="cssbtn" id="btn_search" level="R"><i class="material-icons">search</i> <%= localeMessage.getString("button.search") %></button>
</div> </div>
<%--법인정보관리--%> <%--법인정보관리--%>
@@ -138,7 +138,11 @@
$("#btn_delete").hide(); $("#btn_delete").hide();
} }
$("#approvalStatus").val(portalOrgData.approvalStatus); $("select[name=approvalStatus]").val(portalOrgData.approvalStatus);
// 승인상태는 읽기전용(수정 불가) - 값은 그대로 제출되도록 disabled 대신 잠금 처리
$("select[name=approvalStatus]")
.css({'pointer-events':'none', 'background-color':'#eee'})
.attr('tabindex', '-1');
$("#compRegNo").val(formatCompanyRegNo(portalOrgData.compRegNo)); $("#compRegNo").val(formatCompanyRegNo(portalOrgData.compRegNo));
$("#corpRegNo").val(formatCorpRegNo(portalOrgData.corpRegNo)); $("#corpRegNo").val(formatCorpRegNo(portalOrgData.corpRegNo));
$("#createdDate").inputmask("9999-99-99 99:99:99", {'autoUnmask': true}); $("#createdDate").inputmask("9999-99-99 99:99:99", {'autoUnmask': true});
@@ -480,8 +484,7 @@
} }
} }
if (confirm("<%= localeMessage.getString("common.checkSave")%>") !== true) // 저장 확인/사유 입력은 유효성 검사 및 FormData 구성 후 처리 (하단 submit 분기)
return;
// FormData 생성 전에 분리된 전화번호 필드 제거 // FormData 생성 전에 분리된 전화번호 필드 제거
$("#scPhonePrefix, #scPhoneMiddle, #scPhoneLast, #orgPhonePrefix, #orgPhoneMiddle, #orgPhoneLast").removeAttr('name'); $("#scPhonePrefix, #scPhoneMiddle, #scPhoneLast, #orgPhonePrefix, #orgPhoneMiddle, #orgPhoneLast").removeAttr('name');
@@ -516,23 +519,47 @@
} }
// cmd 파라미터 추가 // cmd 및 사유(auditReason) 첨부 후 전송
formData.append("cmd", isDetail ? "UPDATE" : "INSERT"); function submitOrg(cmd, auditReason) {
formData.append("cmd", cmd);
$.ajax({ // 감사로그(AUDIT_LOG) 발화를 위한 systemCode. 법인/가입자 리포지토리는 고정 EMS 스키마라 스키마 전환 영향 없음
type : "POST", formData.append("serviceType", "APIGW");
url:url, if (auditReason) {
data: formData, formData.append("auditReason", auditReason);
processData: false,
contentType: false,
success:function(json){
alert("<%= localeMessage.getString("common.saveMsg") %>");
goNav(returnUrl);
},
error:function(e){
alert(e.responseText);
} }
});
$.ajax({
type : "POST",
url:url,
data: formData,
processData: false,
contentType: false,
success:function(json){
alert("<%= localeMessage.getString("common.saveMsg") %>");
goNav(returnUrl);
},
error:function(e){
alert(e.responseText);
}
});
}
if (isDetail) {
// 수정: 상태를 REMOVED로 바꾼 경우 삭제(cmd=DELETE)로 감사 기록 + 익명화
var targetCmd = ($("#orgStatus").val() === 'REMOVED') ? "DELETE" : "UPDATE";
var isRemove = (targetCmd === "DELETE");
showReasonPrompt(
isRemove ? "해당 법인을 삭제(탈퇴) 처리합니다. 사유를 입력해 주세요." : "법인 정보를 수정합니다. 사유를 입력해 주세요.",
{
title: isRemove ? "삭제 사유" : "수정 사유",
onConfirm: function(reason) { submitOrg(targetCmd, reason); }
}
);
} else {
// 신규 등록: 사유 불필요
if (confirm("<%= localeMessage.getString("common.checkSave")%>") !== true) return;
submitOrg("INSERT", null);
}
}); });
$("#btn_previous").click(function() { $("#btn_previous").click(function() {
@@ -541,25 +568,28 @@
$("#btn_delete").click(function(){ $("#btn_delete").click(function(){
if(confirm("<%= localeMessage.getString("common.confirmMsg")%>")){ showReasonPrompt("해당 법인을 삭제 처리합니다. 사유를 입력해 주세요.", {
var postData = $('#ajaxForm').serializeArray(); title: "삭제 사유",
postData.push({name: "cmd" , value:"DELETE"}); onConfirm: function(reason) {
var postData = $('#ajaxForm').serializeArray();
postData.push({name: "cmd" , value:"DELETE"});
postData.push({name: "serviceType", value: "APIGW"});
postData.push({name: "auditReason", value: reason});
$.ajax({ $.ajax({
type : "POST", type : "POST",
url:url, url:url,
data:postData, data:postData,
success:function(args){ success:function(args){
alert("<%= localeMessage.getString("common.deleteMsg") %>"); alert("<%= localeMessage.getString("common.deleteMsg") %>");
goNav(returnUrl); goNav(returnUrl);
}, },
error:function(e){ error:function(e){
alert(e.responseText); alert(e.responseText);
} }
}); });
}else{ }
return false; });
}
}); });
@@ -347,9 +347,11 @@
<button type="button" class="cssbtn" id="btn_new" level="W"><i <button type="button" class="cssbtn" id="btn_new" level="W"><i
class="material-icons">add</i> <%= localeMessage.getString("button.new") %> class="material-icons">add</i> <%= localeMessage.getString("button.new") %>
</button> </button>
<c:if test="${hardDeleteEnabled}">
<button type="button" class="cssbtn" id="btn_delete_selected" level="W" style="background-color: #dc3545; border-color: #dc3545; color: white;"><i <button type="button" class="cssbtn" id="btn_delete_selected" level="W" style="background-color: #dc3545; border-color: #dc3545; color: white;"><i
class="material-icons">delete_forever</i> 선택 삭제 class="material-icons">delete_forever</i> 선택 삭제
</button> </button>
</c:if>
<button type="button" class="cssbtn" id="btn_search" level="R"><i <button type="button" class="cssbtn" id="btn_search" level="R"><i
class="material-icons">search</i> <%= localeMessage.getString("button.search") %> class="material-icons">search</i> <%= localeMessage.getString("button.search") %>
</button> </button>
@@ -165,6 +165,10 @@
$("#userStatus").val(data.userStatus); $("#userStatus").val(data.userStatus);
$("#roleCode").val(data.roleCode).trigger('change'); $("#roleCode").val(data.roleCode).trigger('change');
$("#approvalStatus").val(data.approvalStatus); $("#approvalStatus").val(data.approvalStatus);
// 승인상태는 읽기전용(수정 불가) - 값은 그대로 제출되도록 disabled 대신 잠금 처리
$("#approvalStatus")
.css({'pointer-events':'none', 'background-color':'#eee'})
.attr('tabindex', '-1');
// 탈퇴 상태 처리 // 탈퇴 상태 처리
if (originalUserStatus === STATUS.REMOVED) { if (originalUserStatus === STATUS.REMOVED) {
@@ -488,29 +492,49 @@
formData.push({name: 'mobileNumber', value: mobileNumber}); formData.push({name: 'mobileNumber', value: mobileNumber});
} }
formData.push({ // cmd 및 사유(auditReason) 첨부 후 전송
name: 'cmd', function submitUser(cmd, auditReason) {
value: isDetail ? "UPDATE" : "INSERT" formData.push({ name: 'cmd', value: cmd });
}); // 감사로그(AUDIT_LOG) 발화를 위한 systemCode. 가입자 리포지토리는 고정 EMS 스키마라 스키마 전환 영향 없음
formData.push({ name: 'serviceType', value: 'APIGW' });
if (!confirm("<%= localeMessage.getString("common.checkSave")%>")) return; if (auditReason) {
formData.push({ name: 'auditReason', value: auditReason });
$.ajax({
type: "POST",
url: url,
data: formData,
success: function (json) {
if (json.status === "fail") {
alert(json.errorMsg || "저장에 실패했습니다.");
return;
}
alert("<%= localeMessage.getString("common.saveMsg") %>");
goNav(returnUrl);
},
error: function (e) {
alert(e.responseText);
} }
});
$.ajax({
type: "POST",
url: url,
data: formData,
success: function (json) {
if (json.status === "fail") {
alert(json.errorMsg || "저장에 실패했습니다.");
return;
}
alert("<%= localeMessage.getString("common.saveMsg") %>");
goNav(returnUrl);
},
error: function (e) {
alert(e.responseText);
}
});
}
if (isDetail) {
// 수정: 상태를 REMOVED로 바꾼 경우 삭제(cmd=DELETE)로 감사 기록 + 익명화
var targetCmd = ($("#userStatus").val() === 'REMOVED') ? "DELETE" : "UPDATE";
var isRemove = (targetCmd === "DELETE");
showReasonPrompt(
isRemove ? "해당 가입자를 삭제(탈퇴) 처리합니다. 사유를 입력해 주세요." : "가입자 정보를 수정합니다. 사유를 입력해 주세요.",
{
title: isRemove ? "삭제 사유" : "수정 사유",
onConfirm: function(reason) { submitUser(targetCmd, reason); }
}
);
} else {
// 신규 등록: 사유 불필요
if (!confirm("<%= localeMessage.getString("common.checkSave")%>")) return;
submitUser("INSERT", null);
}
}); });
$("#btn_previous").click(function () { $("#btn_previous").click(function () {
@@ -518,21 +542,26 @@
}); });
$("#btn_delete").click(function () { $("#btn_delete").click(function () {
if (!confirm("<%= localeMessage.getString("common.confirmMsg")%>")) return; showReasonPrompt("해당 가입자를 삭제 처리합니다. 사유를 입력해 주세요.", {
title: "삭제 사유",
$.ajax({ onConfirm: function(reason) {
type: "POST", $.ajax({
url: url, type: "POST",
data: { url: url,
cmd: "DELETE", data: {
id: $('input[name=id]').val() cmd: "DELETE",
}, id: $('input[name=id]').val(),
success: function () { serviceType: "APIGW",
alert("<%= localeMessage.getString("common.deleteMsg") %>"); auditReason: reason
goNav(returnUrl); },
}, success: function () {
error: function (e) { alert("<%= localeMessage.getString("common.deleteMsg") %>");
alert(e.responseText); goNav(returnUrl);
},
error: function (e) {
alert(e.responseText);
}
});
} }
}); });
}); });
@@ -41,10 +41,12 @@ public class AuditLogInterceptor implements HandlerInterceptor {
if (isAuditableUsecase.isAuditable(userId, command, logType, systemCode)) { if (isAuditableUsecase.isAuditable(userId, command, logType, systemCode)) {
String parameters = getParametersAsString(request); String parameters = getParametersAsString(request);
String message = request.getParameter("auditReason");
log log
.debug("audit log save : logType={}, cmd={}, user={}, parameters={}", logType, command, .debug("audit log save : logType={}, cmd={}, user={}, parameters={}", logType, command,
userId, parameters); userId, parameters);
saveAuditLogUseCase.log(systemCode, logType, command, remoteAddress, userId, parameters); saveAuditLogUseCase
.log(systemCode, logType, command, remoteAddress, userId, parameters, message);
} }
} }
@@ -23,6 +23,8 @@ public class AuditLog {
private String logTypeText; private String logTypeText;
private String message;
private String parameters; private String parameters;
private LocalDateTime lastModifiedDate; private LocalDateTime lastModifiedDate;
@@ -3,6 +3,6 @@ package com.eactive.eai.rms.common.acl.audit.port.in;
public interface SaveAuditLogUseCase { public interface SaveAuditLogUseCase {
public void log(String systemCode, String logType, String command, String remoteAddress, String userId, public void log(String systemCode, String logType, String command, String remoteAddress, String userId,
String parameters); String parameters, String message);
} }
@@ -59,15 +59,16 @@ class AuditLogService
@Override @Override
public void log(String systemCode, String logType, String command, String remoteAddress, String userId, public void log(String systemCode, String logType, String command, String remoteAddress, String userId,
String parameters) { String parameters, String message) {
AuditLog auditLog = new AuditLog(systemCode, logType, command, userId, remoteAddress); AuditLog auditLog = new AuditLog(systemCode, logType, command, userId, remoteAddress);
String auditPointKey = AuditPoint.generateKey(logType, systemCode, command); String auditPointKey = AuditPoint.generateKey(logType, systemCode, command);
AuditPoint auditPoint = auditPoints.get(auditPointKey); AuditPoint auditPoint = auditPoints.get(auditPointKey);
auditLog.setLogTypeText(auditPoint.getLogTypeText()); auditLog.setLogTypeText(auditPoint.getLogTypeText());
auditLog.setLastModifiedDate(LocalDateTime.now()); auditLog.setLastModifiedDate(LocalDateTime.now());
auditLog.setParameters(parameters); auditLog.setParameters(parameters);
auditLog.setMessage(message);
saveAuditLogPort.save(auditLog); saveAuditLogPort.save(auditLog);
} }
@@ -23,6 +23,7 @@ import org.springframework.data.web.SortDefault;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@@ -37,8 +38,8 @@ public class PortalOrgManController extends BaseAnnotationController {
private final ComboService comboService; private final ComboService comboService;
@GetMapping(value = "/onl/apim/portalorg/portalOrgMan.view") @GetMapping(value = "/onl/apim/portalorg/portalOrgMan.view")
public void view() { public void view(Model model) {
// view model.addAttribute("hardDeleteEnabled", portalOrgManService.isHardDeleteEnabled());
} }
@GetMapping(value = "/onl/apim/portalorg/portalOrgMan.view", params = "cmd=DETAIL") @GetMapping(value = "/onl/apim/portalorg/portalOrgMan.view", params = "cmd=DETAIL")
@@ -18,6 +18,7 @@ import com.eactive.eai.rms.onl.apim.masking.MaskingUtils;
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserCorpManagerUI; import com.eactive.eai.rms.onl.apim.portaluser.PortalUserCorpManagerUI;
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserCorpManagerUIMapper; import com.eactive.eai.rms.onl.apim.portaluser.PortalUserCorpManagerUIMapper;
import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.common.exception.BizException;
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -44,15 +45,27 @@ import java.util.Optional;
@Slf4j @Slf4j
public class PortalOrgManService extends BaseService { public class PortalOrgManService extends BaseService {
/** PortalProperty 그룹명 */
private static final String PORTAL_PROPERTY_GROUP = "Portal";
/** 법인 완전삭제(hard delete) 허용 프로퍼티 키 (true:허용, 기본 false) */
private static final String HARD_DELETE_FLAG_KEY = "org.hard-delete.enabled";
private final PortalOrgService portalOrgService; private final PortalOrgService portalOrgService;
private final PortalOrgUIMapper portalOrgUIMapper; private final PortalOrgUIMapper portalOrgUIMapper;
private final PortalUserService portalUserService; private final PortalUserService portalUserService;
private final PortalUserCorpManagerUIMapper portalUserCorpManagerUIMapper; private final PortalUserCorpManagerUIMapper portalUserCorpManagerUIMapper;
private final FileService fileService; private final FileService fileService;
private final PortalPropertyService portalPropertyService;
@PersistenceContext(unitName = "entityManagerFactoryForEMS") @PersistenceContext(unitName = "entityManagerFactoryForEMS")
private EntityManager entityManager; private EntityManager entityManager;
/** 법인 목록 '선택 삭제'(완전삭제) 버튼 노출 여부 */
public boolean isHardDeleteEnabled() {
Map<String, String> properties = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY_GROUP);
return Boolean.parseBoolean(properties.getOrDefault(HARD_DELETE_FLAG_KEY, "false"));
}
public Page<PortalOrgUI> selectList(Pageable pageable, PortalOrgUISearch portalOrgUISearch) { public Page<PortalOrgUI> selectList(Pageable pageable, PortalOrgUISearch portalOrgUISearch) {
Page<PortalOrg> portalOrg = portalOrgService.findAll(pageable, portalOrgUISearch); Page<PortalOrg> portalOrg = portalOrgService.findAll(pageable, portalOrgUISearch);
return portalOrg.map(entity -> convertToUIWithMaskOption(entity, true)); return portalOrg.map(entity -> convertToUIWithMaskOption(entity, true));
@@ -13,6 +13,7 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault; import org.springframework.data.web.SortDefault;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@@ -32,8 +33,8 @@ public class PortalUserManController extends BaseAnnotationController {
private final ComboService comboService; private final ComboService comboService;
@GetMapping(value = "/onl/apim/portaluser/portalUserMan.view") @GetMapping(value = "/onl/apim/portaluser/portalUserMan.view")
public void view() { public void view(Model model) {
// view model.addAttribute("hardDeleteEnabled", portalUserManService.isHardDeleteEnabled());
} }
@GetMapping(value = "/onl/apim/portaluser/portalUserMan.view", params = "cmd=DETAIL") @GetMapping(value = "/onl/apim/portaluser/portalUserMan.view", params = "cmd=DETAIL")
@@ -46,6 +46,8 @@ public class PortalUserManService extends BaseService {
private static final String PORTAL_PROPERTY_GROUP = "Portal"; private static final String PORTAL_PROPERTY_GROUP = "Portal";
/** 사용자 별 휴대폰 번호 중복 허용 프로퍼티 키 (true:허용, false:허용안함, 기본 false) */ /** 사용자 별 휴대폰 번호 중복 허용 프로퍼티 키 (true:허용, false:허용안함, 기본 false) */
private static final String PROP_MOBILE_DUPLICATE_ALLOW = "user.mobile.duplicate.allow"; private static final String PROP_MOBILE_DUPLICATE_ALLOW = "user.mobile.duplicate.allow";
/** 가입자 완전삭제(hard delete) 허용 프로퍼티 키 (true:허용, 기본 false) */
private static final String HARD_DELETE_FLAG_KEY = "user.hard-delete.enabled";
private final PortalUserService portalUserService; private final PortalUserService portalUserService;
private final PortalUserUIMapper portalUserUIMapper; private final PortalUserUIMapper portalUserUIMapper;
@@ -60,6 +62,11 @@ public class PortalUserManService extends BaseService {
private final PortalInquiryService portalInquiryService; private final PortalInquiryService portalInquiryService;
private final PortalPropertyService portalPropertyService; private final PortalPropertyService portalPropertyService;
/** 가입자 목록 '선택 삭제'(완전삭제) 버튼 노출 여부 */
public boolean isHardDeleteEnabled() {
Map<String, String> properties = portalPropertyService.getPortalPropertiesAsMap(PORTAL_PROPERTY_GROUP);
return Boolean.parseBoolean(properties.getOrDefault(HARD_DELETE_FLAG_KEY, "false"));
}
public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) { public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) {
Page<PortalUser> portalUser = portalUserService.findAll(pageable, portalUserUISearch); Page<PortalUser> portalUser = portalUserService.findAll(pageable, portalUserUISearch);
@@ -2490,6 +2490,7 @@ deployResourceSearchMan.deleteBtn=delete
auditLogMan.command = Command auditLogMan.command = Command
auditLogMan.logMsg = Message auditLogMan.logMsg = Message
auditLogMan.message = Reason
auditLogMan.logSeqNo = Number auditLogMan.logSeqNo = Number
auditLogMan.logSubMsg = Sub Message auditLogMan.logSubMsg = Sub Message
auditLogMan.logType.access = ACCESS auditLogMan.logType.access = ACCESS
@@ -202,6 +202,7 @@ apiScpMan.title = API-SCOPE \uB9F5\uD551
auditLogMan.command = Command auditLogMan.command = Command
auditLogMan.logMsg = \uBA54\uC2DC\uC9C0 auditLogMan.logMsg = \uBA54\uC2DC\uC9C0
auditLogMan.message = \uC0AC\uC720
auditLogMan.logSeqNo = \uBC88\uD638 auditLogMan.logSeqNo = \uBC88\uD638
auditLogMan.logSubMsg = \uC11C\uBE0C \uBA54\uC2DC\uC9C0 auditLogMan.logSubMsg = \uC11C\uBE0C \uBA54\uC2DC\uC9C0
auditLogMan.logType.access = \uC811\uC18D auditLogMan.logType.access = \uC811\uC18D