This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new d96e78a4f7 FINERACT-2169: Audits API recourse refactor and clean up;
d96e78a4f7 is described below

commit d96e78a4f70879985c411e41691ac707ea8e7f82
Author: viktorpavlenko <[email protected]>
AuthorDate: Mon Feb 24 18:27:06 2025 +0200

    FINERACT-2169: Audits API recourse refactor and clean up;
---
 .../fineract/commands/api/AuditsApiResource.java   | 132 ++++++---------------
 .../apache/fineract/commands/data/AuditData.java   |   7 +-
 .../fineract/commands/data/AuditSearchData.java    |  17 ++-
 .../commands/data/ProcessingResultLookup.java      |  12 +-
 .../commands/data/request/AuditRequest.java        |  70 +++++++++++
 .../commands/service/AuditReadPlatformService.java |   6 +-
 .../service/AuditReadPlatformServiceImpl.java      |  10 +-
 .../commands/starter/CommandsConfiguration.java    |   6 +-
 8 files changed, 137 insertions(+), 123 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
index 9a17404a20..2e615f0428 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
@@ -20,12 +20,8 @@ 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.GET;
 import jakarta.ws.rs.Path;
@@ -35,21 +31,16 @@ 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 lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.data.AuditData;
 import org.apache.fineract.commands.data.AuditSearchData;
+import org.apache.fineract.commands.data.request.AuditRequest;
 import org.apache.fineract.commands.service.AuditReadPlatformService;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.PaginationParameters;
 import 
org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
-import 
org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
-import org.apache.fineract.infrastructure.core.service.Page;
+import 
org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
-import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.apache.fineract.infrastructure.security.utils.SQLBuilder;
 import org.springframework.stereotype.Component;
 
