You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ad...@apache.org on 2025/03/14 18:09:04 UTC
(fineract) branch develop updated: FINERACT-2169: Audits API recourse refactor and clean up;
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 <vi...@nowo.se>
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);
}
}