From b646ba6ca772151855effd276a5b35b4ad42ed0f Mon Sep 17 00:00:00 2001 From: viktorpavlenko Date: Fri, 21 Mar 2025 00:47:12 +0200 Subject: [PATCH] FINERACT-2169: Refactor loan COB catch up api controller; --- .../test/stepdef/loan/LoanCOBStepDef.java | 4 +- .../test/stepdef/loan/LoanStepDef.java | 14 ++--- .../cob/api/LoanCOBCatchUpApiResource.java | 63 +++++++------------ .../common/loans/LoanCOBCatchUpHelper.java | 20 +++--- 4 files changed, 41 insertions(+), 60 deletions(-) diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanCOBStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanCOBStepDef.java index 8744d9416..77db58d6f 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanCOBStepDef.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanCOBStepDef.java @@ -26,9 +26,9 @@ import java.io.IOException; import java.time.LocalDate; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.apache.fineract.client.models.GetOldestCOBProcessedLoanResponse; import org.apache.fineract.client.models.LoanAccountLock; import org.apache.fineract.client.models.LoanAccountLockResponseDTO; +import org.apache.fineract.client.models.OldestCOBProcessedLoanDTO; import org.apache.fineract.client.models.PostLoansResponse; import org.apache.fineract.client.services.DefaultApi; import org.apache.fineract.client.services.LoanAccountLockApi; @@ -54,7 +54,7 @@ public class LoanCOBStepDef extends AbstractStepDef { @Then("The cobProcessedDate of the oldest loan processed by COB is more than 1 day earlier than cobBusinessDate") public void checkOldestCOBProcessed() throws IOException { - Response response = loanCobCatchUpApi.getOldestCOBProcessedLoan().execute(); + Response response = loanCobCatchUpApi.getOldestCOBProcessedLoan().execute(); ErrorHelper.checkSuccessfulApiCall(response); LocalDate cobDate = response.body().getCobBusinessDate(); diff --git a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java index 5dec10162..11fccebb1 100644 --- a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java +++ b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/LoanStepDef.java @@ -79,7 +79,7 @@ import org.apache.fineract.client.models.GetLoansLoanIdTransactions; import org.apache.fineract.client.models.GetLoansLoanIdTransactionsResponse; import org.apache.fineract.client.models.GetLoansLoanIdTransactionsTransactionIdResponse; import org.apache.fineract.client.models.InterestPauseRequestDto; -import org.apache.fineract.client.models.IsCatchUpRunningResponse; +import org.apache.fineract.client.models.IsCatchUpRunningDTO; import org.apache.fineract.client.models.PaymentAllocationOrder; import org.apache.fineract.client.models.PostClientsResponse; import org.apache.fineract.client.models.PostLoansLoanIdRequest; @@ -2293,19 +2293,19 @@ public class LoanStepDef extends AbstractStepDef { .pollInterval(Duration.ofSeconds(5)) // .pollDelay(Duration.ofSeconds(5)) // .until(() -> { - Response isCatchUpRunningResponse = loanCobCatchUpApi.isCatchUpRunning().execute(); + Response isCatchUpRunningResponse = loanCobCatchUpApi.isCatchUpRunning().execute(); ErrorHelper.checkSuccessfulApiCall(isCatchUpRunningResponse); - IsCatchUpRunningResponse isCatchUpRunning = isCatchUpRunningResponse.body(); - return isCatchUpRunning.getIsCatchUpRunning(); + IsCatchUpRunningDTO isCatchUpRunning = isCatchUpRunningResponse.body(); + return isCatchUpRunning.getCatchUpRunning(); }); await().atMost(Duration.ofMinutes(4)) // .pollInterval(Duration.ofSeconds(5)) // .pollDelay(Duration.ofSeconds(5)) // .until(() -> { - Response isCatchUpRunningResponse = loanCobCatchUpApi.isCatchUpRunning().execute(); + Response isCatchUpRunningResponse = loanCobCatchUpApi.isCatchUpRunning().execute(); ErrorHelper.checkSuccessfulApiCall(isCatchUpRunningResponse); - IsCatchUpRunningResponse isCatchUpRunning = isCatchUpRunningResponse.body(); - return !isCatchUpRunning.getIsCatchUpRunning(); + IsCatchUpRunningDTO isCatchUpRunning = isCatchUpRunningResponse.body(); + return !isCatchUpRunning.getCatchUpRunning(); }); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/api/LoanCOBCatchUpApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/cob/api/LoanCOBCatchUpApiResource.java index b8de555f6..7a928ff20 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/api/LoanCOBCatchUpApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/api/LoanCOBCatchUpApiResource.java @@ -19,8 +19,6 @@ package org.apache.fineract.cob.api; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; @@ -31,41 +29,31 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; -import java.util.Objects; +import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.apache.fineract.cob.data.IsCatchUpRunningDTO; import org.apache.fineract.cob.data.OldestCOBProcessedLoanDTO; import org.apache.fineract.cob.service.LoanCOBCatchUpService; import org.apache.fineract.infrastructure.core.exception.JobIsNotFoundOrNotEnabledException; -import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Path("/v1/loans") @Component @Tag(name = "Loan COB Catch Up", description = "") +@RequiredArgsConstructor public class LoanCOBCatchUpApiResource { - @Autowired - private DefaultToApiJsonSerializer oldestCOBProcessedLoanSerializeService; - @Autowired - private DefaultToApiJsonSerializer isCatchUpRunningSerializer; - @Autowired(required = false) - private LoanCOBCatchUpService loanCOBCatchUpService; + private final Optional loanCOBCatchUpServiceOp; @GET @Path("oldest-cob-closed") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Retrieves the oldest COB processed loan", description = "Retrieves the COB business date and the oldest COB processed loan") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = LoanCOBCatchUpApiResourceSwagger.GetOldestCOBProcessedLoanResponse.class))) }) - public String getOldestCOBProcessedLoan() { - if (Objects.isNull(loanCOBCatchUpService)) { - throw new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name()); - } - OldestCOBProcessedLoanDTO response = loanCOBCatchUpService.getOldestCOBProcessedLoan(); - return oldestCOBProcessedLoanSerializeService.serialize(response); + public OldestCOBProcessedLoanDTO getOldestCOBProcessedLoan() { + return loanCOBCatchUpServiceOp.map(LoanCOBCatchUpService::getOldestCOBProcessedLoan) + .orElseThrow(() -> new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name())); } @POST @@ -77,20 +65,19 @@ public class LoanCOBCatchUpApiResource { @ApiResponse(responseCode = "202", description = "Catch Up has been started"), @ApiResponse(responseCode = "400", description = "Catch Up is already running") }) public Response executeLoanCOBCatchUp() { - if (Objects.isNull(loanCOBCatchUpService)) { - throw new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name()); - } - if (loanCOBCatchUpService.isCatchUpRunning().isCatchUpRunning()) { - return Response.status(Response.Status.BAD_REQUEST).build(); - } - loanCOBCatchUpService.unlockHardLockedLoans(); - OldestCOBProcessedLoanDTO oldestCOBProcessedLoan = loanCOBCatchUpService.getOldestCOBProcessedLoan(); - if (oldestCOBProcessedLoan.getCobProcessedDate().equals(oldestCOBProcessedLoan.getCobBusinessDate())) { - return Response.status(Response.Status.OK).build(); - } - loanCOBCatchUpService.executeLoanCOBCatchUp(); + return loanCOBCatchUpServiceOp.map(loanCOBCatchUpService -> { + if (loanCOBCatchUpService.isCatchUpRunning().isCatchUpRunning()) { + return Response.status(Response.Status.BAD_REQUEST).build(); + } + loanCOBCatchUpService.unlockHardLockedLoans(); + OldestCOBProcessedLoanDTO oldestCOBProcessedLoan = loanCOBCatchUpService.getOldestCOBProcessedLoan(); - return Response.status(Response.Status.ACCEPTED).build(); + if (oldestCOBProcessedLoan.getCobProcessedDate().equals(oldestCOBProcessedLoan.getCobBusinessDate())) { + return Response.status(Response.Status.OK).build(); + } + loanCOBCatchUpService.executeLoanCOBCatchUp(); + return Response.status(Response.Status.ACCEPTED).build(); + }).orElseThrow(() -> new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name())); } @GET @@ -98,14 +85,8 @@ public class LoanCOBCatchUpApiResource { @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Retrieves whether Loan COB catch up is running", description = "Retrieves whether Loan COB catch up is running, and the current execution date if it is running.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = LoanCOBCatchUpApiResourceSwagger.IsCatchUpRunningResponse.class))) }) - public String isCatchUpRunning() { - if (Objects.isNull(loanCOBCatchUpService)) { - throw new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name()); - } - IsCatchUpRunningDTO response = loanCOBCatchUpService.isCatchUpRunning(); - - return isCatchUpRunningSerializer.serialize(response); + public IsCatchUpRunningDTO isCatchUpRunning() { + return loanCOBCatchUpServiceOp.map(LoanCOBCatchUpService::isCatchUpRunning) + .orElseThrow(() -> new JobIsNotFoundOrNotEnabledException(JobName.LOAN_COB.name())); } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanCOBCatchUpHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanCOBCatchUpHelper.java index 1d1cad352..1ee4ffc1d 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanCOBCatchUpHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/loans/LoanCOBCatchUpHelper.java @@ -21,8 +21,8 @@ package org.apache.fineract.integrationtests.common.loans; import java.time.LocalDate; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.apache.fineract.client.models.GetOldestCOBProcessedLoanResponse; -import org.apache.fineract.client.models.IsCatchUpRunningResponse; +import org.apache.fineract.client.models.IsCatchUpRunningDTO; +import org.apache.fineract.client.models.OldestCOBProcessedLoanDTO; import org.apache.fineract.client.util.Calls; import org.apache.fineract.integrationtests.common.FineractClientHelper; import org.jetbrains.annotations.NotNull; @@ -34,16 +34,16 @@ public class LoanCOBCatchUpHelper { public LoanCOBCatchUpHelper() {} public boolean isLoanCOBCatchUpRunning() { - Response response = executeGetLoanCatchUpStatus(); - return Boolean.TRUE.equals(Objects.requireNonNull(response.body()).getIsCatchUpRunning()); + Response response = executeGetLoanCatchUpStatus(); + return Boolean.TRUE.equals(Objects.requireNonNull(response.body()).getCatchUpRunning()); } public boolean isLoanCOBCatchUpFinishedFor(@NotNull LocalDate cobBusinessDate) { - Response response = executeGetLoanCatchUpStatus(); - IsCatchUpRunningResponse isCatchUpRunningResponse = Objects.requireNonNull(response.body()); - GetOldestCOBProcessedLoanResponse getOldestCOBProcessedLoanResponse = executeRetrieveOldestCOBProcessedLoan(); + Response response = executeGetLoanCatchUpStatus(); + IsCatchUpRunningDTO isCatchUpRunningResponse = Objects.requireNonNull(response.body()); + OldestCOBProcessedLoanDTO getOldestCOBProcessedLoanResponse = executeRetrieveOldestCOBProcessedLoan(); - return !Boolean.TRUE.equals(isCatchUpRunningResponse.getIsCatchUpRunning()) + return !Boolean.TRUE.equals(isCatchUpRunningResponse.getCatchUpRunning()) && cobBusinessDate.equals(getOldestCOBProcessedLoanResponse.getCobProcessedDate()); } @@ -51,11 +51,11 @@ public class LoanCOBCatchUpHelper { return Calls.okR(FineractClientHelper.getFineractClient().loanCobCatchUpApi.executeLoanCOBCatchUp()); } - public GetOldestCOBProcessedLoanResponse executeRetrieveOldestCOBProcessedLoan() { + public OldestCOBProcessedLoanDTO executeRetrieveOldestCOBProcessedLoan() { return Calls.ok(FineractClientHelper.getFineractClient().loanCobCatchUpApi.getOldestCOBProcessedLoan()); } - public Response executeGetLoanCatchUpStatus() { + public Response executeGetLoanCatchUpStatus() { return Calls.okR(FineractClientHelper.getFineractClient().loanCobCatchUpApi.isCatchUpRunning()); }