@@ -63,18 +54,12 @@ import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class AuditsApiResource {
 
-    private static final Set<String> 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", "url"));
-
     private static final String RESOURCE_NAME_FOR_PERMISSIONS = "AUDIT";
 
     private final PlatformSecurityContext context;
     private final AuditReadPlatformService auditReadPlatformService;
     private final ApiRequestParameterHelper apiRequestParameterHelper;
-    private final DefaultToApiJsonSerializer<AuditData> toApiJsonSerializer;
-    private final DefaultToApiJsonSerializer<AuditSearchData> 
toApiJsonSerializerSearchTemplate;
-    private final SqlValidator sqlValidator;
+    private final ToApiJsonSerializer<String> toApiJsonSerializer;
 
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
@@ -83,50 +68,22 @@ public class AuditsApiResource {
             + "\n" + "Example Requests:\n" + "\n" + "audits\n" + "\n" + 
"audits?fields=madeOnDate,maker,processingResult\n" + "\n"
             + "audits?makerDateTimeFrom=2013-03-25 
08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n" + "audits?officeId=1\n" 
+ "\n"
             + "audits?officeId=1&includeJson=true")
-    @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(array = @ArraySchema(schema = @Schema(implementation = 
MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class)))) })
-    public String retrieveAuditEntries(@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("checkerId") @Parameter(description = "checkerId") 
final Long checkerId,
-            @QueryParam("checkerDateTimeFrom") @Parameter(description = 
"checkerDateTimeFrom") final String checkerDateTimeFrom,
-            @QueryParam("checkerDateTimeTo") @Parameter(description = 
"checkerDateTimeTo") final String checkerDateTimeTo,
-            @QueryParam("processingResult") @Parameter(description = 
"processingResult") final Integer processingResult,
-            @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,
-            @QueryParam("paged") @Parameter(description = "paged") final 
Boolean paged,
+    public String retrieveAuditEntries(@Context final UriInfo uriInfo, 
@BeanParam AuditRequest auditRequest,
             @QueryParam("offset") @Parameter(description = "offset") final 
Integer offset,
             @QueryParam("limit") @Parameter(description = "limit") final 
Integer limit,
             @QueryParam("orderBy") @Parameter(description = "orderBy") final 
String orderBy,
-            @QueryParam("sortOrder") @Parameter(description = "sortOrder") 
final String sortOrder) {
+            @QueryParam("sortOrder") @Parameter(description = "sortOrder") 
final String sortOrder,
+            @QueryParam("paged") @Parameter(description = "paged") final 
Boolean paged) {
 
-        
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-        sqlValidator.validate(orderBy);
-        sqlValidator.validate(sortOrder);
+        
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
         final PaginationParameters parameters = 
PaginationParameters.builder().paged(Boolean.TRUE.equals(paged)).limit(limit).offset(offset)
                 .orderBy(orderBy).sortOrder(sortOrder).build();
-        final SQLBuilder extraCriteria = getExtraCriteria(actionName, 
entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo,
-                checkerId, checkerDateTimeFrom, checkerDateTimeTo, 
processingResult, officeId, groupId, clientId, loanId, savingsAccountId);
-
+        final SQLBuilder extraCriteria = getExtraCriteria(auditRequest);
         final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
 
-        if (parameters.isPaged()) {
-            final Page<AuditData> auditEntries = 
this.auditReadPlatformService.retrievePaginatedAuditEntries(extraCriteria,
-                    settings.isIncludeJson(), parameters);
-            return this.toApiJsonSerializer.serialize(settings, auditEntries, 
RESPONSE_DATA_PARAMETERS);
-        }
-
-        final Collection<AuditData> auditEntries = 
this.auditReadPlatformService.retrieveAuditEntries(extraCriteria,
-                settings.isIncludeJson());
-
-        return this.toApiJsonSerializer.serialize(settings, auditEntries, 
RESPONSE_DATA_PARAMETERS);
+        return toApiJsonSerializer.serialize(parameters.isPaged()
+                ? 
auditReadPlatformService.retrievePaginatedAuditEntries(extraCriteria, 
settings.isIncludeJson(), parameters)
+                : auditReadPlatformService.retrieveAuditEntries(extraCriteria, 
settings.isIncludeJson()));
     }
 
     @GET
@@ -135,17 +92,10 @@ public class AuditsApiResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "Retrieve an Audit Entry", description = "Example 
Requests:\n" + "\n" + "audits/20\n"
             + "audits/20?fields=madeOnDate,maker,processingResult")
-    @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = 
MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class))) })
-    public String retrieveAuditEntry(@PathParam("auditId") 
@Parameter(description = "auditId") final Long auditId,
-            @Context final UriInfo uriInfo) {
-
-        
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
+    public AuditData retrieveAuditEntry(@PathParam("auditId") @Parameter final 
Long auditId) {
+        
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
+        return auditReadPlatformService.retrieveAuditEntry(auditId);
 
-        final AuditData auditEntry = 
this.auditReadPlatformService.retrieveAuditEntry(auditId);
-
-        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.toApiJsonSerializer.serialize(settings, auditEntry, 
RESPONSE_DATA_PARAMETERS);
     }
 
     @GET
@@ -154,45 +104,31 @@ public class AuditsApiResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "Audit Search Template", description = "This is a 
convenience resource. It can be useful when building an Audit Search UI. 
\"appUsers\" are data scoped to the office/branch the requestor is associated 
with.\n"
             + "\n" + "Example Requests:\n" + "\n" + "audits/searchtemplate\n" 
+ "audits/searchtemplate?fields=actionNames")
-    @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = 
MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class))) 
})
-    public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
-
+    public AuditSearchData retrieveAuditSearchTemplate() {
         
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-
-        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-
-        final AuditSearchData auditSearchData = 
this.auditReadPlatformService.retrieveSearchTemplate("audit");
-
-        final Set<String> RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE = new 
HashSet<>(
-                Arrays.asList("appUsers", "actionNames", "entityNames", 
"status"));
-
-        return this.toApiJsonSerializerSearchTemplate.serialize(settings, 
auditSearchData, RESPONSE_DATA_PARAMETERS_SEARCH_TEMPLATE);
+        return this.auditReadPlatformService.retrieveSearchTemplate("audit");
     }
 
