FINERACT-2169: Apply dto in DelinquencyApiResource

This commit is contained in:
oleksandr.masliuk
2025-03-31 10:38:38 +02:00
committed by Adam Saghy
parent a313608cd3
commit 53c36ba4f8
32 changed files with 259 additions and 267 deletions
@@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.delinquency.api;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
@@ -35,17 +34,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.portfolio.delinquency.data.DelinquencyBucketData;
@@ -59,7 +54,6 @@ import org.springframework.stereotype.Component;
@Tag(name = "Delinquency Range and Buckets Management", description = "Delinquency Range and Buckets management enables you to set up, fetch and adjust Delinquency overdue ranges")
public class DelinquencyApiResource {
private final ApiRequestParameterHelper parameterHelper;
private final PlatformSecurityContext securityContext;
private final DefaultToApiJsonSerializer<DelinquencyBucketData> jsonSerializerBucket;
private final DefaultToApiJsonSerializer<DelinquencyRangeData> jsonSerializerRange;
@@ -71,13 +65,9 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "List all Delinquency Ranges", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = DelinquencyApiResourceSwagger.GetDelinquencyRangesResponse.class)))) })
public String getDelinquencyRanges(@Context final UriInfo uriInfo) {
public List<DelinquencyRangeData> getDelinquencyRanges() {
securityContext.authenticatedUser().validateHasReadPermission("DELINQUENCY_BUCKET");
final Collection<DelinquencyRangeData> delinquencyRangeData = this.readPlatformService.retrieveAllDelinquencyRanges();
ApiRequestJsonSerializationSettings settings = parameterHelper.process(uriInfo.getQueryParameters());
return this.jsonSerializerRange.serialize(settings, delinquencyRangeData);
return this.readPlatformService.retrieveAllDelinquencyRanges();
}
@GET
@@ -85,15 +75,10 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "Retrieve a specific Delinquency Range based on the Id", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.GetDelinquencyRangesResponse.class))) })
public String getDelinquencyRange(
@PathParam("delinquencyRangeId") @Parameter(description = "delinquencyRangeId") final Long delinquencyRangeId,
@Context final UriInfo uriInfo) {
public DelinquencyRangeData getDelinquencyRange(
@PathParam("delinquencyRangeId") @Parameter(description = "delinquencyRangeId") final Long delinquencyRangeId) {
securityContext.authenticatedUser().validateHasReadPermission("DELINQUENCY_BUCKET");
final DelinquencyRangeData delinquencyRangeData = this.readPlatformService.retrieveDelinquencyRange(delinquencyRangeId);
ApiRequestJsonSerializationSettings settings = parameterHelper.process(uriInfo.getQueryParameters());
return this.jsonSerializerRange.serialize(settings, delinquencyRangeData);
return this.readPlatformService.retrieveDelinquencyRange(delinquencyRangeId);
}
@POST
@@ -101,15 +86,15 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Operation(summary = "Create Delinquency Range", description = "")
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyRangeRequest.class)))
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyRangeRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyRangeResponse.class))) })
public String createDelinquencyRange(final String jsonRequestBody, @Context UriInfo uriInfo) {
public CommandProcessingResult createDelinquencyRange(final DelinquencyRangeRequest delinquencyRangeRequest) {
securityContext.authenticatedUser().validateHasCreatePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().createDelinquencyRange().withJson(jsonRequestBody).build();
final CommandWrapper commandRequest = new CommandWrapperBuilder().createDelinquencyRange()
.withJson(jsonSerializerRange.serialize(delinquencyRangeRequest)).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
@PUT
@@ -117,18 +102,17 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Operation(summary = "Update Delinquency Range based on the Id", description = "")
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyRangeRequest.class)))
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyRangeRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PutDelinquencyRangeResponse.class))) })
public String updateDelinquencyRange(
public CommandProcessingResult updateDelinquencyRange(
@PathParam("delinquencyRangeId") @Parameter(description = "delinquencyRangeId") final Long delinquencyRangeId,
final String jsonRequestBody, @Context UriInfo uriInfo) {
final DelinquencyRangeRequest delinquencyRangeRequest) {
securityContext.authenticatedUser().validateHasUpdatePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateDelinquencyRange(delinquencyRangeId)
.withJson(jsonRequestBody).build();
.withJson(jsonSerializerRange.serialize(delinquencyRangeRequest)).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
@DELETE
@@ -138,14 +122,12 @@ public class DelinquencyApiResource {
@Operation(summary = "Update Delinquency Range based on the Id", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.DeleteDelinquencyRangeResponse.class))) })
public String deleteDelinquencyRange(
@PathParam("delinquencyRangeId") @Parameter(description = "delinquencyRangeId") final Long delinquencyRangeId,
@Context UriInfo uriInfo) {
public CommandProcessingResult deleteDelinquencyRange(
@PathParam("delinquencyRangeId") @Parameter(description = "delinquencyRangeId") final Long delinquencyRangeId) {
securityContext.authenticatedUser().validateHasDeletePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteDelinquencyRange(delinquencyRangeId).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
@GET
@@ -153,13 +135,9 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "List all Delinquency Buckets", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = DelinquencyApiResourceSwagger.GetDelinquencyBucketsResponse.class)))) })
public String getDelinquencyBuckets(@Context final UriInfo uriInfo) {
public List<DelinquencyBucketData> getDelinquencyBuckets() {
securityContext.authenticatedUser().validateHasReadPermission("DELINQUENCY_BUCKET");
final Collection<DelinquencyBucketData> delinquencyBucketData = this.readPlatformService.retrieveAllDelinquencyBuckets();
ApiRequestJsonSerializationSettings settings = parameterHelper.process(uriInfo.getQueryParameters());
return this.jsonSerializerBucket.serialize(settings, delinquencyBucketData);
return this.readPlatformService.retrieveAllDelinquencyBuckets();
}
@GET
@@ -167,15 +145,10 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
@Produces(MediaType.APPLICATION_JSON)
@Operation(summary = "Retrieve a specific Delinquency Bucket based on the Id", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.GetDelinquencyBucketsResponse.class))) })
public String getDelinquencyBucket(
@PathParam("delinquencyBucketId") @Parameter(description = "delinquencyBucketId") final Long delinquencyBucketId,
@Context final UriInfo uriInfo) {
public DelinquencyBucketData getDelinquencyBucket(
@PathParam("delinquencyBucketId") @Parameter(description = "delinquencyBucketId") final Long delinquencyBucketId) {
securityContext.authenticatedUser().validateHasReadPermission("DELINQUENCY_BUCKET");
final DelinquencyBucketData delinquencyBucketData = this.readPlatformService.retrieveDelinquencyBucket(delinquencyBucketId);
ApiRequestJsonSerializationSettings settings = parameterHelper.process(uriInfo.getQueryParameters());
return this.jsonSerializerBucket.serialize(settings, delinquencyBucketData);
return this.readPlatformService.retrieveDelinquencyBucket(delinquencyBucketId);
}
@POST
@@ -183,15 +156,15 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Operation(summary = "Create Delinquency Bucket", description = "")
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyBucketRequest.class)))
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyBucketRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyBucketResponse.class))) })
public String createDelinquencyBucket(final String jsonRequestBody, @Context UriInfo uriInfo) {
public CommandProcessingResult createDelinquencyBucket(final DelinquencyBucketRequest delinquencyBucketRequest) {
securityContext.authenticatedUser().validateHasCreatePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().createDelinquencyBucket().withJson(jsonRequestBody).build();
final CommandWrapper commandRequest = new CommandWrapperBuilder().createDelinquencyBucket()
.withJson(jsonSerializerBucket.serialize(delinquencyBucketRequest)).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
@PUT
@@ -199,18 +172,17 @@ public class DelinquencyApiResource {
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Operation(summary = "Update Delinquency Bucket based on the Id", description = "")
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PostDelinquencyBucketRequest.class)))
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = DelinquencyBucketRequest.class)))
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.PutDelinquencyBucketResponse.class))) })
public String updateDelinquencyBucket(
public CommandProcessingResult updateDelinquencyBucket(
@PathParam("delinquencyBucketId") @Parameter(description = "delinquencyBucketId") final Long delinquencyBucketId,
final String jsonRequestBody, @Context UriInfo uriInfo) {
final DelinquencyBucketRequest delinquencyBucketRequest) {
securityContext.authenticatedUser().validateHasUpdatePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().updateDelinquencyBucket(delinquencyBucketId)
.withJson(jsonRequestBody).build();
.withJson(jsonSerializerBucket.serialize(delinquencyBucketRequest)).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
@DELETE
@@ -220,14 +192,12 @@ public class DelinquencyApiResource {
@Operation(summary = "Delete Delinquency Bucket based on the Id", description = "")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DelinquencyApiResourceSwagger.DeleteDelinquencyBucketResponse.class))) })
public String deleteDelinquencyBucket(
@PathParam("delinquencyBucketId") @Parameter(description = "delinquencyBucketId") final Long delinquencyBucketId,
@Context UriInfo uriInfo) {
public CommandProcessingResult deleteDelinquencyBucket(
@PathParam("delinquencyBucketId") @Parameter(description = "delinquencyBucketId") final Long delinquencyBucketId) {
securityContext.authenticatedUser().validateHasDeletePermission("DELINQUENCY_BUCKET");
final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteDelinquencyBucket(delinquencyBucketId).build();
CommandProcessingResult result = commandWritePlatformService.logCommandSource(commandRequest);
return jsonSerializerRange.serialize(result);
return commandWritePlatformService.logCommandSource(commandRequest);
}
}
@@ -21,54 +21,12 @@ package org.apache.fineract.portfolio.delinquency.api;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData;
public final class DelinquencyApiResourceSwagger {
private DelinquencyApiResourceSwagger() {}
@Schema(description = "GetDelinquencyRangesResponse")
public static final class GetDelinquencyRangesResponse {
private GetDelinquencyRangesResponse() {}
@Schema(example = "1")
public Long id;
@Schema(example = "Delinquent 1")
public String classification;
@Schema(example = "1")
public Integer minimumAgeDays;
@Schema(example = "3")
public Integer maximumAgeDays;
}
@Schema(description = "GetDelinquencyBucketsResponse")
public static final class GetDelinquencyBucketsResponse {
private GetDelinquencyBucketsResponse() {}
@Schema(example = "1")
public Long id;
@Schema(example = "Delinquent Bucket Set 1")
public String name;
public GetDelinquencyRangesResponse[] ranges;
}
@Schema(description = "PostDelinquencyRangeRequest")
public static final class PostDelinquencyRangeRequest {
private PostDelinquencyRangeRequest() {}
@Schema(example = "Delinquent 1")
public String classification;
@Schema(example = "1")
public Integer minimumAgeDays;
@Schema(example = "3")
public Integer maximumAgeDays;
@Schema(example = "en")
public String locale;
}
@Schema(description = "PostDelinquencyRangeResponse")
public static final class PostDelinquencyRangeResponse {
@@ -85,7 +43,7 @@ public final class DelinquencyApiResourceSwagger {
@Schema(example = "1")
public Integer resourceId;
public PostDelinquencyRangeRequest changes;
public DelinquencyRangeRequest changes;
}
@Schema(description = "DeleteDelinquencyRangeResponse")
@@ -97,17 +55,6 @@ public final class DelinquencyApiResourceSwagger {
public Integer resourceId;
}
@Schema(description = "PostDelinquencyBucketRequest")
public static final class PostDelinquencyBucketRequest {
private PostDelinquencyBucketRequest() {}
@Schema(example = "Delinquent 1")
public String name;
@Schema(example = "[1,2,3]")
public Long[] ranges;
}
@Schema(description = "PostDelinquencyBucketResponse")
public static final class PostDelinquencyBucketResponse {
@@ -144,7 +91,7 @@ public final class DelinquencyApiResourceSwagger {
public Long id;
@Schema(example = "10")
public Long loanId;
public GetDelinquencyRangesResponse delinquencyRange;
public DelinquencyRangeData delinquencyRange;
@Schema(example = "2013,1,2")
public LocalDate addedOnDate;
@Schema(example = "2013,2,20")
@@ -0,0 +1,38 @@
/**
* 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.delinquency.api;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
public class DelinquencyBucketRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String name;
private List<Long> ranges;
}
@@ -0,0 +1,39 @@
/**
* 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.delinquency.api;
import java.io.Serial;
import java.io.Serializable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
public class DelinquencyRangeRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String classification;
private Integer minimumAgeDays;
private Integer maximumAgeDays;
private String locale;
}
@@ -29,11 +29,11 @@ import org.apache.fineract.portfolio.loanaccount.data.CollectionData;
public interface DelinquencyReadPlatformService {
Collection<DelinquencyRangeData> retrieveAllDelinquencyRanges();
List<DelinquencyRangeData> retrieveAllDelinquencyRanges();
DelinquencyRangeData retrieveDelinquencyRange(Long delinquencyRangeId);
Collection<DelinquencyBucketData> retrieveAllDelinquencyBuckets();
List<DelinquencyBucketData> retrieveAllDelinquencyBuckets();
DelinquencyBucketData retrieveDelinquencyBucket(Long delinquencyBucketId);
@@ -74,7 +74,7 @@ public class DelinquencyReadPlatformServiceImpl implements DelinquencyReadPlatfo
private final ConfigurationDomainService configurationDomainService;
@Override
public Collection<DelinquencyRangeData> retrieveAllDelinquencyRanges() {
public List<DelinquencyRangeData> retrieveAllDelinquencyRanges() {
final List<DelinquencyRange> delinquencyRangeList = repositoryRange.findAll();
return mapperRange.map(delinquencyRangeList);
}
@@ -86,7 +86,7 @@ public class DelinquencyReadPlatformServiceImpl implements DelinquencyReadPlatfo
}
@Override
public Collection<DelinquencyBucketData> retrieveAllDelinquencyBuckets() {
public List<DelinquencyBucketData> retrieveAllDelinquencyBuckets() {
final List<DelinquencyBucket> delinquencyRangeList = repositoryBucket.findAll();
return mapperBucket.map(delinquencyRangeList);
}
@@ -26,7 +26,7 @@ import java.util.Set;
import org.apache.fineract.accounting.glaccount.data.GLAccountData;
import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.infrastructure.core.data.StringEnumOptionData;
import org.apache.fineract.portfolio.delinquency.api.DelinquencyApiResourceSwagger.GetDelinquencyBucketsResponse;
import org.apache.fineract.portfolio.delinquency.data.DelinquencyBucketData;
/**
* Created by Chirag Gupta on 12/27/17.
@@ -1404,8 +1404,8 @@ final class LoanProductsApiResourceSwagger {
public Integer overdueDaysForNPA;
@Schema(example = "50")
public Integer principalThresholdForLastInstalment;
public GetDelinquencyBucketsResponse delinquencyBucket;
public List<GetDelinquencyBucketsResponse> delinquencyBucketOptions;
public DelinquencyBucketData delinquencyBucket;
public List<DelinquencyBucketData> delinquencyBucketOptions;
@Schema(example = "false")
public Boolean enableInstallmentLevelDelinquency;
@Schema(example = "3")