From ae3dd6667e6313cdec00680294bb9b6b5f9dcb82 Mon Sep 17 00:00:00 2001 From: devmrko Date: Tue, 23 Jun 2026 14:30:22 +0900 Subject: [PATCH] [Developer] #424 show filters and ORDS handler details Refs #424 --- .../domain/ords/OrdsHandlerView.java | 18 +++++++++ .../domain/permission/PermissionView.java | 4 +- .../mapper/OrdsMetadataMapper.java | 13 +++++++ .../service/OrdsMetadataService.java | 33 ++++++++++++++++ .../web/OrdsHandlerController.java | 22 +++++++++++ .../resources/mapper/OrdsMetadataMapper.xml | 35 +++++++++++++++++ .../resources/mapper/PermissionMapper.xml | 23 ++++++++++- src/main/resources/static/css/app.css | 8 ++++ .../resources/templates/fragments/layout.html | 1 + .../resources/templates/ords-handlers.html | 39 +++++++++++++++++++ src/main/resources/templates/permissions.html | 4 +- 11 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/cloudhandson/vpdbackoffice/domain/ords/OrdsHandlerView.java create mode 100644 src/main/java/com/cloudhandson/vpdbackoffice/mapper/OrdsMetadataMapper.java create mode 100644 src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java create mode 100644 src/main/java/com/cloudhandson/vpdbackoffice/web/OrdsHandlerController.java create mode 100644 src/main/resources/mapper/OrdsMetadataMapper.xml create mode 100644 src/main/resources/templates/ords-handlers.html diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/domain/ords/OrdsHandlerView.java b/src/main/java/com/cloudhandson/vpdbackoffice/domain/ords/OrdsHandlerView.java new file mode 100644 index 0000000..303ee01 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/domain/ords/OrdsHandlerView.java @@ -0,0 +1,18 @@ +package com.cloudhandson.vpdbackoffice.domain.ords; + +public record OrdsHandlerView( + String schemaName, + String moduleName, + String basePath, + String template, + String method, + String sourceType, + String source, + String parameters, + String packageSource +) { + + public String fullPath() { + return "/ords/" + schemaName + "/" + basePath + template; + } +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/domain/permission/PermissionView.java b/src/main/java/com/cloudhandson/vpdbackoffice/domain/permission/PermissionView.java index 52fabe4..d100e98 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/domain/permission/PermissionView.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/domain/permission/PermissionView.java @@ -8,6 +8,8 @@ public record PermissionView( String objectName, String action, String rules, - String visibleColumns + String visibleColumns, + String filterPreview, + String nullPolicyPreview ) { } diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/mapper/OrdsMetadataMapper.java b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/OrdsMetadataMapper.java new file mode 100644 index 0000000..f0f2ab7 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/OrdsMetadataMapper.java @@ -0,0 +1,13 @@ +package com.cloudhandson.vpdbackoffice.mapper; + +import com.cloudhandson.vpdbackoffice.domain.ords.OrdsHandlerView; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OrdsMetadataMapper { + + List findHandlers(); + + String findHandlerPackageSource(); +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java new file mode 100644 index 0000000..74aa297 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/OrdsMetadataService.java @@ -0,0 +1,33 @@ +package com.cloudhandson.vpdbackoffice.service; + +import com.cloudhandson.vpdbackoffice.domain.ords.OrdsHandlerView; +import com.cloudhandson.vpdbackoffice.mapper.OrdsMetadataMapper; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class OrdsMetadataService { + + private final OrdsMetadataMapper mapper; + + public OrdsMetadataService(OrdsMetadataMapper mapper) { + this.mapper = mapper; + } + + public List findHandlers() { + String packageSource = mapper.findHandlerPackageSource(); + return mapper.findHandlers().stream() + .map(handler -> new OrdsHandlerView( + handler.schemaName(), + handler.moduleName(), + handler.basePath(), + handler.template(), + handler.method(), + handler.sourceType(), + handler.source(), + handler.parameters(), + packageSource + )) + .toList(); + } +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/web/OrdsHandlerController.java b/src/main/java/com/cloudhandson/vpdbackoffice/web/OrdsHandlerController.java new file mode 100644 index 0000000..bcae68e --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/web/OrdsHandlerController.java @@ -0,0 +1,22 @@ +package com.cloudhandson.vpdbackoffice.web; + +import com.cloudhandson.vpdbackoffice.service.OrdsMetadataService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class OrdsHandlerController { + + private final OrdsMetadataService ordsMetadataService; + + public OrdsHandlerController(OrdsMetadataService ordsMetadataService) { + this.ordsMetadataService = ordsMetadataService; + } + + @GetMapping("/ords-handlers") + public String handlers(Model model) { + model.addAttribute("handlers", ordsMetadataService.findHandlers()); + return "ords-handlers"; + } +} diff --git a/src/main/resources/mapper/OrdsMetadataMapper.xml b/src/main/resources/mapper/OrdsMetadataMapper.xml new file mode 100644 index 0000000..5c6c3af --- /dev/null +++ b/src/main/resources/mapper/OrdsMetadataMapper.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/src/main/resources/mapper/PermissionMapper.xml b/src/main/resources/mapper/PermissionMapper.xml index f0a6766..5b2e133 100644 --- a/src/main/resources/mapper/PermissionMapper.xml +++ b/src/main/resources/mapper/PermissionMapper.xml @@ -46,7 +46,28 @@ SELECT LISTAGG(pc.column_name, ', ') WITHIN GROUP (ORDER BY pc.column_name) FROM cb_permission_column pc WHERE pc.permission_id = p.perm_id - ) AS visible_columns + ) AS visible_columns, + ( + SELECT LISTAGG( + CASE + WHEN pr2.rule_type = 'ALL' THEN 'ALL ROWS' + WHEN pr2.rule_type = 'MY_DEPT' THEN pr2.rule_column || ' = SYS_CONTEXT(CB_AGENT_CTX.DEPT_CODE)' + WHEN pr2.rule_type = 'SELF' THEN pr2.rule_column || ' = SYS_CONTEXT(CB_AGENT_CTX.EMP_NO)' + ELSE pr2.rule_column || ' ' || pr2.rule_type || ' ' || pr2.rule_value + END, + CHR(10) || 'AND ' + ) WITHIN GROUP (ORDER BY pr2.rule_id) + FROM cb_permission_rule pr2 + WHERE pr2.perm_id = p.perm_id + ) AS filter_preview, + ( + SELECT CASE + WHEN COUNT(*) = 0 THEN '모든 민감 컬럼 NULL 처리' + ELSE 'NULL 제외: ' || LISTAGG(pc2.column_name, ', ') WITHIN GROUP (ORDER BY pc2.column_name) + END + FROM cb_permission_column pc2 + WHERE pc2.permission_id = p.perm_id + ) AS null_policy_preview FROM cb_permission p JOIN cb_app_role r ON r.role_id = p.role_id LEFT JOIN cb_protected_object o ON o.object_name = p.target_name diff --git a/src/main/resources/static/css/app.css b/src/main/resources/static/css/app.css index 0d2884c..287b8fb 100644 --- a/src/main/resources/static/css/app.css +++ b/src/main/resources/static/css/app.css @@ -347,6 +347,14 @@ body { word-break: break-word; } +.table-pre { + background: transparent; + color: inherit; + font-size: .78rem; + margin: 0; + white-space: pre-wrap; +} + @media (max-width: 640px) { .form-grid .span-2 { grid-column: span 1; diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html index 7a71991..e18bcfa 100644 --- a/src/main/resources/templates/fragments/layout.html +++ b/src/main/resources/templates/fragments/layout.html @@ -21,6 +21,7 @@ 테이블/뷰 토큰 ORDS 검증 + ORDS 핸들러 설정
diff --git a/src/main/resources/templates/ords-handlers.html b/src/main/resources/templates/ords-handlers.html new file mode 100644 index 0000000..4188670 --- /dev/null +++ b/src/main/resources/templates/ords-handlers.html @@ -0,0 +1,39 @@ + + + + + +
+
+

ORDS 핸들러

+

Bearer Token을 DB 컨텍스트로 변환하는 ORDS Handler와 PL/SQL 흐름을 확인합니다.

+
+ +
+
+

POST /ords/...

+ plsql +
+
+ Schema: CB_ORDS + Module: cb.agent.security + Template: vpd/documents +
+
+
+

Header Bindings

+

+      
+
+

Handler Source

+

+      
+
+

Bearer Token -> User Context Package

+

+      
+
+
+
+ + diff --git a/src/main/resources/templates/permissions.html b/src/main/resources/templates/permissions.html index d41e6f3..0b28077 100644 --- a/src/main/resources/templates/permissions.html +++ b/src/main/resources/templates/permissions.html @@ -79,6 +79,7 @@ 테이블/뷰 Action 행 규칙 + 적용 필터 NULL 제외 컬럼 @@ -90,6 +91,7 @@ CB_V_SEARCH_DOCUMENTS SELECT ALL +
ALL ROWS
CONTENTS @@ -100,7 +102,7 @@ - 등록된 권한이 없습니다. + 등록된 권한이 없습니다.