-    private SQLBuilder getExtraCriteria(final String actionName, final String 
entityName, final Long resourceId, final Long makerId,
-            final String makerDateTimeFrom, final String makerDateTimeTo, 
final Long checkerId, final String checkerDateTimeFrom,
-            final String checkerDateTimeTo, final Integer status, final 
Integer officeId, final Integer groupId, final Integer clientId,
-            final Integer loanId, final Integer savingsAccountId) {
+    private SQLBuilder getExtraCriteria(AuditRequest auditRequest) {
 
         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 = ", 
auditRequest.getActionName());
+        if (auditRequest.getEntityName() != null) {
+            extraCriteria.addCriteria("aud.entity_name like", 
auditRequest.getEntityName() + "%");
         }
-        extraCriteria.addNonNullCriteria("aud.resource_id = ", resourceId);
-        extraCriteria.addNonNullCriteria("aud.maker_id = ", makerId);
-        extraCriteria.addNonNullCriteria("aud.checker_id = ", checkerId);
-        extraCriteria.addNonNullCriteria("aud.made_on_date >= ", 
makerDateTimeFrom);
-        extraCriteria.addNonNullCriteria("aud.made_on_date <= ", 
makerDateTimeTo);
-        extraCriteria.addNonNullCriteria("aud.checked_on_date >= ", 
checkerDateTimeFrom);
-        extraCriteria.addNonNullCriteria("aud.checked_on_date <= ", 
checkerDateTimeTo);
-        extraCriteria.addNonNullCriteria("aud.status = ", status);
-        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 = ", 
auditRequest.getResourceId());
+        extraCriteria.addNonNullCriteria("aud.maker_id = ", 
auditRequest.getMakerId());
+        extraCriteria.addNonNullCriteria("aud.checker_id = ", 
auditRequest.getCheckerId());
+        extraCriteria.addNonNullCriteria("aud.made_on_date >= ", 
auditRequest.getMakerDateTimeFrom());
+        extraCriteria.addNonNullCriteria("aud.made_on_date <= ", 
auditRequest.getMakerDateTimeTo());
+        extraCriteria.addNonNullCriteria("aud.checked_on_date >= ", 
auditRequest.getCheckerDateTimeFrom());
+        extraCriteria.addNonNullCriteria("aud.checked_on_date <= ", 
auditRequest.getCheckerDateTimeTo());
+        extraCriteria.addNonNullCriteria("aud.status = ", 
auditRequest.getStatus());
+        extraCriteria.addNonNullCriteria("aud.office_id = ", 
auditRequest.getOfficeId());
+        extraCriteria.addNonNullCriteria("aud.group_id = ", 
auditRequest.getGroupId());
+        extraCriteria.addNonNullCriteria("aud.client_id = ", 
auditRequest.getClientId());
+        extraCriteria.addNonNullCriteria("aud.loan_id = ", 
auditRequest.getLoanId());
+        extraCriteria.addNonNullCriteria("aud.savings_account_id = ", 
auditRequest.getSavingsAccountId());
 
         return extraCriteria;
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditData.java
index 0f6b2dfb20..7cb1580173 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditData.java
@@ -18,6 +18,8 @@
  */
 package org.apache.fineract.commands.data;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.time.ZonedDateTime;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -28,7 +30,10 @@ import lombok.Setter;
  */
 @AllArgsConstructor
 @Getter
