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 @@ ) + +