ProcessClaimDecisionHandler.java
Browserlesbare Ansicht der unveränderten Java-Quelldatei. Die Originaldatei bleibt im Maven-Projekt erhalten.
Zuordnung
Command Handler / Use Case Interactor
Quellcode
package com.seb4u.demo.claims.application.handler;
/**
* Entwurfsmuster: Command Handler / Use Case Interactor. Orchestriert einen fachlichen Anwendungsfall über Ports, Repository und Policies.
*/
import com.seb4u.demo.claims.application.command.ProcessClaimDecisionCommand;
import com.seb4u.demo.claims.application.command.ProcessClaimDecisionResult;
import com.seb4u.demo.claims.application.policy.AuthorizationPolicy;
import com.seb4u.demo.claims.application.port.AuditLogPort;
import com.seb4u.demo.claims.application.port.ClaimRepository;
import com.seb4u.demo.claims.application.port.PaymentReleasePort;
import com.seb4u.demo.claims.domain.Claim;
import com.seb4u.demo.claims.domain.ClaimDecisionType;
import com.seb4u.demo.claims.domain.ClaimStatus;
import com.seb4u.demo.claims.domain.ClaimTransitionPolicy;
public class ProcessClaimDecisionHandler {
private final ClaimRepository repository;
private final PaymentReleasePort paymentReleasePort;
private final AuditLogPort auditLogPort;
private final ClaimTransitionPolicy transitionPolicy;
private final AuthorizationPolicy authorizationPolicy;
public ProcessClaimDecisionHandler(
ClaimRepository repository,
PaymentReleasePort paymentReleasePort,
AuditLogPort auditLogPort,
ClaimTransitionPolicy transitionPolicy,
AuthorizationPolicy authorizationPolicy) {
this.repository = repository;
this.paymentReleasePort = paymentReleasePort;
this.auditLogPort = auditLogPort;
this.transitionPolicy = transitionPolicy;
this.authorizationPolicy = authorizationPolicy;
}
public ProcessClaimDecisionResult handle(ProcessClaimDecisionCommand command) {
authorizationPolicy.requireClaimsDecisionRole(command.roles());
Claim claim = repository.getRequired(command.claimId());
ClaimStatus target = targetStatus(command.decisionType());
transitionPolicy.requireAllowed(claim.status(), target);
claim.transitionTo(target, command.reason());
boolean paymentPrepared = false;
if (command.decisionType() == ClaimDecisionType.RELEASE_PAYMENT) {
paymentReleasePort.preparePayment(command.claimId(), command.requestedPayment(), command.claimId().value() + ":release-payment");
paymentPrepared = true;
}
repository.save(claim);
String auditReference = auditLogPort.append(command.claimId(), command.actor(), "PROCESS_CLAIM_DECISION", command.reason());
return new ProcessClaimDecisionResult(claim.status(), paymentPrepared, auditReference);
}
private ClaimStatus targetStatus(ClaimDecisionType decisionType) {
return switch (decisionType) {
case APPROVE -> ClaimStatus.APPROVED;
case REJECT -> ClaimStatus.REJECTED;
case ESCALATE -> ClaimStatus.ESCALATED;
case REQUEST_DOCUMENTS -> ClaimStatus.DOCUMENTS_PENDING;
case RELEASE_PAYMENT -> ClaimStatus.PAYMENT_RELEASED;
};
}
}