FINERACT-2169: Provision category definition api refactor;

This commit is contained in:
viktorpavlenko
2025-03-05 22:39:49 +00:00
committed by Adam Saghy
parent bd66037910
commit f8e5d6c9fc
7 changed files with 50 additions and 86 deletions
@@ -18,10 +18,10 @@
*/
package org.apache.fineract.organisation.provisioning.service;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.organisation.provisioning.data.ProvisioningCategoryData;
public interface ProvisioningCategoryReadPlatformService {
Collection<ProvisioningCategoryData> retrieveAllProvisionCategories();
List<ProvisioningCategoryData> retrieveAllProvisionCategories();
}
@@ -27,18 +27,13 @@ import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriInfo;
import java.util.Collection;
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.api.ApiRequestParameterHelper;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.provisioning.data.ProvisioningCategoryData;
import org.apache.fineract.organisation.provisioning.service.ProvisioningCategoryReadPlatformService;
@@ -52,52 +47,44 @@ public class ProvisioningCategoryApiResource {
private final PlatformSecurityContext platformSecurityContext;
private final ProvisioningCategoryReadPlatformService provisioningCategoryReadPlatformService;
private final ApiRequestParameterHelper apiRequestParameterHelper;
private final DefaultToApiJsonSerializer<ProvisioningCategoryData> toApiJsonSerializer;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveAll(@Context final UriInfo uriInfo) {
this.platformSecurityContext.authenticatedUser();
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
Collection<ProvisioningCategoryData> provisionCategoriesSet = null;
provisionCategoriesSet = this.provisioningCategoryReadPlatformService.retrieveAllProvisionCategories();
return this.toApiJsonSerializer.serialize(settings, provisionCategoriesSet);
public List<ProvisioningCategoryData> retrieveAll() {
platformSecurityContext.authenticatedUser();
return provisioningCategoryReadPlatformService.retrieveAllProvisionCategories();
}
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String createProvisioningCategory(final String apiRequestBodyAsJson) {
CommandWrapper commandWrapper = null;
this.platformSecurityContext.authenticatedUser();
commandWrapper = new CommandWrapperBuilder().createProvisioningCategory().withJson(apiRequestBodyAsJson).build();
final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper);
return this.toApiJsonSerializer.serialize(commandProcessingResult);
public CommandProcessingResult createProvisioningCategory(final String apiRequestBodyAsJson) {
platformSecurityContext.authenticatedUser();
CommandWrapper commandWrapper = new CommandWrapperBuilder().createProvisioningCategory().withJson(apiRequestBodyAsJson).build();
return commandsSourceWritePlatformService.logCommandSource(commandWrapper);
}
@PUT
@Path("{categoryId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String updateProvisioningCategory(@PathParam("categoryId") final Long categoryId, final String apiRequestBodyAsJson) {
this.platformSecurityContext.authenticatedUser();
public CommandProcessingResult updateProvisioningCategory(@PathParam("categoryId") final Long categoryId,
final String apiRequestBodyAsJson) {
platformSecurityContext.authenticatedUser();
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateProvisioningCategory(categoryId)
.withJson(apiRequestBodyAsJson).build();
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
return commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
@DELETE
@Path("{categoryId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String deleteProvisioningCategory(@PathParam("categoryId") final Long categoryId) {
this.platformSecurityContext.authenticatedUser();
public CommandProcessingResult deleteProvisioningCategory(@PathParam("categoryId") final Long categoryId) {
platformSecurityContext.authenticatedUser();
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteProvisioningCategory(categoryId).build();
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
return commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
}
@@ -38,10 +38,7 @@ import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriInfo;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.commands.domain.CommandWrapper;
import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -51,7 +48,6 @@ import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.provisioning.constants.ProvisioningCriteriaConstants;
import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaData;
import org.apache.fineract.organisation.provisioning.service.ProvisioningCriteriaReadPlatformService;
import org.springframework.stereotype.Component;
@@ -68,27 +64,13 @@ public class ProvisioningCriteriaApiResource {
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
private final DefaultToApiJsonSerializer<ProvisioningCriteriaData> toApiJsonSerializer;
private static final Set<String> PROVISIONING_CRITERIA_TEMPLATE_PARAMETER = new HashSet<>(
Arrays.asList(ProvisioningCriteriaConstants.DEFINITIONS_PARAM, ProvisioningCriteriaConstants.LOANPRODUCTS_PARAM,
ProvisioningCriteriaConstants.GLACCOUNTS_PARAM));
private static final Set<String> PROVISIONING_CRITERIA_PARAMETERS = new HashSet<>(
Arrays.asList(ProvisioningCriteriaConstants.CRITERIA_PARAM, ProvisioningCriteriaConstants.LOANPRODUCTS_PARAM,
ProvisioningCriteriaConstants.DEFINITIONS_PARAM));
private static final Set<String> ALL_PROVISIONING_CRITERIA_PARAMETERS = new HashSet<>(
Arrays.asList(ProvisioningCriteriaConstants.CRITERIA_ID_PARAM, ProvisioningCriteriaConstants.CRITERIA_NAME_PARAM,
ProvisioningCriteriaConstants.CREATED_BY_PARAM));
@GET
@Path("template")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveTemplate(@Context final UriInfo uriInfo) {
this.platformSecurityContext.authenticatedUser();
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
ProvisioningCriteriaData data = this.provisioningCriteriaReadPlatformService.retrievePrivisiongCriteriaTemplate();
return this.toApiJsonSerializer.serialize(settings, data, PROVISIONING_CRITERIA_TEMPLATE_PARAMETER);
public ProvisioningCriteriaData retrieveTemplate() {
platformSecurityContext.authenticatedUser();
return provisioningCriteriaReadPlatformService.retrievePrivisiongCriteriaTemplate();
}
@GET
@@ -98,15 +80,15 @@ public class ProvisioningCriteriaApiResource {
@Operation(summary = "Retrieves a Provisioning Criteria", description = "Retrieves a Provisioning Criteria")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.GetProvisioningCriteriaCriteriaIdResponse.class))) })
public String retrieveProvisioningCriteria(@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId,
@Context final UriInfo uriInfo) {
public ProvisioningCriteriaData retrieveProvisioningCriteria(
@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId, @Context final UriInfo uriInfo) {
platformSecurityContext.authenticatedUser();
ProvisioningCriteriaData criteria = this.provisioningCriteriaReadPlatformService.retrieveProvisioningCriteria(criteriaId);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
ProvisioningCriteriaData criteria = provisioningCriteriaReadPlatformService.retrieveProvisioningCriteria(criteriaId);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
if (settings.isTemplate()) {
criteria = this.provisioningCriteriaReadPlatformService.retrievePrivisiongCriteriaTemplate(criteria);
criteria = provisioningCriteriaReadPlatformService.retrievePrivisiongCriteriaTemplate(criteria);
}
return this.toApiJsonSerializer.serialize(settings, criteria, PROVISIONING_CRITERIA_PARAMETERS);
return criteria;
}
@GET
@@ -115,11 +97,9 @@ public class ProvisioningCriteriaApiResource {
@Operation(summary = "Retrieves all created Provisioning Criterias", description = "Retrieves all created Provisioning Criterias")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.GetProvisioningCriteriaResponse.class)))) })
public String retrieveAllProvisioningCriterias(@Context final UriInfo uriInfo) {
public List<ProvisioningCriteriaData> retrieveAllProvisioningCriterias() {
platformSecurityContext.authenticatedUser();
Collection<ProvisioningCriteriaData> data = this.provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias();
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializer.serialize(settings, data, ALL_PROVISIONING_CRITERIA_PARAMETERS);
return provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias();
}
@POST
@@ -130,12 +110,10 @@ public class ProvisioningCriteriaApiResource {
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.PostProvisioningCriteriaRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.PostProvisioningCriteriaResponse.class))) })
public String createProvisioningCriteria(@Parameter(hidden = true) final String apiRequestBodyAsJson) {
CommandWrapper commandWrapper = null;
this.platformSecurityContext.authenticatedUser();
commandWrapper = new CommandWrapperBuilder().createProvisioningCriteria().withJson(apiRequestBodyAsJson).build();
final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper);
return this.toApiJsonSerializer.serialize(commandProcessingResult);
public CommandProcessingResult createProvisioningCriteria(@Parameter(hidden = true) final String apiRequestBodyAsJson) {
platformSecurityContext.authenticatedUser();
CommandWrapper commandWrapper = new CommandWrapperBuilder().createProvisioningCriteria().withJson(apiRequestBodyAsJson).build();
return commandsSourceWritePlatformService.logCommandSource(commandWrapper);
}
@PUT
@@ -147,13 +125,13 @@ public class ProvisioningCriteriaApiResource {
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.PutProvisioningCriteriaRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.PutProvisioningCriteriaResponse.class))) })
public String updateProvisioningCriteria(@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId,
public CommandProcessingResult updateProvisioningCriteria(
@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId,
@Parameter(hidden = true) final String apiRequestBodyAsJson) {
this.platformSecurityContext.authenticatedUser();
platformSecurityContext.authenticatedUser();
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateProvisioningCriteria(criteriaId)
.withJson(apiRequestBodyAsJson).build();
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
return commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
@DELETE
@@ -163,10 +141,10 @@ public class ProvisioningCriteriaApiResource {
@Operation(summary = "Deletes Provisioning Criteria", description = "Deletes Provisioning Criteria")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ProvisioningCriteriaApiResourceSwagger.DeleteProvisioningCriteriaResponse.class))) })
public String deleteProvisioningCriteria(@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId) {
this.platformSecurityContext.authenticatedUser();
public CommandProcessingResult deleteProvisioningCriteria(
@PathParam("criteriaId") @Parameter(description = "criteriaId") final Long criteriaId) {
platformSecurityContext.authenticatedUser();
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteProvisioningCriteria(criteriaId).build();
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
return commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
}
@@ -20,7 +20,7 @@ package org.apache.fineract.organisation.provisioning.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
import org.apache.fineract.organisation.provisioning.data.ProvisioningCategoryData;
@@ -34,7 +34,7 @@ public class ProvisioningCategoryReadPlatformServiceImpl implements Provisioning
private final ProvisioningCategoryRowMapper provisionCategoryRowMapper = new ProvisioningCategoryRowMapper();
@Override
public Collection<ProvisioningCategoryData> retrieveAllProvisionCategories() {
public List<ProvisioningCategoryData> retrieveAllProvisionCategories() {
// User is already authenticated by API. So we no need to check again
// here
final String sql = "select " + this.provisionCategoryRowMapper.schema() + " from m_provision_category pc order by pc.id";
@@ -18,7 +18,7 @@
*/
package org.apache.fineract.organisation.provisioning.service;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaData;
public interface ProvisioningCriteriaReadPlatformService {
@@ -27,7 +27,7 @@ public interface ProvisioningCriteriaReadPlatformService {
ProvisioningCriteriaData retrieveProvisioningCriteria(Long criteriaId);
Collection<ProvisioningCriteriaData> retrieveAllProvisioningCriterias();
List<ProvisioningCriteriaData> retrieveAllProvisioningCriterias();
ProvisioningCriteriaData retrievePrivisiongCriteriaTemplate(ProvisioningCriteriaData data);
}
@@ -77,7 +77,7 @@ public class ProvisioningCriteriaReadPlatformServiceImpl implements Provisioning
}
@Override
public Collection<ProvisioningCriteriaData> retrieveAllProvisioningCriterias() {
public List<ProvisioningCriteriaData> retrieveAllProvisioningCriterias() {
ProvisioningCriteriaRowMapper mapper = new ProvisioningCriteriaRowMapper();
final String sql = "select " + mapper.schema();
return this.jdbcTemplate.query(sql, mapper); // NOSONAR
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.verifyNoInteractions;
import static org.springframework.batch.repeat.RepeatStatus.FINISHED;
import java.time.LocalDate;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -75,7 +74,7 @@ class GenerateLoanlossProvisioningTaskletTest {
@Test
public void testExecuteShouldCreateProvisioningEntry() throws Exception {
// given
Collection<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
List<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
given(provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias()).willReturn(provisioningCriterias);
// when
RepeatStatus result = underTest.execute(stepContribution, chunkContext);
@@ -87,7 +86,7 @@ class GenerateLoanlossProvisioningTaskletTest {
@Test
public void testExecuteShouldNotCreateProvisioningEntryWhenNoProvisioningCriteriasArePresent() throws Exception {
// given
Collection<ProvisioningCriteriaData> provisioningCriterias = List.of();
List<ProvisioningCriteriaData> provisioningCriterias = List.of();
given(provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias()).willReturn(provisioningCriterias);
// when
RepeatStatus result = underTest.execute(stepContribution, chunkContext);
@@ -110,7 +109,7 @@ class GenerateLoanlossProvisioningTaskletTest {
@Test
public void testExecuteShouldNotFailWhenProvisioningEntryIsAlreadyCreated() throws Exception {
// given
Collection<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
List<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
given(provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias()).willReturn(provisioningCriterias);
given(provisioningEntriesWritePlatformService.createProvisioningEntry(BUSINESS_DATE, true))
.willThrow(new ProvisioningEntryAlreadyCreatedException(1L, BUSINESS_DATE));
@@ -124,7 +123,7 @@ class GenerateLoanlossProvisioningTaskletTest {
@Test
public void testExecuteShouldNotFailWhenExceptionIsThrownInProvisioningEntryCreation() throws Exception {
// given
Collection<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
List<ProvisioningCriteriaData> provisioningCriterias = List.of(new ProvisioningCriteriaData());
given(provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias()).willReturn(provisioningCriterias);
given(provisioningEntriesWritePlatformService.createProvisioningEntry(BUSINESS_DATE, true)).willThrow(new RuntimeException("Test"));
// when