From d010f2659a6ebb2e3cfdb37deadaecf4531997ea Mon Sep 17 00:00:00 2001 From: devmrko Date: Fri, 26 Jun 2026 06:21:29 +0900 Subject: [PATCH] fix #477: show target policy filters --- .../domain/vpd/VpdObjectFilterDetail.java | 20 ++++++++++++ .../domain/vpd/VpdTargetView.java | 3 +- .../vpdbackoffice/mapper/VpdPolicyMapper.java | 5 +++ .../service/VpdPolicyService.java | 13 ++++++++ .../web/VpdPolicyController.java | 17 ++++++++++ src/main/resources/mapper/VpdPolicyMapper.xml | 16 +++++++++- src/main/resources/static/css/app.css | 6 ++++ .../fragments/vpd-object-filter-detail.html | 31 +++++++++++++++++++ .../resources/templates/vpd-policies.html | 25 +++++++++++++-- 9 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdObjectFilterDetail.java create mode 100644 src/main/resources/templates/fragments/vpd-object-filter-detail.html diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdObjectFilterDetail.java b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdObjectFilterDetail.java new file mode 100644 index 0000000..77b5619 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdObjectFilterDetail.java @@ -0,0 +1,20 @@ +package com.cloudhandson.vpdbackoffice.domain.vpd; + +import java.util.List; + +public record VpdObjectFilterDetail( + String objectOwner, + String objectName, + List rows +) { + + public String objectDisplayName() { + return objectOwner + "." + objectName; + } + + public record Row( + VpdPolicyView policy, + VpdFunctionSource source + ) { + } +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdTargetView.java b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdTargetView.java index 4f855a6..911088b 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdTargetView.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdTargetView.java @@ -7,7 +7,8 @@ public record VpdTargetView( String protectedYn, String ordsPath, int policyCount, - String policyNames + String policyNames, + String filterNames ) { public String objectDisplayName() { diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java index a0b129e..405d4e7 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java @@ -35,6 +35,11 @@ public interface VpdPolicyMapper { @Param("policyName") String policyName ); + List findPoliciesForObject( + @Param("objectOwner") String objectOwner, + @Param("objectName") String objectName + ); + VpdPolicyView findAnyPolicy( @Param("objectOwner") String objectOwner, @Param("objectName") String objectName, diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java index 52bcd5e..b009c81 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java @@ -2,6 +2,7 @@ package com.cloudhandson.vpdbackoffice.service; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdBulkApplyResult; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdFunctionSource; +import com.cloudhandson.vpdbackoffice.domain.vpd.VpdObjectFilterDetail; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyCreateCommand; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyDetail; import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyExplanation; @@ -233,6 +234,18 @@ public class VpdPolicyService { return new VpdPolicyDetail(policy, buildAddPolicyBlock(policy)); } + public VpdObjectFilterDetail findObjectFilterDetail(String objectOwner, String objectName) { + String normalizedOwner = requiredIdentifier(objectOwner, "Object owner"); + String normalizedObject = requiredIdentifier(objectName, "Object name"); + List rows = mapper.findPoliciesForObject(normalizedOwner, normalizedObject).stream() + .map(policy -> new VpdObjectFilterDetail.Row( + policy, + findFunctionSource(policy.functionOwner(), policy.packageName(), policy.functionName()) + )) + .toList(); + return new VpdObjectFilterDetail(normalizedOwner, normalizedObject, rows); + } + @Transactional public void createPolicy(VpdPolicyCreateCommand command) { String objectOwner = requiredIdentifier(command.objectOwner(), "Object owner"); diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java index 704e286..4b7e363 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java @@ -306,6 +306,23 @@ public class VpdPolicyController { return "fragments/vpd-policy-detail :: detail"; } + @GetMapping("/vpd-policies/object-filter-detail") + public String objectFilterDetail( + @RequestParam String objectOwner, + @RequestParam String objectName, + Model model + ) { + try { + model.addAttribute("detail", vpdPolicyService.findObjectFilterDetail(objectOwner, objectName)); + } catch (AppException exception) { + model.addAttribute("errorMessage", exception.getMessage()); + } catch (DataAccessException exception) { + RuntimeErrorMessage message = RuntimeErrorMessages.dataAccess(exception); + model.addAttribute("errorMessage", message.message()); + } + return "fragments/vpd-object-filter-detail :: detail"; + } + @GetMapping("/vpd-policies/policy-explanation") public String policyExplanation( @RequestParam String objectOwner, diff --git a/src/main/resources/mapper/VpdPolicyMapper.xml b/src/main/resources/mapper/VpdPolicyMapper.xml index 24f8e1d..9b2da88 100644 --- a/src/main/resources/mapper/VpdPolicyMapper.xml +++ b/src/main/resources/mapper/VpdPolicyMapper.xml @@ -63,7 +63,13 @@ CASE WHEN po.object_id IS NULL THEN 'N' ELSE po.enabled_yn END AS protected_yn, po.ords_path, COUNT(p.policy_name) AS policy_count, - LISTAGG(p.policy_name, ', ') WITHIN GROUP (ORDER BY p.policy_name) AS policy_names + LISTAGG(p.policy_name, ', ') WITHIN GROUP (ORDER BY p.policy_name) AS policy_names, + LISTAGG( + p.pf_owner || + CASE WHEN p.package IS NULL THEN '.' ELSE '.' || p.package || '.' END || + p.function, + ', ' + ) WITHIN GROUP (ORDER BY p.policy_name) AS filter_names FROM managed_objects o LEFT JOIN cb_protected_object po ON po.owner = o.owner @@ -210,6 +216,14 @@ ) + +