FINERACT-2169: Refactor macker checkers api controller;

This commit is contained in:
viktorpavlenko
2025-03-25 12:10:27 +01:00
committed by Adam Saghy
parent 2d2cbb46b5
commit 20195464c9
3 changed files with 92 additions and 118 deletions
@@ -20,12 +20,12 @@ package org.apache.fineract.commands.api;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; 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.Content;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.ws.rs.BeanParam;
import jakarta.ws.rs.Consumes; import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE; import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
@@ -37,21 +37,18 @@ import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.UriInfo; import jakarta.ws.rs.core.UriInfo;
import java.util.Arrays; import java.util.List;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.commands.data.AuditData; import org.apache.fineract.commands.data.AuditData;
import org.apache.fineract.commands.data.AuditSearchData; import org.apache.fineract.commands.data.AuditSearchData;
import org.apache.fineract.commands.data.request.MakerCheckerRequest;
import org.apache.fineract.commands.service.AuditReadPlatformService; import org.apache.fineract.commands.service.AuditReadPlatformService;
import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException; import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.apache.fineract.infrastructure.security.utils.SQLBuilder; import org.apache.fineract.infrastructure.security.utils.SQLBuilder;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -61,13 +58,10 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor @RequiredArgsConstructor
public class MakercheckersApiResource { public class MakercheckersApiResource {
private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "actionName", "entityName", "resourceId", private static final String COMMAND_APPROVE = "approve";
"subresourceId", "maker", "madeOnDate", "checker", "checkedOnDate", "processingResult", "commandAsJson", "officeName", private static final String COMMAND_REJECT = "reject";
"groupLevelName", "groupName", "clientName", "loanAccountNo", "savingsAccountNo", "clientId", "loanId"));
private final AuditReadPlatformService readPlatformService; private final AuditReadPlatformService readPlatformService;
private final DefaultToApiJsonSerializer<AuditData> toApiJsonSerializerAudit;
private final DefaultToApiJsonSerializer<AuditSearchData> toApiJsonSerializerSearchTemplate;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandSourceWritePlatformService writePlatformService; private final PortfolioCommandSourceWritePlatformService writePlatformService;
@@ -78,30 +72,12 @@ public class MakercheckersApiResource {
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers\n" + "\n" + "makercheckers?fields=madeOnDate,maker,processingResult\n" + "\n" + "Example Requests:\n" + "\n" + "makercheckers\n" + "\n" + "makercheckers?fields=madeOnDate,maker,processingResult\n"
+ "\n" + "makercheckers?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n" + "\n" + "makercheckers?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n"
+ "makercheckers?officeId=1\n" + "\n" + "makercheckers?officeId=1&includeJson=true") + "makercheckers?officeId=1\n" + "\n" + "makercheckers?officeId=1&includeJson=true")
@ApiResponses({ public List<AuditData> retrieveCommands(@Context final UriInfo uriInfo, @BeanParam MakerCheckerRequest makerCheckerRequest) {
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class)))) }) final SQLBuilder extraCriteria = getExtraCriteria(makerCheckerRequest);
public String retrieveCommands(@Context final UriInfo uriInfo,
@QueryParam("actionName") @Parameter(description = "actionName") final String actionName,
@QueryParam("entityName") @Parameter(description = "entityName") final String entityName,
@QueryParam("resourceId") @Parameter(description = "resourceId") final Long resourceId,
@QueryParam("makerId") @Parameter(description = "makerId") final Long makerId,
@QueryParam("makerDateTimeFrom") @Parameter(description = "makerDateTimeFrom") final String makerDateTimeFrom,
@QueryParam("makerDateTimeTo") @Parameter(description = "makerDateTimeTo") final String makerDateTimeTo,
@QueryParam("officeId") @Parameter(description = "officeId") final Integer officeId,
@QueryParam("groupId") @Parameter(description = "groupId") final Integer groupId,
@QueryParam("clientId") @Parameter(description = "clientId") final Integer clientId,
@QueryParam("loanid") @Parameter(description = "loanid") final Integer loanId,
@QueryParam("savingsAccountId") @Parameter(description = "savingsAccountId") final Integer savingsAccountId) {
final SQLBuilder extraCriteria = getExtraCriteria(actionName, entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo, final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
officeId, groupId, clientId, loanId, savingsAccountId); return readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria, settings.isIncludeJson());
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
final Collection<AuditData> entries = this.readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria,
settings.isIncludeJson());
return this.toApiJsonSerializerAudit.serialize(settings, entries, RESPONSE_DATA_PARAMETERS);
} }
@GET @GET
@@ -110,17 +86,8 @@ public class MakercheckersApiResource {
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
@Operation(summary = "Maker Checker Search Template", description = "This is a convenience resource. It can be useful when building a Checker Inbox UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with. \"actionNames\" and \"entityNames\" returned are those that the requestor has Checker approval permissions for.\n" @Operation(summary = "Maker Checker Search Template", description = "This is a convenience resource. It can be useful when building a Checker Inbox UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with. \"actionNames\" and \"entityNames\" returned are those that the requestor has Checker approval permissions for.\n"
+ "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames") + "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames")
@ApiResponses({ public AuditSearchData retrieveAuditSearchTemplate() {
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class))) }) return readPlatformService.retrieveSearchTemplate("makerchecker");
public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
final AuditSearchData auditSearchData = this.readPlatformService.retrieveSearchTemplate("makerchecker");
final Set<String> RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new HashSet<>(Arrays.asList("appUsers", "actionNames", "entityNames"));
return this.toApiJsonSerializerSearchTemplate.serialize(settings, auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE);
} }
@POST @POST
@@ -130,19 +97,19 @@ public class MakercheckersApiResource {
@Operation(summary = "Approve Maker Checker Entry | Reject Maker Checker Entry") @Operation(summary = "Approve Maker Checker Entry | Reject Maker Checker Entry")
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
public String approveMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId, public CommandProcessingResult approveMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId,
@QueryParam("command") @Parameter(description = "command") final String commandParam) { @QueryParam("command") @Parameter(description = "command") final String commandParam) {
CommandProcessingResult result = null; CommandProcessingResult result = null;
if (is(commandParam, "approve")) { if (is(commandParam, COMMAND_APPROVE)) {
result = this.writePlatformService.approveEntry(auditId); result = writePlatformService.approveEntry(auditId);
} else if (is(commandParam, "reject")) { } else if (is(commandParam, COMMAND_REJECT)) {
final Long id = this.writePlatformService.rejectEntry(auditId); final Long id = writePlatformService.rejectEntry(auditId);
result = CommandProcessingResult.commandOnlyResult(id); result = CommandProcessingResult.commandOnlyResult(id);
} else { } else {
throw new UnrecognizedQueryParamException("command", commandParam); throw new UnrecognizedQueryParamException("command", commandParam);
} }
return this.toApiJsonSerializerAudit.serialize(result); return result;
} }
private boolean is(final String commandParam, final String commandValue) { private boolean is(final String commandParam, final String commandValue) {
@@ -156,31 +123,27 @@ public class MakercheckersApiResource {
@Operation(summary = "Delete Maker Checker Entry") @Operation(summary = "Delete Maker Checker Entry")
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) })
public String deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) { public CommandProcessingResult deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) {
final Long id = writePlatformService.deleteEntry(auditId);
final Long id = this.writePlatformService.deleteEntry(auditId); return CommandProcessingResult.commandOnlyResult(id);
return this.toApiJsonSerializerAudit.serialize(CommandProcessingResult.commandOnlyResult(id));
} }
private SQLBuilder getExtraCriteria(final String actionName, final String entityName, final Long resourceId, final Long makerId, private SQLBuilder getExtraCriteria(MakerCheckerRequest makerCheckerRequest) {
final String makerDateTimeFrom, final String makerDateTimeTo, final Integer officeId, final Integer groupId,
final Integer clientId, final Integer loanId, final Integer savingsAccountId) {
SQLBuilder extraCriteria = new SQLBuilder(); SQLBuilder extraCriteria = new SQLBuilder();
extraCriteria.addNonNullCriteria("aud.action_name = ", actionName); extraCriteria.addNonNullCriteria("aud.action_name = ", makerCheckerRequest.getActionName());
if (entityName != null) { if (makerCheckerRequest.getEntityName() != null) {
extraCriteria.addCriteria("aud.entity_name like ", entityName + "%"); extraCriteria.addCriteria("aud.entity_name like ", makerCheckerRequest.getEntityName() + "%");
} }
extraCriteria.addNonNullCriteria("aud.resource_id = ", resourceId); extraCriteria.addNonNullCriteria("aud.resource_id = ", makerCheckerRequest.getResourceId());
extraCriteria.addNonNullCriteria("aud.maker_id = ", makerId); extraCriteria.addNonNullCriteria("aud.maker_id = ", makerCheckerRequest.getMakerId());
extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerDateTimeFrom); extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerCheckerRequest.getMakerDateTimeFrom());
extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerDateTimeTo); extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerCheckerRequest.getMakerDateTimeTo());
extraCriteria.addNonNullCriteria("aud.office_id = ", officeId); extraCriteria.addNonNullCriteria("aud.office_id = ", makerCheckerRequest.getOfficeId());
extraCriteria.addNonNullCriteria("aud.group_id = ", groupId); extraCriteria.addNonNullCriteria("aud.group_id = ", makerCheckerRequest.getGroupId());
extraCriteria.addNonNullCriteria("aud.client_id = ", clientId); extraCriteria.addNonNullCriteria("aud.client_id = ", makerCheckerRequest.getClientId());
extraCriteria.addNonNullCriteria("aud.loan_id = ", loanId); extraCriteria.addNonNullCriteria("aud.loan_id = ", makerCheckerRequest.getLoanId());
extraCriteria.addNonNullCriteria("aud.savings_account_id = ", savingsAccountId); extraCriteria.addNonNullCriteria("aud.savings_account_id = ", makerCheckerRequest.getSavingsAccountId());
return extraCriteria; return extraCriteria;
} }
@@ -19,11 +19,6 @@
package org.apache.fineract.commands.api; package org.apache.fineract.commands.api;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.List;
import org.apache.fineract.commands.data.ProcessingResultLookup;
import org.apache.fineract.useradministration.data.AppUserData;
/** /**
* Created by sanyam on 27/7/17. * Created by sanyam on 27/7/17.
@@ -34,49 +29,6 @@ final class MakercheckersApiResourceSwagger {
// only to initialize swagger documentation // only to initialize swagger documentation
} }
@Schema(description = "GetMakerCheckerResponse")
public static final class GetMakerCheckerResponse {
private GetMakerCheckerResponse() {
}
public Long id;
public String actionName;
public String entityName;
public Long resourceId;
public Long subresourceId;
public String maker;
public ZonedDateTime madeOnDate;
public String checker;
public ZonedDateTime checkedOnDate;
public String processingResult;
public String commandAsJson;
public String officeName;
public String groupLevelName;
public String groupName;
public String clientName;
public String loanAccountNo;
public String savingsAccountNo;
public Long clientId;
public Long loanId;
public String url;
}
@Schema(description = "GetMakerCheckersSearchTemplateResponse")
public static final class GetMakerCheckersSearchTemplateResponse {
private GetMakerCheckersSearchTemplateResponse() {
}
public Collection<AppUserData> appUsers;
public List<String> actionNames;
public List<String> entityNames;
public Collection<ProcessingResultLookup> processingResults;
}
@Schema(description = "PostMakerCheckersResponse") @Schema(description = "PostMakerCheckersResponse")
public static final class PostMakerCheckersResponse { public static final class PostMakerCheckersResponse {
@@ -0,0 +1,59 @@
/**
* 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.commands.data.request;
import jakarta.ws.rs.QueryParam;
import java.io.Serial;
import java.io.Serializable;
import java.time.ZonedDateTime;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
public class MakerCheckerRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@QueryParam("actionName")
private String actionName;
@QueryParam("entityName")
private String entityName;
@QueryParam("resourceId")
private Long resourceId;
@QueryParam("makerId")
private Long makerId;
@QueryParam("makerDateTimeFrom")
private ZonedDateTime makerDateTimeFrom;
@QueryParam("makerDateTimeTo")
private ZonedDateTime makerDateTimeTo;
@QueryParam("clientId")
private Long clientId;
@QueryParam("loanid")
private Long loanId;
@QueryParam("officeId")
private Long officeId;
@QueryParam("groupId")
private Long groupId;
@QueryParam("savingsAccountId")
private Long savingsAccountId;
}