-public final class AuditData {
+public final class AuditData implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
 
     private final Long id;
     private final String actionName;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditSearchData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditSearchData.java
index 047e80dee0..373a27563d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditSearchData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/AuditSearchData.java
@@ -18,21 +18,20 @@
  */
 package org.apache.fineract.commands.data;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import org.apache.fineract.useradministration.data.AppUserData;
 
 /**
  * Immutable data object representing audit search results.
  */
-@RequiredArgsConstructor
-@Getter
-public final class AuditSearchData {
 
-    private final Collection<AppUserData> appUsers;
-    private final List<String> actionNames;
-    private final List<String> entityNames;
-    private final Collection<ProcessingResultLookup> statuses;
+public record AuditSearchData(Collection<AppUserData> appUsers, List<String> 
actionNames, List<String> entityNames,
+        Collection<ProcessingResultLookup> statuses) implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/ProcessingResultLookup.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/ProcessingResultLookup.java
index bca4ac5b1e..55e3fe8c3b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/ProcessingResultLookup.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/ProcessingResultLookup.java
@@ -18,17 +18,15 @@
  */
 package org.apache.fineract.commands.data;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import java.io.Serial;
+import java.io.Serializable;
 
 /**
  * Immutable data object for application user data.
  */
-@RequiredArgsConstructor
-@Getter
-public class ProcessingResultLookup {
+public record ProcessingResultLookup(Long id, String processingResult) 
implements Serializable {
 
-    private final Long id;
-    private final String processingResult;
+    @Serial
+    private static final long serialVersionUID = 1L;
 
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/AuditRequest.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/AuditRequest.java
new file mode 100644
index 0000000000..cbc5994dd9
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/AuditRequest.java
@@ -0,0 +1,70 @@
+/**
+ * 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 AuditRequest 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("checkerId")
+    private Long checkerId;
+    @QueryParam("checkerDateTimeFrom")
+    private ZonedDateTime checkerDateTimeFrom;
+    @QueryParam("checkerDateTimeTo")
+    private ZonedDateTime checkerDateTimeTo;
+    @QueryParam("status")
+    private String status;
+    @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;
+    @QueryParam("processingResult")
+    private String processingResult;
+
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformService.java
index f7c90e4c48..059f40d24a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformService.java
@@ -18,7 +18,7 @@
  */
 package org.apache.fineract.commands.service;
 
-import java.util.Collection;
+import java.util.List;
 import org.apache.fineract.commands.data.AuditData;
 import org.apache.fineract.commands.data.AuditSearchData;
 import org.apache.fineract.infrastructure.core.data.PaginationParameters;
@@ -27,11 +27,11 @@ import 
org.apache.fineract.infrastructure.security.utils.SQLBuilder;
 
 public interface AuditReadPlatformService {
 
-    Collection<AuditData> retrieveAuditEntries(SQLBuilder extraCriteria, 
boolean includeJson);
+    List<AuditData> retrieveAuditEntries(SQLBuilder extraCriteria, boolean 
includeJson);
 
     Page<AuditData> retrievePaginatedAuditEntries(SQLBuilder extraCriteria, 
boolean includeJson, PaginationParameters parameters);
 
-    Collection<AuditData> retrieveAllEntriesToBeChecked(SQLBuilder 
extraCriteria, boolean includeJson);
+    List<AuditData> retrieveAllEntriesToBeChecked(SQLBuilder extraCriteria, 
boolean includeJson);
 
     AuditData retrieveAuditEntry(Long auditId);
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformServiceImpl.java
index bf41138579..2d18544e1a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/service/AuditReadPlatformServiceImpl.java
@@ -47,6 +47,7 @@ import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.PaginationHelper;
 import 
org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
+import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.apache.fineract.infrastructure.security.utils.ColumnValidator;
 import org.apache.fineract.infrastructure.security.utils.SQLBuilder;
 import org.apache.fineract.organisation.office.data.OfficeData;
@@ -92,6 +93,7 @@ public class AuditReadPlatformServiceImpl implements 
AuditReadPlatformService {
     private final SavingsProductReadPlatformService 
savingsProductReadPlatformService;
     private final DepositProductReadPlatformService 
depositProductReadPlatformService;
     private final ColumnValidator columnValidator;
+    private final SqlValidator sqlValidator;
 
     private static final class AuditMapper implements RowMapper<AuditData> {
 
@@ -167,7 +169,7 @@ public class AuditReadPlatformServiceImpl implements 
AuditReadPlatformService {
     }
 
     @Override
-    public Collection<AuditData> retrieveAuditEntries(final SQLBuilder 
extraCriteria, final boolean includeJson) {
+    public List<AuditData> retrieveAuditEntries(final SQLBuilder 
extraCriteria, final boolean includeJson) {
         return retrieveEntries("audit", extraCriteria, " order by aud.id DESC 
limit " + PaginationParameters.DEFAULT_MAX_LIMIT,
                 includeJson);
     }
@@ -176,6 +178,8 @@ public class AuditReadPlatformServiceImpl implements 
AuditReadPlatformService {
     public Page<AuditData> retrievePaginatedAuditEntries(final SQLBuilder 
extraCriteria, final boolean includeJson,
             final PaginationParameters parameters) {
 
+        sqlValidator.validate(parameters.getOrderBy());
+        sqlValidator.validate(parameters.getSortOrder());
         
this.paginationParametersDataValidator.validateParameterValues(parameters, 
supportedOrderByValues, "audits");
         final AppUser currentUser = this.context.authenticatedUser();
         final String hierarchy = currentUser.getOffice().getHierarchy();
@@ -203,12 +207,12 @@ public class AuditReadPlatformServiceImpl implements 
AuditReadPlatformService {
     }
 
     @Override
-    public Collection<AuditData> retrieveAllEntriesToBeChecked(final 
SQLBuilder extraCriteria, final boolean includeJson) {
+    public List<AuditData> retrieveAllEntriesToBeChecked(final SQLBuilder 
extraCriteria, final boolean includeJson) {
         extraCriteria.addCriteria("aud.status = ", 2);
         return retrieveEntries("makerchecker", extraCriteria, " order by 
aud.id, mk.username", includeJson);
     }
 
-    private Collection<AuditData> retrieveEntries(final String useType, final 
SQLBuilder extraCriteria, final String groupAndOrderBySQL,
+    private List<AuditData> retrieveEntries(final String useType, final 
SQLBuilder extraCriteria, final String groupAndOrderBySQL,
             final boolean includeJson) {
 
         if ((!useType.equals("audit") && !useType.equals("makerchecker"))) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/commands/starter/CommandsConfiguration.java
 
b/fineract-provider/src/main/java/org/apache/fineract/commands/starter/CommandsConfiguration.java
index 774d148332..3ed82971ab 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/commands/starter/CommandsConfiguration.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/commands/starter/CommandsConfiguration.java
@@ -25,6 +25,7 @@ import 
org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.infrastructure.core.service.PaginationHelper;
 import 
org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
+import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.apache.fineract.infrastructure.security.utils.ColumnValidator;
 import 
org.apache.fineract.organisation.office.service.OfficeReadPlatformService;
 import org.apache.fineract.organisation.staff.service.StaffReadPlatformService;
@@ -50,11 +51,12 @@ public class CommandsConfiguration {
             PaginationHelper paginationHelper, DatabaseSpecificSQLGenerator 
sqlGenerator,
             PaginationParametersDataValidator 
paginationParametersDataValidator,
             SavingsProductReadPlatformService 
savingsProductReadPlatformService,
-            DepositProductReadPlatformService 
depositProductReadPlatformService, ColumnValidator columnValidator) {
+            DepositProductReadPlatformService 
depositProductReadPlatformService, ColumnValidator columnValidator,
+            SqlValidator sqlValidator) {
         return new AuditReadPlatformServiceImpl(jdbcTemplate, context, 
fromApiJsonHelper, appUserReadPlatformService,
                 officeReadPlatformService, clientReadPlatformService, 
loanProductReadPlatformService, staffReadPlatformService,
                 paginationHelper, sqlGenerator, 
paginationParametersDataValidator, savingsProductReadPlatformService,
-                depositProductReadPlatformService, columnValidator);
+                depositProductReadPlatformService, columnValidator, 
sqlValidator);
     }
 
 }

Reply via email to