package com.dalab.policyengine.web.rest; import java.net.URI; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import com.dalab.common.security.SecurityUtils; import com.dalab.policyengine.dto.PolicyEvaluationOutputDTO; import com.dalab.policyengine.dto.PolicyEvaluationRequestDTO; import com.dalab.policyengine.dto.PolicyEvaluationSummaryDTO; import com.dalab.policyengine.service.IPolicyEvaluationService; import jakarta.validation.Valid; @RestController @RequestMapping("/api/v1/policyengine") public class PolicyEvaluationController { private static final Logger log = LoggerFactory.getLogger(PolicyEvaluationController.class); private final IPolicyEvaluationService policyEvaluationService; @Autowired public PolicyEvaluationController(IPolicyEvaluationService policyEvaluationService) { this.policyEvaluationService = policyEvaluationService; } @PostMapping("/{policyId}/evaluations") @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_SYSTEM')") public ResponseEntity triggerPolicyEvaluation( @PathVariable UUID policyId, @Valid @RequestBody PolicyEvaluationRequestDTO evaluationRequest) { log.info("REST request to trigger evaluation for Policy: {}", policyId); UUID triggeredByUserId = SecurityUtils.getAuthenticatedUserId(); // Can be null if system-triggered via Kafka PolicyEvaluationOutputDTO evaluation = policyEvaluationService.triggerPolicyEvaluation(policyId, evaluationRequest, triggeredByUserId); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{evaluationId}") .buildAndExpand(evaluation.getId()) .toUri(); return ResponseEntity.created(location).body(evaluation); } @GetMapping("/evaluations") @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_POLICY_MANAGER', 'ROLE_AUDITOR')") public ResponseEntity> getPolicyEvaluations( @PageableDefault(size = 50, sort = "evaluatedAt") Pageable pageable, @RequestParam(required = false) UUID policyId, @RequestParam(required = false) String targetAssetId, @RequestParam(required = false) String status) { log.info("REST request to get Policy Evaluations with filters: policyId={}, targetAssetId={}, status={}", policyId, targetAssetId, status); Page resultPage = policyEvaluationService.getPolicyEvaluations(pageable, policyId, targetAssetId, status); return ResponseEntity.ok(resultPage); } @GetMapping("/evaluations/{evaluationId}") @PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_POLICY_MANAGER', 'ROLE_AUDITOR')") public ResponseEntity getPolicyEvaluationById(@PathVariable UUID evaluationId) { log.info("REST request to get Policy Evaluation by id: {}", evaluationId); PolicyEvaluationOutputDTO evaluationDTO = policyEvaluationService.getPolicyEvaluationById(evaluationId); return ResponseEntity.ok(evaluationDTO); } }