From 05ae7414a3bab717bb19a744a79589eec50cc544 Mon Sep 17 00:00:00 2001 From: avinashvijayvargiya Date: Sun, 3 May 2026 11:11:06 +0530 Subject: [PATCH] FINERACT-2301: Migrate client collateral management to CommandDispatcher Replace untyped CommandWrapper/JsonCommand/PortfolioCommandSourceWritePlatformService with typed CommandDispatcher/Command/CommandHandler pipeline for client collateral CRUD operations. - Add typed request/response DTOs for create, update, delete - Add Command classes and CommandHandler implementations with Resilience4j retry - Create new ClientCollateralManagementWriteService (no JsonCommand dependency) - Rename ReadPlatformService to ReadService (drop PlatformSecurityContext) - Update API resource to use CommandDispatcher with typed returns - Add URL-based security matchers in SecurityConfig - Add Resilience4j retry config in application.properties - Update Spring bean wiring in CollateralManagementConfiguration - Delete old CommandType handlers, WritePlatformService, Swagger class, and unused request record DTOs --- .../core/config/SecurityConfig.java | 11 ++ ...ClientCollateralManagementApiResource.java | 101 ++++++------- ...ollateralManagementApiResourceSwagger.java | 77 ---------- .../ClientCollateralCreateCommand.java} | 20 +-- .../ClientCollateralDeleteCommand.java | 28 ++++ .../ClientCollateralUpdateCommand.java | 28 ++++ .../data/ClientCollateralCreateRequest.java | 47 ++++++ ...va => ClientCollateralCreateResponse.java} | 11 +- .../data/ClientCollateralDeleteRequest.java | 43 ++++++ ...va => ClientCollateralDeleteResponse.java} | 9 +- .../data/ClientCollateralUpdateRequest.java | 48 ++++++ .../data/ClientCollateralUpdateResponse.java | 51 +++++++ ...ClientCollateralProductCommandHandler.java | 47 ------ .../ClientCollateralCreateCommandHandler.java | 50 +++++++ .../ClientCollateralDeleteCommandHandler.java | 50 +++++++ .../ClientCollateralUpdateCommandHandler.java | 50 +++++++ ...ClientCollateralProductCommandHandler.java | 47 ------ ...ClientCollateralProductCommandHandler.java | 47 ------ ...lientCollateralManagementReadService.java} | 3 +- ...tCollateralManagementReadServiceImpl.java} | 5 +- ...lientCollateralManagementWriteService.java | 35 +++++ ...CollateralManagementWriteServiceImpl.java} | 139 ++++++++---------- .../CollateralManagementConfiguration.java | 21 ++- .../src/main/resources/application.properties | 20 +++ 24 files changed, 603 insertions(+), 385 deletions(-) delete mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResourceSwagger.java rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/{service/ClientCollateralManagementWritePlatformService.java => command/ClientCollateralCreateCommand.java} (60%) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralDeleteCommand.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralUpdateCommand.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateRequest.java rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/{UpdateClientCollateralRequest.java => ClientCollateralCreateResponse.java} (84%) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteRequest.java rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/{ClientCollateralRequest.java => ClientCollateralDeleteResponse.java} (86%) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateRequest.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateResponse.java delete mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/AddClientCollateralProductCommandHandler.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralCreateCommandHandler.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralDeleteCommandHandler.java create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralUpdateCommandHandler.java delete mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteClientCollateralProductCommandHandler.java delete mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateClientCollateralProductCommandHandler.java rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/{ClientCollateralManagementReadPlatformService.java => ClientCollateralManagementReadService.java} (95%) rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/{ClientCollateralManagementReadPlatformServiceImpl.java => ClientCollateralManagementReadServiceImpl.java} (94%) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteService.java rename fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/{ClientCollateralManagementWritePlatformServiceImpl.java => ClientCollateralManagementWriteServiceImpl.java} (62%) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java index d0058cee2e6..af04dce63b4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/SecurityConfig.java @@ -273,6 +273,17 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_CLIENTIMAGE") .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/clients/*/images")) .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_CLIENTIMAGE") + // collateral: clients + .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/clients/*/collaterals")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_CLIENT_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/clients/*/collaterals/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_CLIENT_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.POST, "/api/*/clients/*/collaterals")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "CREATE_CLIENT_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.PUT, "/api/*/clients/*/collaterals/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "UPDATE_CLIENT_COLLATERAL_PRODUCT") + .requestMatchers(API_MATCHER.matcher(HttpMethod.DELETE, "/api/*/clients/*/collaterals/*")) + .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_WRITE, "DELETE_CLIENT_COLLATERAL_PRODUCT") // image: staff .requestMatchers(API_MATCHER.matcher(HttpMethod.GET, "/api/*/staff/*/images")) .hasAnyAuthority(ALL_FUNCTIONS, ALL_FUNCTIONS_READ, "READ_DOCUMENT") diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResource.java index 0aff20a1758..d53351e9eef 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResource.java @@ -34,113 +34,96 @@ import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.UriInfo; import java.util.List; import lombok.RequiredArgsConstructor; -import org.apache.fineract.commands.domain.CommandWrapper; -import org.apache.fineract.commands.service.CommandWrapperBuilder; -import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.command.core.CommandDispatcher; +import org.apache.fineract.portfolio.collateralmanagement.command.ClientCollateralCreateCommand; +import org.apache.fineract.portfolio.collateralmanagement.command.ClientCollateralDeleteCommand; +import org.apache.fineract.portfolio.collateralmanagement.command.ClientCollateralUpdateCommand; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteResponse; import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralManagementData; -import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateResponse; import org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralTemplateData; -import org.apache.fineract.portfolio.collateralmanagement.data.UpdateClientCollateralRequest; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadPlatformService; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadService; import org.springframework.stereotype.Component; @Path("/v1/clients/{clientId}/collaterals") @Component @Tag(name = "Client Collateral Management", description = "Client Collateral Management is for managing collateral operations") @RequiredArgsConstructor +@Consumes({ MediaType.APPLICATION_JSON }) +@Produces({ MediaType.APPLICATION_JSON }) public class ClientCollateralManagementApiResource { - private final DefaultToApiJsonSerializer apiJsonSerializerDataService; - private final DefaultToApiJsonSerializer apiJsonSerializerForLoanCollateralTemplateService; - private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; - private final PlatformSecurityContext context; - private final ClientCollateralManagementReadPlatformService clientCollateralManagementReadPlatformService; + private final CommandDispatcher dispatcher; + private final ClientCollateralManagementReadService clientCollateralManagementReadService; @GET - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get Clients Collateral Products", operationId = "getClientCollateralProducts", description = "Get Collateral Product of a Client") public List getClientCollateral( - @PathParam("clientId") @Parameter(description = "clientId") final Long clientId, @Context final UriInfo uriInfo, + @PathParam("clientId") @Parameter(description = "clientId") final Long clientId, @QueryParam("prodId") @Parameter(description = "prodId") final Long prodId) { - - this.context.authenticatedUser() - .validateHasReadPermission(CollateralManagementJsonInputParams.CLIENT_COLLATERAL_PRODUCT_READ_PERMISSION.getValue()); - - return this.clientCollateralManagementReadPlatformService.getClientCollaterals(clientId, prodId); + return this.clientCollateralManagementReadService.getClientCollaterals(clientId, prodId); } @GET @Path("{clientCollateralId}") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get Client Collateral Data", operationId = "getClientCollateralData", description = "Get Client Collateral Data") public ClientCollateralManagementData getClientCollateralData( @PathParam("clientId") @Parameter(description = "clientId") final Long clientId, @PathParam("clientCollateralId") @Parameter(description = "clientCollateralId") final Long collateralId) { - - this.context.authenticatedUser() - .validateHasReadPermission(CollateralManagementJsonInputParams.CLIENT_COLLATERAL_PRODUCT_READ_PERMISSION.getValue()); - - return this.clientCollateralManagementReadPlatformService.getClientCollateralManagementData(collateralId); + return this.clientCollateralManagementReadService.getClientCollateralManagementData(collateralId); } @GET @Path("template") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Get Client Collateral Template", operationId = "getClientCollateralTemplate", description = "Get Client Collateral Template") public List getClientCollateralTemplate( @PathParam("clientId") @Parameter(description = "clientId") final Long clientId) { - return this.clientCollateralManagementReadPlatformService.getLoanCollateralTemplate(clientId); + return this.clientCollateralManagementReadService.getLoanCollateralTemplate(clientId); } @POST - @Produces({ MediaType.APPLICATION_JSON }) - @Consumes({ MediaType.APPLICATION_JSON }) @Operation(summary = "Add New Collateral For a Client", operationId = "addClientCollateral", description = "Add New Collateral For a Client") - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ClientCollateralRequest.class))) - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralManagementApiResourceSwagger.PostClientCollateralResponse.class))) - public CommandProcessingResult addCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, - @Parameter(hidden = true) ClientCollateralRequest clientCollateralRequest) { - final CommandWrapper commandWrapper = new CommandWrapperBuilder().addClientCollateralProduct(clientId) - .withJson(apiJsonSerializerDataService.serialize(clientCollateralRequest)).build(); - - return this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ClientCollateralCreateRequest.class))) + @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralCreateResponse.class))) + public ClientCollateralCreateResponse addCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, + @Parameter(hidden = true) ClientCollateralCreateRequest request) { + request.setClientId(clientId); + final var command = new ClientCollateralCreateCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } @PUT @Path("{collateralId}") - @Produces({ MediaType.APPLICATION_JSON }) - @Consumes({ MediaType.APPLICATION_JSON }) @Operation(summary = "Update New Collateral of a Client", operationId = "updateClientCollateral", description = "Update New Collateral of a Client") - @RequestBody(required = true, content = @Content(schema = @Schema(implementation = UpdateClientCollateralRequest.class))) - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralManagementApiResourceSwagger.PutClientCollateralResponse.class))) - public CommandProcessingResult updateCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, + @RequestBody(required = true, content = @Content(schema = @Schema(implementation = ClientCollateralUpdateRequest.class))) + @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralUpdateResponse.class))) + public ClientCollateralUpdateResponse updateCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, @PathParam("collateralId") @Parameter(description = "collateralId") final Long collateralId, - @Parameter(hidden = true) UpdateClientCollateralRequest updateClientCollateralRequest) { - - final CommandWrapper commandWrapper = new CommandWrapperBuilder().updateClientCollateralProduct(clientId, collateralId) - .withJson(apiJsonSerializerDataService.serialize(updateClientCollateralRequest)).build(); - - return this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + @Parameter(hidden = true) ClientCollateralUpdateRequest request) { + request.setClientId(clientId); + request.setCollateralId(collateralId); + final var command = new ClientCollateralUpdateCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } @DELETE @Path("{collateralId}") - @Produces({ MediaType.APPLICATION_JSON }) @Operation(summary = "Delete Client Collateral", operationId = "deleteClientCollateral", description = "Delete Client Collateral") - - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralManagementApiResourceSwagger.DeleteClientCollateralResponse.class))) - public CommandProcessingResult deleteCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, + @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientCollateralDeleteResponse.class))) + public ClientCollateralDeleteResponse deleteCollateral(@PathParam("clientId") @Parameter(description = "clientId") final Long clientId, @PathParam("collateralId") @Parameter(description = "collateralId") final Long collateralId) { - final CommandWrapper commandWrapper = new CommandWrapperBuilder().deleteClientCollateralProduct(collateralId, clientId).build(); - return this.commandsSourceWritePlatformService.logCommandSource(commandWrapper); + final var request = ClientCollateralDeleteRequest.builder().clientId(clientId).collateralId(collateralId).build(); + final var command = new ClientCollateralDeleteCommand(); + command.setPayload(request); + return dispatcher.dispatch(command).get(); } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResourceSwagger.java deleted file mode 100644 index 3c8d937586e..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/api/ClientCollateralManagementApiResourceSwagger.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.portfolio.collateralmanagement.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import java.math.BigDecimal; -import org.apache.fineract.portfolio.collateralmanagement.data.UpdateClientCollateralRequest; - -final class ClientCollateralManagementApiResourceSwagger { - - private ClientCollateralManagementApiResourceSwagger() {} - - @Schema(description = "PostClientCollateralRequest") - public static final class PostClientCollateralRequest { - - private PostClientCollateralRequest() {} - - @Schema(example = "10") - public BigDecimal quantity; - @Schema(example = "1") - public Long collateralId; - @Schema(example = "en") - public String locale; - - } - - @Schema(description = "PostClientCollateralResponse") - public static final class PostClientCollateralResponse { - - private PostClientCollateralResponse() {} - - @Schema(example = "14") - public Long resourceId; - @Schema(example = "1") - public Long clientId; - - } - - @Schema(description = "PutClientCollateralResponse") - public static final class PutClientCollateralResponse { - - private PutClientCollateralResponse() {} - - @Schema(example = "12") - public Long resourceId; - @Schema(example = "1") - public Long clientId; - public UpdateClientCollateralRequest changes; - } - - @Schema(description = "DeleteClientCollateralResponse") - public static final class DeleteClientCollateralResponse { - - private DeleteClientCollateralResponse() {} - - @Schema(example = "12") - public Long resourceId; - - } - -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralCreateCommand.java similarity index 60% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformService.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralCreateCommand.java index 67c36139440..a4cb599276a 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralCreateCommand.java @@ -16,17 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.fineract.portfolio.collateralmanagement.service; +package org.apache.fineract.portfolio.collateralmanagement.command; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateRequest; -public interface ClientCollateralManagementWritePlatformService { - - CommandProcessingResult addClientCollateralProduct(JsonCommand command); - - CommandProcessingResult updateClientCollateralProduct(JsonCommand command); - - CommandProcessingResult deleteClientCollateralProduct(Long collateralId); - -} +@Data +@EqualsAndHashCode(callSuper = true) +public class ClientCollateralCreateCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralDeleteCommand.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralDeleteCommand.java new file mode 100644 index 00000000000..eba27f6e03b --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralDeleteCommand.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.command; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteRequest; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ClientCollateralDeleteCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralUpdateCommand.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralUpdateCommand.java new file mode 100644 index 00000000000..feb29e65491 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/command/ClientCollateralUpdateCommand.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.command; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateRequest; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ClientCollateralUpdateCommand extends Command {} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateRequest.java new file mode 100644 index 00000000000..2a7a62447f1 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateRequest.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.Hidden; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ClientCollateralCreateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Hidden + private Long clientId; + + private BigDecimal quantity; + + private Long collateralId; + + private String locale; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/UpdateClientCollateralRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateResponse.java similarity index 84% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/UpdateClientCollateralRequest.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateResponse.java index 73bab14da10..aadf3498a09 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/UpdateClientCollateralRequest.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralCreateResponse.java @@ -20,10 +20,17 @@ import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; -public record UpdateClientCollateralRequest(BigDecimal quantity, String locale) implements Serializable { +@Data +@Builder +public class ClientCollateralCreateResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; + + private Long resourceId; + + private Long clientId; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteRequest.java new file mode 100644 index 00000000000..32e46a51e21 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteRequest.java @@ -0,0 +1,43 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.Hidden; +import java.io.Serial; +import java.io.Serializable; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ClientCollateralDeleteRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Hidden + private Long collateralId; + + @Hidden + private Long clientId; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteResponse.java similarity index 86% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralRequest.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteResponse.java index 3dcc239970b..5422ea7bf1c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralRequest.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralDeleteResponse.java @@ -20,10 +20,15 @@ import java.io.Serial; import java.io.Serializable; -import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; -public record ClientCollateralRequest(BigDecimal quantity, Long collateralId, String locale) implements Serializable { +@Data +@Builder +public class ClientCollateralDeleteResponse implements Serializable { @Serial private static final long serialVersionUID = 1L; + + private Long resourceId; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateRequest.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateRequest.java new file mode 100644 index 00000000000..3c335064df9 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateRequest.java @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.data; + +import io.swagger.v3.oas.annotations.Hidden; +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ClientCollateralUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Hidden + private Long clientId; + + @Hidden + private Long collateralId; + + private BigDecimal quantity; + + private String locale; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateResponse.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateResponse.java new file mode 100644 index 00000000000..dd0ea35389e --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/data/ClientCollateralUpdateResponse.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class ClientCollateralUpdateResponse implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long resourceId; + + private Long clientId; + + private Changes changes; + + @Data + @Builder + public static class Changes implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private BigDecimal quantity; + + private String locale; + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/AddClientCollateralProductCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/AddClientCollateralProductCommandHandler.java deleted file mode 100644 index 72e3e7e71e2..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/AddClientCollateralProductCommandHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -import org.apache.fineract.commands.annotation.CommandType; -import org.apache.fineract.commands.handler.NewCommandSourceHandler; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "CLIENT_COLLATERAL_PRODUCT", action = "CREATE") -public class AddClientCollateralProductCommandHandler implements NewCommandSourceHandler { - - private final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService; - - @Autowired - public AddClientCollateralProductCommandHandler( - final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService) { - this.clientCollateralManagementWritePlatformService = clientCollateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(final JsonCommand jsonCommand) { - return this.clientCollateralManagementWritePlatformService.addClientCollateralProduct(jsonCommand); - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralCreateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralCreateCommandHandler.java new file mode 100644 index 00000000000..f3729b94fef --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralCreateCommandHandler.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.handler; + +import io.github.resilience4j.retry.annotation.Retry; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ClientCollateralCreateCommandHandler implements CommandHandler { + + private final ClientCollateralManagementWriteService writeService; + + @Retry(name = "commandClientCollateralCreate", fallbackMethod = "fallback") + @Override + @Transactional + public ClientCollateralCreateResponse handle(Command command) { + return writeService.addClientCollateralProduct(command.getPayload()); + } + + @Override + public ClientCollateralCreateResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralDeleteCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralDeleteCommandHandler.java new file mode 100644 index 00000000000..ec9f0747a55 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralDeleteCommandHandler.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.handler; + +import io.github.resilience4j.retry.annotation.Retry; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ClientCollateralDeleteCommandHandler implements CommandHandler { + + private final ClientCollateralManagementWriteService writeService; + + @Retry(name = "commandClientCollateralDelete", fallbackMethod = "fallback") + @Override + @Transactional + public ClientCollateralDeleteResponse handle(Command command) { + return writeService.deleteClientCollateralProduct(command.getPayload()); + } + + @Override + public ClientCollateralDeleteResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralUpdateCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralUpdateCommandHandler.java new file mode 100644 index 00000000000..1539d78cd18 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/ClientCollateralUpdateCommandHandler.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.handler; + +import io.github.resilience4j.retry.annotation.Retry; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.command.core.Command; +import org.apache.fineract.command.core.CommandHandler; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateResponse; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ClientCollateralUpdateCommandHandler implements CommandHandler { + + private final ClientCollateralManagementWriteService writeService; + + @Retry(name = "commandClientCollateralUpdate", fallbackMethod = "fallback") + @Override + @Transactional + public ClientCollateralUpdateResponse handle(Command command) { + return writeService.updateClientCollateralProduct(command.getPayload()); + } + + @Override + public ClientCollateralUpdateResponse fallback(Command command, Throwable t) { + return CommandHandler.super.fallback(command, t); + } +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteClientCollateralProductCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteClientCollateralProductCommandHandler.java deleted file mode 100644 index 5e45b36286b..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/DeleteClientCollateralProductCommandHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -import org.apache.fineract.commands.annotation.CommandType; -import org.apache.fineract.commands.handler.NewCommandSourceHandler; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "CLIENT_COLLATERAL_PRODUCT", action = "DELETE") -public class DeleteClientCollateralProductCommandHandler implements NewCommandSourceHandler { - - private final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService; - - @Autowired - public DeleteClientCollateralProductCommandHandler( - final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService) { - this.clientCollateralManagementWritePlatformService = clientCollateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(JsonCommand command) { - return this.clientCollateralManagementWritePlatformService.deleteClientCollateralProduct(command.entityId()); - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateClientCollateralProductCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateClientCollateralProductCommandHandler.java deleted file mode 100644 index a37013b34ca..00000000000 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/handler/UpdateClientCollateralProductCommandHandler.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.fineract.portfolio.collateralmanagement.handler; - -import jakarta.transaction.Transactional; -import org.apache.fineract.commands.annotation.CommandType; -import org.apache.fineract.commands.handler.NewCommandSourceHandler; -import org.apache.fineract.infrastructure.core.api.JsonCommand; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@CommandType(entity = "CLIENT_COLLATERAL_PRODUCT", action = "UPDATE") -public class UpdateClientCollateralProductCommandHandler implements NewCommandSourceHandler { - - private final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService; - - @Autowired - public UpdateClientCollateralProductCommandHandler( - final ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService) { - this.clientCollateralManagementWritePlatformService = clientCollateralManagementWritePlatformService; - } - - @Transactional - @Override - public CommandProcessingResult processCommand(final JsonCommand jsonCommand) { - return this.clientCollateralManagementWritePlatformService.updateClientCollateralProduct(jsonCommand); - } -} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadService.java similarity index 95% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformService.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadService.java index 4ab0d9fff34..f2f836e763d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadService.java @@ -22,12 +22,11 @@ import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralManagementData; import org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralTemplateData; -public interface ClientCollateralManagementReadPlatformService { +public interface ClientCollateralManagementReadService { ClientCollateralManagementData getClientCollateralManagementData(Long collateralId); List getClientCollaterals(Long clientId, Long prodId); List getLoanCollateralTemplate(Long clientId); - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadServiceImpl.java similarity index 94% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformServiceImpl.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadServiceImpl.java index 4e69494cf40..28aeadf26b1 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementReadServiceImpl.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Set; import lombok.RequiredArgsConstructor; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralManagementData; import org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralTemplateData; import org.apache.fineract.portfolio.collateralmanagement.data.LoanTransactionData; @@ -38,9 +37,8 @@ @RequiredArgsConstructor @Transactional(readOnly = true) -public class ClientCollateralManagementReadPlatformServiceImpl implements ClientCollateralManagementReadPlatformService { +public class ClientCollateralManagementReadServiceImpl implements ClientCollateralManagementReadService { - private final PlatformSecurityContext context; private final ClientCollateralManagementRepositoryWrapper clientCollateralManagementRepositoryWrapper; private final LoanTransactionRepository loanTransactionRepository; @@ -51,7 +49,6 @@ public List getClientCollaterals(final Long clie @Override public List getLoanCollateralTemplate(Long clientId) { - this.context.authenticatedUser(); Collection clientCollateralManagements = this.clientCollateralManagementRepositoryWrapper .getCollateralsPerClient(clientId); List loanCollateralTemplateDataList = new ArrayList<>(); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteService.java new file mode 100644 index 00000000000..caf14f4802f --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteService.java @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.collateralmanagement.service; + +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateResponse; + +public interface ClientCollateralManagementWriteService { + + ClientCollateralCreateResponse addClientCollateralProduct(ClientCollateralCreateRequest request); + + ClientCollateralUpdateResponse updateClientCollateralProduct(ClientCollateralUpdateRequest request); + + ClientCollateralDeleteResponse deleteClientCollateralProduct(ClientCollateralDeleteRequest request); +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteServiceImpl.java similarity index 62% rename from fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformServiceImpl.java rename to fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteServiceImpl.java index 4d1d8092dad..98ba9391a46 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/service/ClientCollateralManagementWriteServiceImpl.java @@ -18,20 +18,21 @@ */ package org.apache.fineract.portfolio.collateralmanagement.service; -import jakarta.transaction.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import java.util.Map; import lombok.RequiredArgsConstructor; -import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.ApiParameterError; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; -import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralCreateResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralDeleteResponse; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateRequest; +import org.apache.fineract.portfolio.collateralmanagement.data.ClientCollateralUpdateResponse; import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagement; import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagementRepositoryWrapper; import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementDomain; @@ -42,53 +43,75 @@ import org.apache.fineract.portfolio.loanaccount.domain.LoanCollateralManagement; @RequiredArgsConstructor -public class ClientCollateralManagementWritePlatformServiceImpl implements ClientCollateralManagementWritePlatformService { +public class ClientCollateralManagementWriteServiceImpl implements ClientCollateralManagementWriteService { private final ClientCollateralManagementRepositoryWrapper clientCollateralManagementRepositoryWrapper; private final CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper; private final ClientRepositoryWrapper clientRepositoryWrapper; - public static final String COLLATERAL_ID = "collateralId"; - public static final String QUANTITY = "quantity"; - @Transactional - @Override - public CommandProcessingResult addClientCollateralProduct(final JsonCommand command) { - - validateForCreation(command); + private static final String COLLATERAL_ID = "collateralId"; + private static final String QUANTITY = "quantity"; - Long collateralId = command.longValueOfParameterNamed(COLLATERAL_ID); - BigDecimal quantity = command.bigDecimalValueOfParameterNamed(QUANTITY); - - final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(command.getClientId(), false); + @Override + public ClientCollateralCreateResponse addClientCollateralProduct(final ClientCollateralCreateRequest request) { + validateForCreation(request); - final CollateralManagementDomain collateralManagementData = this.collateralManagementRepositoryWrapper.getCollateral(collateralId); - final ClientCollateralManagement clientCollateralManagement = ClientCollateralManagement.createNew(quantity, client, + final Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(request.getClientId(), false); + final CollateralManagementDomain collateralManagementData = this.collateralManagementRepositoryWrapper + .getCollateral(request.getCollateralId()); + final ClientCollateralManagement clientCollateralManagement = ClientCollateralManagement.createNew(request.getQuantity(), client, collateralManagementData); this.clientCollateralManagementRepositoryWrapper.saveAndFlush(clientCollateralManagement); - return new CommandProcessingResultBuilder() // - .withCommandId(command.commandId()) // - .withClientId(command.getClientId()) // - .withEntityId(clientCollateralManagement.getId()) // + + return ClientCollateralCreateResponse.builder().resourceId(clientCollateralManagement.getId()).clientId(request.getClientId()) .build(); } - private void validateForCreation(final JsonCommand command) { + @Override + public ClientCollateralUpdateResponse updateClientCollateralProduct(final ClientCollateralUpdateRequest request) { + validateForUpdate(request); + + final ClientCollateralManagement collateral = this.clientCollateralManagementRepositoryWrapper + .getCollateral(request.getCollateralId()); + final BigDecimal oldQuantity = collateral.getQuantity(); + boolean changed = false; + if (request.getQuantity() != null && request.getQuantity().compareTo(oldQuantity) != 0) { + collateral.updateQuantity(request.getQuantity()); + changed = true; + } + this.clientCollateralManagementRepositoryWrapper.updateClientCollateralProduct(collateral); + + ClientCollateralUpdateResponse.ClientCollateralUpdateResponseBuilder builder = ClientCollateralUpdateResponse.builder() + .resourceId(request.getCollateralId()).clientId(request.getClientId()); + if (changed) { + builder.changes( + ClientCollateralUpdateResponse.Changes.builder().quantity(request.getQuantity()).locale(request.getLocale()).build()); + } + return builder.build(); + } + + @Override + public ClientCollateralDeleteResponse deleteClientCollateralProduct(final ClientCollateralDeleteRequest request) { + final ClientCollateralManagement clientCollateralManagement = this.clientCollateralManagementRepositoryWrapper + .getCollateral(request.getCollateralId()); + validateForDeletion(clientCollateralManagement, request.getCollateralId()); + this.clientCollateralManagementRepositoryWrapper.deleteClientCollateralProduct(request.getCollateralId()); + + return ClientCollateralDeleteResponse.builder().resourceId(request.getCollateralId()).build(); + } - String errorCode = "parameter."; + private void validateForCreation(final ClientCollateralCreateRequest request) { final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("client-collateral"); - if (!command.parameterExists(COLLATERAL_ID)) { - errorCode += "collateralId.not.exists"; - baseDataValidator.reset().parameter(COLLATERAL_ID).failWithCode(errorCode); + if (request.getCollateralId() == null) { + baseDataValidator.reset().parameter(COLLATERAL_ID).failWithCode("parameter.collateralId.not.exists"); } - if (!command.parameterExists(QUANTITY)) { - errorCode += ".quantity.not.exists"; - baseDataValidator.reset().parameter(QUANTITY).failWithCode(errorCode); + if (request.getQuantity() == null) { + baseDataValidator.reset().parameter(QUANTITY).failWithCode("parameter.quantity.not.exists"); } else { - BigDecimal quantity = command.bigDecimalValueOfParameterNamed(QUANTITY); - baseDataValidator.reset().parameter(QUANTITY).value(quantity).notNull().positiveAmount(); + baseDataValidator.reset().parameter(QUANTITY).value(request.getQuantity()).notNull().positiveAmount(); } if (!dataValidationErrors.isEmpty()) { @@ -96,41 +119,21 @@ private void validateForCreation(final JsonCommand command) { } } - @Transactional - @Override - public CommandProcessingResult updateClientCollateralProduct(final JsonCommand command) { - validateForUpdate(command); - final ClientCollateralManagement collateral = this.clientCollateralManagementRepositoryWrapper.getCollateral(command.entityId()); - final Map changes = collateral.update(command); - this.clientCollateralManagementRepositoryWrapper.updateClientCollateralProduct(collateral); - return new CommandProcessingResultBuilder() // - .withCommandId(command.commandId()) // - .withEntityId(command.entityId()) // - .withClientId(command.getClientId()) // - .with(changes) // - .build(); - } - - private void validateForUpdate(final JsonCommand command) { - final Long clientCollateralId = command.entityId(); - String errorCode = "parameter."; + private void validateForUpdate(final ClientCollateralUpdateRequest request) { final List dataValidationErrors = new ArrayList<>(); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("client-collateral"); - BigDecimal quantity = null; - if (!command.parameterExists(QUANTITY)) { - errorCode += ".quantity.not.exists"; - baseDataValidator.reset().parameter(QUANTITY).failWithCode(errorCode); + if (request.getQuantity() == null) { + baseDataValidator.reset().parameter(QUANTITY).failWithCode("parameter..quantity.not.exists"); } else { - quantity = command.bigDecimalValueOfParameterNamed(QUANTITY); - baseDataValidator.reset().parameter(QUANTITY).value(quantity).notNull().positiveAmount(); + baseDataValidator.reset().parameter(QUANTITY).value(request.getQuantity()).notNull().positiveAmount(); } final ClientCollateralManagement clientCollateralManagement = this.clientCollateralManagementRepositoryWrapper - .getCollateral(clientCollateralId); + .getCollateral(request.getCollateralId()); if (clientCollateralManagement == null) { - throw new ClientCollateralNotFoundException(clientCollateralId); + throw new ClientCollateralNotFoundException(request.getCollateralId()); } BigDecimal totalQuantity = BigDecimal.ZERO; @@ -140,26 +143,13 @@ private void validateForUpdate(final JsonCommand command) { } } - if (totalQuantity.compareTo(quantity) >= 0) { - baseDataValidator.reset().parameter(QUANTITY).value(quantity).notLessThanMin(totalQuantity); + if (totalQuantity.compareTo(request.getQuantity()) >= 0) { + baseDataValidator.reset().parameter(QUANTITY).value(request.getQuantity()).notLessThanMin(totalQuantity); } if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException(dataValidationErrors); } - - } - - @Transactional - @Override - public CommandProcessingResult deleteClientCollateralProduct(final Long collateralId) { - final ClientCollateralManagement clientCollateralManagement = this.clientCollateralManagementRepositoryWrapper - .getCollateral(collateralId); - validateForDeletion(clientCollateralManagement, collateralId); - this.clientCollateralManagementRepositoryWrapper.deleteClientCollateralProduct(collateralId); - return new CommandProcessingResultBuilder() // - .withEntityId(collateralId) // - .build(); } private void validateForDeletion(final ClientCollateralManagement clientCollateralManagement, final Long clientCollateralId) { @@ -177,5 +167,4 @@ private void validateForDeletion(final ClientCollateralManagement clientCollater } } } - } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java index 4c30c398769..af674782e04 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateralmanagement/starter/CollateralManagementConfiguration.java @@ -25,10 +25,10 @@ import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.collateralmanagement.domain.ClientCollateralManagementRepositoryWrapper; import org.apache.fineract.portfolio.collateralmanagement.domain.CollateralManagementRepositoryWrapper; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadPlatformService; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadPlatformServiceImpl; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWritePlatformService; -import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWritePlatformServiceImpl; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadService; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementReadServiceImpl; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteService; +import org.apache.fineract.portfolio.collateralmanagement.service.ClientCollateralManagementWriteServiceImpl; import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformService; import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementReadPlatformServiceImpl; import org.apache.fineract.portfolio.collateralmanagement.service.CollateralManagementWritePlatformService; @@ -49,20 +49,19 @@ public class CollateralManagementConfiguration { @Bean - @ConditionalOnMissingBean(ClientCollateralManagementReadPlatformService.class) - public ClientCollateralManagementReadPlatformService clientCollateralManagementReadPlatformService(PlatformSecurityContext context, + @ConditionalOnMissingBean(ClientCollateralManagementReadService.class) + public ClientCollateralManagementReadService clientCollateralManagementReadService( ClientCollateralManagementRepositoryWrapper clientCollateralManagementRepositoryWrapper, LoanTransactionRepository loanTransactionRepository) { - return new ClientCollateralManagementReadPlatformServiceImpl(context, clientCollateralManagementRepositoryWrapper, - loanTransactionRepository); + return new ClientCollateralManagementReadServiceImpl(clientCollateralManagementRepositoryWrapper, loanTransactionRepository); } @Bean - @ConditionalOnMissingBean(ClientCollateralManagementWritePlatformService.class) - public ClientCollateralManagementWritePlatformService clientCollateralManagementWritePlatformService( + @ConditionalOnMissingBean(ClientCollateralManagementWriteService.class) + public ClientCollateralManagementWriteService clientCollateralManagementWriteService( ClientCollateralManagementRepositoryWrapper clientCollateralManagementRepositoryWrapper, CollateralManagementRepositoryWrapper collateralManagementRepositoryWrapper, ClientRepositoryWrapper clientRepositoryWrapper) { - return new ClientCollateralManagementWritePlatformServiceImpl(clientCollateralManagementRepositoryWrapper, + return new ClientCollateralManagementWriteServiceImpl(clientCollateralManagementRepositoryWrapper, collateralManagementRepositoryWrapper, clientRepositoryWrapper); } diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties index e472b38a074..7ba732b0f63 100644 --- a/fineract-provider/src/main/resources/application.properties +++ b/fineract-provider/src/main/resources/application.properties @@ -688,6 +688,26 @@ resilience4j.retry.instances.commandMeetingAttendanceUpdate.enable-exponential-b resilience4j.retry.instances.commandMeetingAttendanceUpdate.exponential-backoff-multiplier=${FINERACT_COMMAND_MEETING_ATTENDANCE_UPDATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} resilience4j.retry.instances.commandMeetingAttendanceUpdate.retryExceptions=${FINERACT_COMMAND_MEETING_ATTENDANCE_UPDATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} +# client collateral + +resilience4j.retry.instances.commandClientCollateralCreate.max-attempts=${FINERACT_COMMAND_CLIENT_COLLATERAL_CREATE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandClientCollateralCreate.wait-duration=${FINERACT_COMMAND_CLIENT_COLLATERAL_CREATE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandClientCollateralCreate.enable-exponential-backoff=${FINERACT_COMMAND_CLIENT_COLLATERAL_CREATE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandClientCollateralCreate.exponential-backoff-multiplier=${FINERACT_COMMAND_CLIENT_COLLATERAL_CREATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandClientCollateralCreate.retryExceptions=${FINERACT_COMMAND_CLIENT_COLLATERAL_CREATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} + +resilience4j.retry.instances.commandClientCollateralUpdate.max-attempts=${FINERACT_COMMAND_CLIENT_COLLATERAL_UPDATE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandClientCollateralUpdate.wait-duration=${FINERACT_COMMAND_CLIENT_COLLATERAL_UPDATE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandClientCollateralUpdate.enable-exponential-backoff=${FINERACT_COMMAND_CLIENT_COLLATERAL_UPDATE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandClientCollateralUpdate.exponential-backoff-multiplier=${FINERACT_COMMAND_CLIENT_COLLATERAL_UPDATE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandClientCollateralUpdate.retryExceptions=${FINERACT_COMMAND_CLIENT_COLLATERAL_UPDATE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} + +resilience4j.retry.instances.commandClientCollateralDelete.max-attempts=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_MAX_ATTEMPTS:3} +resilience4j.retry.instances.commandClientCollateralDelete.wait-duration=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_WAIT_DURATION:1s} +resilience4j.retry.instances.commandClientCollateralDelete.enable-exponential-backoff=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_ENABLE_EXPONENTIAL_BACKOFF:true} +resilience4j.retry.instances.commandClientCollateralDelete.exponential-backoff-multiplier=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER:2} +resilience4j.retry.instances.commandClientCollateralDelete.retryExceptions=${FINERACT_COMMAND_CLIENT_COLLATERAL_DELETE_RETRY_EXCEPTIONS:org.springframework.dao.ConcurrencyFailureException,org.eclipse.persistence.exceptions.OptimisticLockException,jakarta.persistence.OptimisticLockException,org.springframework.orm.jpa.JpaOptimisticLockingFailureException} + # command fineract.command.enabled=true