package com.cloudhandson.vpdbackoffice.domain.permission; public record PermissionView( long permissionId, long roleId, String roleName, long objectId, String objectName, String action, String permissionEffect, String rules, String visibleColumns, String filterPreview, String nullPolicyPreview ) { public String businessRuleSummary() { if (rules == null || rules.isBlank()) { return "-"; } return java.util.Arrays.stream(rules.split(",")) .map(String::trim) .filter(value -> !value.isBlank()) .map(PermissionView::businessRuleLabel) .collect(java.util.stream.Collectors.joining(System.lineSeparator() + "AND ")); } public String storedRuleSummary() { return rules == null || rules.isBlank() ? "-" : rules; } public String vpdMappingSummary() { return filterPreview == null || filterPreview.isBlank() ? "-" : filterPreview; } public String columnControlSummary() { if (visibleColumns == null || visibleColumns.isBlank()) { return "컬럼 원문/마스킹은 컬럼 마스킹에서 관리"; } return "기존 권한별 표시 예외 값: " + visibleColumns + " · 신규 컬럼 제어는 컬럼 마스킹에서 관리"; } private static String businessRuleLabel(String rawRule) { String upper = rawRule.toUpperCase(java.util.Locale.ROOT); if ("ALL".equals(upper)) { return "전체 행"; } if (upper.contains(" TOKEN_SUBJECT")) { return "토큰으로 식별된 이해관계자 본인 행"; } if (upper.contains(" OWN_CONTRACT")) { return "담당 설계사 본인 계약"; } if (upper.contains(" CHANNEL_CONTRACT")) { return "토큰 사용자의 채널 계약"; } if (upper.contains(" OWN_CUSTOMER")) { return "담당 설계사 본인 계약에 연결된 고객/청구/외부보유"; } if (upper.contains(" CHANNEL_CUSTOMER")) { return "토큰 사용자 채널 계약에 연결된 고객/청구/외부보유"; } if (upper.contains(" STATIC_SQL ")) { return "정적 SQL 조건: " + rawRule.replaceFirst("(?i)^\\s*STATIC_SQL\\s+", ""); } if (upper.startsWith("STATIC_SQL ")) { return "정적 SQL 조건: " + rawRule.substring("STATIC_SQL ".length()); } if (upper.contains(" MY_DEPT")) { return "내 부서 행"; } if (upper.contains(" SELF")) { return "내 사번/소유자 행"; } if (upper.contains(" TAG ")) { return "태그 조건: " + rawRule; } return rawRule; } }