diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdPolicyView.java b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdPolicyView.java new file mode 100644 index 0000000..cc10555 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/domain/vpd/VpdPolicyView.java @@ -0,0 +1,27 @@ +package com.cloudhandson.vpdbackoffice.domain.vpd; + +public record VpdPolicyView( + String objectOwner, + String objectName, + String policyGroup, + String policyName, + String functionOwner, + String packageName, + String functionName, + String statementTypes, + String checkOption, + String enabled, + String staticPolicy, + String policyType, + String longPredicate +) { + + public String objectDisplayName() { + return objectOwner + "." + objectName; + } + + public String functionDisplayName() { + String packagePrefix = packageName == null || packageName.isBlank() ? "" : packageName + "."; + return functionOwner + "." + packagePrefix + functionName; + } +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java new file mode 100644 index 0000000..4356e4d --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/mapper/VpdPolicyMapper.java @@ -0,0 +1,11 @@ +package com.cloudhandson.vpdbackoffice.mapper; + +import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView; +import java.util.List; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface VpdPolicyMapper { + + List findPolicies(); +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java new file mode 100644 index 0000000..f77daf2 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/VpdPolicyService.java @@ -0,0 +1,20 @@ +package com.cloudhandson.vpdbackoffice.service; + +import com.cloudhandson.vpdbackoffice.domain.vpd.VpdPolicyView; +import com.cloudhandson.vpdbackoffice.mapper.VpdPolicyMapper; +import java.util.List; +import org.springframework.stereotype.Service; + +@Service +public class VpdPolicyService { + + private final VpdPolicyMapper mapper; + + public VpdPolicyService(VpdPolicyMapper mapper) { + this.mapper = mapper; + } + + public List findPolicies() { + return mapper.findPolicies(); + } +} diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java new file mode 100644 index 0000000..d62f310 --- /dev/null +++ b/src/main/java/com/cloudhandson/vpdbackoffice/web/VpdPolicyController.java @@ -0,0 +1,30 @@ +package com.cloudhandson.vpdbackoffice.web; + +import com.cloudhandson.vpdbackoffice.service.VpdPolicyService; +import java.util.List; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class VpdPolicyController { + + private final VpdPolicyService vpdPolicyService; + + public VpdPolicyController(VpdPolicyService vpdPolicyService) { + this.vpdPolicyService = vpdPolicyService; + } + + @GetMapping("/vpd-policies") + public String policies(Model model) { + try { + model.addAttribute("policies", vpdPolicyService.findPolicies()); + } catch (DataAccessException exception) { + RuntimeErrorMessage message = RuntimeErrorMessages.dataAccess(exception); + model.addAttribute("runtimeError", message); + model.addAttribute("policies", List.of()); + } + return "vpd-policies"; + } +} diff --git a/src/main/resources/mapper/VpdPolicyMapper.xml b/src/main/resources/mapper/VpdPolicyMapper.xml new file mode 100644 index 0000000..34364d0 --- /dev/null +++ b/src/main/resources/mapper/VpdPolicyMapper.xml @@ -0,0 +1,30 @@ + + + + + diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html index 90c06c9..9a93d9a 100644 --- a/src/main/resources/templates/fragments/layout.html +++ b/src/main/resources/templates/fragments/layout.html @@ -22,6 +22,7 @@ 토큰 ORDS 검증 MCP Reasoning + VPD 설정 ORDS 핸들러 설정 diff --git a/src/main/resources/templates/vpd-policies.html b/src/main/resources/templates/vpd-policies.html new file mode 100644 index 0000000..a79c733 --- /dev/null +++ b/src/main/resources/templates/vpd-policies.html @@ -0,0 +1,68 @@ + + + + + +
+
+

VPD 설정

+

현재 계정에서 조회 가능한 Oracle VPD policy 설정을 확인합니다.

+
+ +
+ 조회할 수 없습니다. + message +
+ +
+
+

VPD Policies

+ 0 +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ObjectPolicyFunctionStatementsStatusTypeOptions
+ ADMIN.TABLE +
SYS_DEFAULT
+
POLICYOWNER.FUNCSELECT + YES + DYNAMIC + Check: NO + Static: NO + Long: NO +
+ 조회 가능한 VPD policy가 없습니다. 정책이 없거나 현재 DB 계정에 dictionary 조회 권한이 없을 수 있습니다. +
+
+
+
+ +