From 20195464c95f806b8f96eb04371020f5a99cad96 Mon Sep 17 00:00:00 2001 From: viktorpavlenko Date: Thu, 20 Mar 2025 14:59:04 +0200 Subject: [PATCH] FINERACT-2169: Refactor macker checkers api controller; --- .../api/MakercheckersApiResource.java | 103 ++++++------------ .../api/MakercheckersApiResourceSwagger.java | 48 -------- .../data/request/MakerCheckerRequest.java | 59 ++++++++++ 3 files changed, 92 insertions(+), 118 deletions(-) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java index 06e05268e..5acafefbc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java @@ -20,12 +20,12 @@ package org.apache.fineract.commands.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.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.ws.rs.BeanParam; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; 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.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.commons.lang3.StringUtils; import org.apache.fineract.commands.data.AuditData; 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.PortfolioCommandSourceWritePlatformService; import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException; 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.springframework.stereotype.Component; @@ -61,13 +58,10 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class MakercheckersApiResource { - private static final Set RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "actionName", "entityName", "resourceId", - "subresourceId", "maker", "madeOnDate", "checker", "checkedOnDate", "processingResult", "commandAsJson", "officeName", - "groupLevelName", "groupName", "clientName", "loanAccountNo", "savingsAccountNo", "clientId", "loanId")); + private static final String COMMAND_APPROVE = "approve"; + private static final String COMMAND_REJECT = "reject"; private final AuditReadPlatformService readPlatformService; - private final DefaultToApiJsonSerializer toApiJsonSerializerAudit; - private final DefaultToApiJsonSerializer toApiJsonSerializerSearchTemplate; private final ApiRequestParameterHelper apiRequestParameterHelper; 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" + "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") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class)))) }) - 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) { + public List retrieveCommands(@Context final UriInfo uriInfo, @BeanParam MakerCheckerRequest makerCheckerRequest) { + final SQLBuilder extraCriteria = getExtraCriteria(makerCheckerRequest); - final SQLBuilder extraCriteria = getExtraCriteria(actionName, entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo, - officeId, groupId, clientId, loanId, savingsAccountId); + final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); + return readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria, settings.isIncludeJson()); - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - - final Collection entries = this.readPlatformService.retrieveAllEntriesToBeChecked(extraCriteria, - settings.isIncludeJson()); - - return this.toApiJsonSerializerAudit.serialize(settings, entries, RESPONSE_DATA_PARAMETERS); } @GET @@ -110,17 +86,8 @@ public class MakercheckersApiResource { @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" + "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class))) }) - public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) { - - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); - - final AuditSearchData auditSearchData = this.readPlatformService.retrieveSearchTemplate("makerchecker"); - - final Set RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new HashSet<>(Arrays.asList("appUsers", "actionNames", "entityNames")); - - return this.toApiJsonSerializerSearchTemplate.serialize(settings, auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE); + public AuditSearchData retrieveAuditSearchTemplate() { + return readPlatformService.retrieveSearchTemplate("makerchecker"); } @POST @@ -130,19 +97,19 @@ public class MakercheckersApiResource { @Operation(summary = "Approve Maker Checker Entry | Reject Maker Checker Entry") @ApiResponses({ @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) { CommandProcessingResult result = null; - if (is(commandParam, "approve")) { - result = this.writePlatformService.approveEntry(auditId); - } else if (is(commandParam, "reject")) { - final Long id = this.writePlatformService.rejectEntry(auditId); + if (is(commandParam, COMMAND_APPROVE)) { + result = writePlatformService.approveEntry(auditId); + } else if (is(commandParam, COMMAND_REJECT)) { + final Long id = writePlatformService.rejectEntry(auditId); result = CommandProcessingResult.commandOnlyResult(id); } else { throw new UnrecognizedQueryParamException("command", commandParam); } - return this.toApiJsonSerializerAudit.serialize(result); + return result; } private boolean is(final String commandParam, final String commandValue) { @@ -156,31 +123,27 @@ public class MakercheckersApiResource { @Operation(summary = "Delete Maker Checker Entry") @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class))) }) - public String deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) { - - final Long id = this.writePlatformService.deleteEntry(auditId); - - return this.toApiJsonSerializerAudit.serialize(CommandProcessingResult.commandOnlyResult(id)); + public CommandProcessingResult deleteMakerCheckerEntry(@PathParam("auditId") @Parameter(description = "auditId") final Long auditId) { + final Long id = writePlatformService.deleteEntry(auditId); + return CommandProcessingResult.commandOnlyResult(id); } - private SQLBuilder getExtraCriteria(final String actionName, final String entityName, final Long resourceId, final Long makerId, - final String makerDateTimeFrom, final String makerDateTimeTo, final Integer officeId, final Integer groupId, - final Integer clientId, final Integer loanId, final Integer savingsAccountId) { + private SQLBuilder getExtraCriteria(MakerCheckerRequest makerCheckerRequest) { SQLBuilder extraCriteria = new SQLBuilder(); - extraCriteria.addNonNullCriteria("aud.action_name = ", actionName); - if (entityName != null) { - extraCriteria.addCriteria("aud.entity_name like ", entityName + "%"); + extraCriteria.addNonNullCriteria("aud.action_name = ", makerCheckerRequest.getActionName()); + if (makerCheckerRequest.getEntityName() != null) { + extraCriteria.addCriteria("aud.entity_name like ", makerCheckerRequest.getEntityName() + "%"); } - extraCriteria.addNonNullCriteria("aud.resource_id = ", resourceId); - extraCriteria.addNonNullCriteria("aud.maker_id = ", makerId); - extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerDateTimeFrom); - extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerDateTimeTo); - extraCriteria.addNonNullCriteria("aud.office_id = ", officeId); - extraCriteria.addNonNullCriteria("aud.group_id = ", groupId); - extraCriteria.addNonNullCriteria("aud.client_id = ", clientId); - extraCriteria.addNonNullCriteria("aud.loan_id = ", loanId); - extraCriteria.addNonNullCriteria("aud.savings_account_id = ", savingsAccountId); + extraCriteria.addNonNullCriteria("aud.resource_id = ", makerCheckerRequest.getResourceId()); + extraCriteria.addNonNullCriteria("aud.maker_id = ", makerCheckerRequest.getMakerId()); + extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerCheckerRequest.getMakerDateTimeFrom()); + extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerCheckerRequest.getMakerDateTimeTo()); + extraCriteria.addNonNullCriteria("aud.office_id = ", makerCheckerRequest.getOfficeId()); + extraCriteria.addNonNullCriteria("aud.group_id = ", makerCheckerRequest.getGroupId()); + extraCriteria.addNonNullCriteria("aud.client_id = ", makerCheckerRequest.getClientId()); + extraCriteria.addNonNullCriteria("aud.loan_id = ", makerCheckerRequest.getLoanId()); + extraCriteria.addNonNullCriteria("aud.savings_account_id = ", makerCheckerRequest.getSavingsAccountId()); return extraCriteria; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java index eed05fb55..07f523e01 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java @@ -19,11 +19,6 @@ package org.apache.fineract.commands.api; 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. @@ -34,49 +29,6 @@ final class MakercheckersApiResourceSwagger { // 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 appUsers; - public List actionNames; - public List entityNames; - public Collection processingResults; - } - @Schema(description = "PostMakerCheckersResponse") public static final class PostMakerCheckersResponse { diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java new file mode 100644 index 000000000..4d8bbe0c6 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java @@ -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; +}