FINERACT-2025 SQL Query Improvement

This commit is contained in:
Peter Bagrij
2023-12-07 10:17:35 +01:00
committed by Peter Bagrij
parent cb40f230b1
commit 5a8a2b9e35
16 changed files with 116 additions and 180 deletions
@@ -18,11 +18,14 @@
*/ */
package org.apache.fineract.infrastructure.core.service; package org.apache.fineract.infrastructure.core.service;
import lombok.AllArgsConstructor;
import lombok.Builder;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@Builder
@AllArgsConstructor
public final class SearchParameters { public final class SearchParameters {
private final String sqlSearch;
private final Long officeId; private final Long officeId;
private final String externalId; private final String externalId;
private final String name; private final String name;
@@ -44,28 +47,26 @@ public final class SearchParameters {
private final Long savingsId; private final Long savingsId;
private final Boolean orphansOnly; private final Boolean orphansOnly;
// Provisning Entries Search Params // Provisioning Entries Search Params
private final Long provisioningEntryId; private final Long provisioningEntryId;
private final Long productId; private final Long productId;
private final Long categoryId; private final Long categoryId;
private final boolean isSelfUser; private final boolean isSelfUser;
public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name, public static SearchParameters from(final Long officeId, final String externalId, final String name, final String hierarchy) {
final String hierarchy) {
final Long staffId = null; final Long staffId = null;
final String accountNo = null; final String accountNo = null;
final Long loanId = null; final Long loanId = null;
final Long savingsId = null; final Long savingsId = null;
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, null, null, null, null, staffId, return new SearchParameters(officeId, externalId, name, hierarchy, null, null, null, null, null, null, staffId, accountNo, loanId,
accountNo, loanId, savingsId, orphansOnly, isSelfUser); savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forClients(final String sqlSearch, final Long officeId, final String externalId, public static SearchParameters forClients(final Long officeId, final String externalId, final String displayName,
final String displayName, final String firstname, final String lastname, final String status, final String hierarchy, final String firstname, final String lastname, final String status, final String hierarchy, final Integer offset,
final Integer offset, final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly, final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly, final boolean isSelfUser) {
final boolean isSelfUser) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null; final Long staffId = null;
@@ -73,8 +74,8 @@ public final class SearchParameters {
final Long loanId = null; final Long loanId = null;
final Long savingsId = null; final Long savingsId = null;
return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, status, offset, return new SearchParameters(officeId, externalId, displayName, hierarchy, firstname, lastname, status, offset, maxLimitAllowed,
maxLimitAllowed, orderBy, sortOrder, staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser); orderBy, sortOrder, staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forGroups(final Long officeId, final Long staffId, final String externalId, final String name, public static SearchParameters forGroups(final Long officeId, final Long staffId, final String externalId, final String name,
@@ -94,12 +95,12 @@ public final class SearchParameters {
public static SearchParameters forOffices(final String orderBy, final String sortOrder) { public static SearchParameters forOffices(final String orderBy, final String sortOrder) {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(null, null, null, null, null, null, null, null, null, orderBy, sortOrder, null, null, null, null, return new SearchParameters(null, null, null, null, null, null, null, null, orderBy, sortOrder, null, null, null, null, orphansOnly,
orphansOnly, isSelfUser); isSelfUser);
} }
public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, public static SearchParameters forLoans(final String externalId, final Integer offset, final Integer limit, final String orderBy,
final String orderBy, final String sortOrder, final String accountNo) { final String sortOrder, final String accountNo) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null; final Long staffId = null;
@@ -108,8 +109,8 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, return new SearchParameters(null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser); accountNo, loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy, public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
@@ -120,8 +121,8 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, return new SearchParameters(officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null,
null, loanId, savingsId, orphansOnly, isSelfUser); loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy, public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
@@ -130,8 +131,8 @@ public final class SearchParameters {
final Long staffId = null; final Long staffId = null;
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, return new SearchParameters(officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null,
null, loanId, savingsId, orphansOnly, currencyCode); loanId, savingsId, orphansOnly, currencyCode);
} }
public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
@@ -143,8 +144,8 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null, return new SearchParameters(null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null, loanId,
loanId, savingsId, orphansOnly, isSelfUser); savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forPaginationAndAccountNumberSearch(final Integer offset, final Integer limit, final String orderBy, public static SearchParameters forPaginationAndAccountNumberSearch(final Integer offset, final Integer limit, final String orderBy,
@@ -157,8 +158,8 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, return new SearchParameters(null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, accountNumber,
accountNumber, loanId, savingsId, orphansOnly, isSelfUser); loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forPagination(final Integer offset, final Integer limit) { public static SearchParameters forPagination(final Integer offset, final Integer limit) {
@@ -172,8 +173,8 @@ public final class SearchParameters {
final String sortOrder = null; final String sortOrder = null;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null, return new SearchParameters(null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId, null, loanId,
loanId, savingsId, orphansOnly, isSelfUser); savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forProvisioningEntries(final Long provisioningEntryId, final Long officeId, final Long productId, public static SearchParameters forProvisioningEntries(final Long provisioningEntryId, final Long officeId, final Long productId,
@@ -181,7 +182,22 @@ public final class SearchParameters {
return new SearchParameters(provisioningEntryId, officeId, productId, categoryId, offset, limit); return new SearchParameters(provisioningEntryId, officeId, productId, categoryId, offset, limit);
} }
public static SearchParameters forSavings(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, public static SearchParameters forSavings(final String externalId, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
final String accountNo = null;
final Long loanId = null;
final Long savingsId = null;
final Boolean orphansOnly = false;
final boolean isSelfUser = false;
return new SearchParameters(null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
accountNo, loanId, savingsId, orphansOnly, isSelfUser);
}
public static SearchParameters forAccountTransfer(final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) { final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
@@ -192,13 +208,13 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, return new SearchParameters(null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser); accountNo, loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forAccountTransfer(final String sqlSearch, final String externalId, final Integer offset, public static SearchParameters forSMSCampaign(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
final Integer limit, final String orderBy, final String sortOrder) {
final String externalId = null;
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null; final Long staffId = null;
final String accountNo = null; final String accountNo = null;
@@ -207,11 +223,11 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, return new SearchParameters(null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser); accountNo, loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forSMSCampaign(final String sqlSearch, final Integer offset, final Integer limit, final String orderBy, public static SearchParameters forEmailCampaign(final Integer offset, final Integer limit, final String orderBy,
final String sortOrder) { final String sortOrder) {
final String externalId = null; final String externalId = null;
@@ -223,60 +239,14 @@ public final class SearchParameters {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
final boolean isSelfUser = false; final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, return new SearchParameters(null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser); accountNo, loanId, savingsId, orphansOnly, isSelfUser);
} }
public static SearchParameters forEmailCampaign(final String sqlSearch, final Integer offset, final Integer limit, final String orderBy, private SearchParameters(final Long officeId, final String externalId, final String name, final String hierarchy,
final String sortOrder) { final String firstname, final String lastname, final String status, final Integer offset, final Integer limit,
final String externalId = null;
final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
final String accountNo = null;
final Long loanId = null;
final Long savingsId = null;
final Boolean orphansOnly = false;
final boolean isSelfUser = false;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder,
staffId, accountNo, loanId, savingsId, orphansOnly, isSelfUser);
}
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId,
final Long savingsId, final Boolean orphansOnly, boolean isSelfUser) { final Long savingsId, final Boolean orphansOnly, boolean isSelfUser) {
this.sqlSearch = sqlSearch;
this.officeId = officeId;
this.externalId = externalId;
this.name = name;
this.hierarchy = hierarchy;
this.firstname = firstname;
this.lastname = lastname;
this.offset = offset;
this.limit = limit;
this.orderBy = orderBy;
this.sortOrder = sortOrder;
this.staffId = staffId;
this.accountNo = accountNo;
this.loanId = loanId;
this.savingsId = savingsId;
this.orphansOnly = orphansOnly;
this.currencyCode = null;
this.provisioningEntryId = null;
this.productId = null;
this.categoryId = null;
this.isSelfUser = isSelfUser;
this.status = null;
}
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final String firstname, final String lastname, final String status, final Integer offset,
final Integer limit, final String orderBy, final String sortOrder, final Long staffId, final String accountNo,
final Long loanId, final Long savingsId, final Boolean orphansOnly, boolean isSelfUser) {
this.sqlSearch = sqlSearch;
this.officeId = officeId; this.officeId = officeId;
this.externalId = externalId; this.externalId = externalId;
this.name = name; this.name = name;
@@ -305,7 +275,6 @@ public final class SearchParameters {
final String firstname, final String lastname, final Integer offset, final Integer limit, final String orderBy, final String firstname, final String lastname, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final Long savingsId, final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final Long savingsId,
final Boolean orphansOnly, boolean isSelfUser) { final Boolean orphansOnly, boolean isSelfUser) {
this.sqlSearch = null;
this.officeId = officeId; this.officeId = officeId;
this.externalId = externalId; this.externalId = externalId;
this.name = name; this.name = name;
@@ -331,7 +300,6 @@ public final class SearchParameters {
private SearchParameters(final Long provisioningEntryId, final Long officeId, final Long productId, final Long categoryId, private SearchParameters(final Long provisioningEntryId, final Long officeId, final Long productId, final Long categoryId,
final Integer offset, final Integer limit) { final Integer offset, final Integer limit) {
this.sqlSearch = null;
this.externalId = null; this.externalId = null;
this.name = null; this.name = null;
this.hierarchy = null; this.hierarchy = null;
@@ -356,11 +324,10 @@ public final class SearchParameters {
} }
public SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, final String hierarchy, public SearchParameters(final Long officeId, final String externalId, final String name, final String hierarchy, final String firstname,
final String firstname, final String lastname, final Integer offset, final Integer limit, final String orderBy, final String lastname, final Integer offset, final Integer limit, final String orderBy, final String sortOrder,
final String sortOrder, final Long staffId, final String accountNo, final Long loanId, final Long savingsId, final Long staffId, final String accountNo, final Long loanId, final Long savingsId, final Boolean orphansOnly,
final Boolean orphansOnly, final String currencyCode) { final String currencyCode) {
this.sqlSearch = sqlSearch;
this.officeId = officeId; this.officeId = officeId;
this.externalId = externalId; this.externalId = externalId;
this.name = name; this.name = name;
@@ -429,10 +396,6 @@ public final class SearchParameters {
return StringUtils.isNotBlank(this.hierarchy); return StringUtils.isNotBlank(this.hierarchy);
} }
public String getSqlSearch() {
return this.sqlSearch;
}
public Long getOfficeId() { public Long getOfficeId() {
return this.officeId; return this.officeId;
} }
@@ -553,8 +516,8 @@ public final class SearchParameters {
final String sortOrder) { final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null, return new SearchParameters(null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null, null,
null, null, false); null, false);
} }
/** /**
@@ -566,7 +529,7 @@ public final class SearchParameters {
final String sortOrder) { final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null, return new SearchParameters(null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, null, null, null, null,
null, null, false); null, false);
} }
} }
@@ -271,8 +271,8 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
List<OfficeData> offices = null; List<OfficeData> offices = null;
if (officeId == null) { if (officeId == null) {
Boolean includeAllOffices = Boolean.TRUE; Boolean includeAllOffices = Boolean.TRUE;
offices = (List) this.officeReadPlatformService.retrieveAllOffices(includeAllOffices, new SearchParameters(null, null, null, offices = (List) this.officeReadPlatformService.retrieveAllOffices(includeAllOffices,
null, null, null, null, null, null, "id", "asc", null, null, null, null, null, null)); new SearchParameters(null, null, null, null, null, null, null, null, "id", "asc", null, null, null, null, null, null));
} else { } else {
offices = new ArrayList<>(); offices = new ArrayList<>();
offices.add(this.officeReadPlatformService.retrieveOffice(officeId)); offices.add(this.officeReadPlatformService.retrieveOffice(officeId));
@@ -341,7 +341,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
if (officeId == null) { if (officeId == null) {
centers = (List<CenterData>) this.centerReadPlatformService.retrieveAll(null, null); centers = (List<CenterData>) this.centerReadPlatformService.retrieveAll(null, null);
} else { } else {
SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null); SearchParameters searchParameters = SearchParameters.from(officeId, null, null, null);
centers = (List<CenterData>) centerReadPlatformService.retrieveAll(searchParameters, null); centers = (List<CenterData>) centerReadPlatformService.retrieveAll(searchParameters, null);
} }
@@ -359,7 +359,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
} }
} }
} else { } else {
SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null); SearchParameters searchParameters = SearchParameters.from(officeId, null, null, null);
Page<ClientData> clientDataPage = this.clientReadPlatformService.retrieveAll(searchParameters); Page<ClientData> clientDataPage = this.clientReadPlatformService.retrieveAll(searchParameters);
if (clientDataPage != null) { if (clientDataPage != null) {
clients = new ArrayList<>(); clients = new ArrayList<>();
@@ -420,7 +420,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
if (officeId == null) { if (officeId == null) {
groups = (List<GroupGeneralData>) this.groupReadPlatformService.retrieveAll(null, null); groups = (List<GroupGeneralData>) this.groupReadPlatformService.retrieveAll(null, null);
} else { } else {
SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null); SearchParameters searchParameters = SearchParameters.from(officeId, null, null, null);
groups = (List<GroupGeneralData>) groupReadPlatformService.retrieveAll(searchParameters, null); groups = (List<GroupGeneralData>) groupReadPlatformService.retrieveAll(searchParameters, null);
} }
@@ -448,7 +448,7 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
if (officeId == null) { if (officeId == null) {
loanAccounts = loanReadPlatformService.retrieveAll(null).getPageItems(); loanAccounts = loanReadPlatformService.retrieveAll(null).getPageItems();
} else { } else {
SearchParameters searchParameters = SearchParameters.from(null, officeId, null, null, null); SearchParameters searchParameters = SearchParameters.from(officeId, null, null, null);
loanAccounts = loanReadPlatformService.retrieveAll(searchParameters).getPageItems(); loanAccounts = loanReadPlatformService.retrieveAll(searchParameters).getPageItems();
} }
return loanAccounts; return loanAccounts;
@@ -488,12 +488,11 @@ public class BulkImportWorkbookPopulatorServiceImpl implements BulkImportWorkboo
private List<SavingsAccountData> fetchSavingsAccounts(Long officeId) { private List<SavingsAccountData> fetchSavingsAccounts(Long officeId) {
List<SavingsAccountData> savingsAccounts = null; List<SavingsAccountData> savingsAccounts = null;
String activeAccounts = "sa.status_enum = 300";
if (officeId != null) { if (officeId != null) {
SearchParameters searchParameters = SearchParameters.from(activeAccounts, officeId, null, null, null); SearchParameters searchParameters = SearchParameters.builder().officeId(officeId).status("300").build();
savingsAccounts = savingsAccountReadPlatformService.retrieveAll(searchParameters).getPageItems(); savingsAccounts = savingsAccountReadPlatformService.retrieveAll(searchParameters).getPageItems();
} else { } else {
SearchParameters searchParameters = SearchParameters.from(activeAccounts, null, null, null, null); SearchParameters searchParameters = SearchParameters.builder().status("300").build();
savingsAccounts = savingsAccountReadPlatformService.retrieveAll(searchParameters).getPageItems(); savingsAccounts = savingsAccountReadPlatformService.retrieveAll(searchParameters).getPageItems();
} }
return savingsAccounts; return savingsAccounts;
@@ -74,12 +74,11 @@ public class EmailApiResource {
@GET @GET
@Path("pendingEmail") @Path("pendingEmail")
public String retrievePendingEmail(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, public String retrievePendingEmail(@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
@QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
@QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forEmailCampaign(offset, limit, orderBy, sortOrder);
Collection<EmailData> emailMessages = readPlatformService.retrieveAllPending(searchParameters); Collection<EmailData> emailMessages = readPlatformService.retrieveAllPending(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return toApiJsonSerializer.serialize(settings, emailMessages); return toApiJsonSerializer.serialize(settings, emailMessages);
@@ -87,13 +86,12 @@ public class EmailApiResource {
@GET @GET
@Path("sentEmail") @Path("sentEmail")
public String retrieveSentEmail(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, public String retrieveSentEmail(@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
@QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
@QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forEmailCampaign(offset, limit, orderBy, sortOrder);
Collection<EmailData> emailMessages = readPlatformService.retrieveAllSent(searchParameters); Collection<EmailData> emailMessages = readPlatformService.retrieveAllSent(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -133,7 +131,7 @@ public class EmailApiResource {
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forEmailCampaign(offset, limit, orderBy, sortOrder);
Collection<EmailData> emailMessages = readPlatformService.retrieveAllFailed(searchParameters); Collection<EmailData> emailMessages = readPlatformService.retrieveAllFailed(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -139,11 +139,10 @@ public class SmsCampaignApiResource {
smscampaigns""") smscampaigns""")
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SmsCampaignData.class))) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SmsCampaignData.class)))
public String retrieveAllEmails(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, public String retrieveAllEmails(@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
@QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
@QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME); platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
final SearchParameters searchParameters = SearchParameters.forSMSCampaign(sqlSearch, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forSMSCampaign(offset, limit, orderBy, sortOrder);
Page<SmsCampaignData> smsCampaignDataCollection = smsCampaignReadPlatformService.retrieveAll(searchParameters); Page<SmsCampaignData> smsCampaignDataCollection = smsCampaignReadPlatformService.retrieveAll(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return toApiJsonSerializer.serialize(settings, smsCampaignDataCollection); return toApiJsonSerializer.serialize(settings, smsCampaignDataCollection);
@@ -95,11 +95,11 @@ public class SmsApiResource {
public String retrieveAllSmsByStatus(@PathParam("campaignId") final Long campaignId, @Context final UriInfo uriInfo, public String retrieveAllSmsByStatus(@PathParam("campaignId") final Long campaignId, @Context final UriInfo uriInfo,
@QueryParam("status") final Long status, @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("status") final Long status, @QueryParam("fromDate") final DateParam fromDateParam,
@QueryParam("toDate") final DateParam toDateParam, @QueryParam("locale") final String locale, @QueryParam("toDate") final DateParam toDateParam, @QueryParam("locale") final String locale,
@QueryParam("dateFormat") final String rawDateFormat, @QueryParam("sqlSearch") final String sqlSearch, @QueryParam("dateFormat") final String rawDateFormat, @QueryParam("offset") final Integer offset,
@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
@QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { @QueryParam("sortOrder") final String sortOrder) {
context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions); context.authenticatedUser().validateHasReadPermission(resourceNameForPermissions);
final SearchParameters searchParameters = SearchParameters.forSMSCampaign(sqlSearch, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forSMSCampaign(offset, limit, orderBy, sortOrder);
final DateFormat dateFormat = StringUtils.isBlank(rawDateFormat) ? null : new DateFormat(rawDateFormat); final DateFormat dateFormat = StringUtils.isBlank(rawDateFormat) ? null : new DateFormat(rawDateFormat);
@@ -116,7 +116,6 @@ public class AccountTransfersApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = AccountTransfersApiResourceSwagger.GetAccountTransfersResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = AccountTransfersApiResourceSwagger.GetAccountTransfersResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(example = "limit") final Integer limit, @QueryParam("limit") @Parameter(example = "limit") final Integer limit,
@@ -126,8 +125,7 @@ public class AccountTransfersApiResource {
this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME); this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME);
final SearchParameters searchParameters = SearchParameters.forAccountTransfer(sqlSearch, externalId, offset, limit, orderBy, final SearchParameters searchParameters = SearchParameters.forAccountTransfer(externalId, offset, limit, orderBy, sortOrder);
sortOrder);
final Page<AccountTransferData> transfers = this.accountTransfersReadPlatformService.retrieveAll(searchParameters, accountDetailId); final Page<AccountTransferData> transfers = this.accountTransfersReadPlatformService.retrieveAll(searchParameters, accountDetailId);
@@ -169,7 +169,6 @@ public class StandingInstructionApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit, @QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@@ -183,8 +182,7 @@ public class StandingInstructionApiResource {
this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME); this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
final SearchParameters searchParameters = SearchParameters.forAccountTransfer(sqlSearch, externalId, offset, limit, orderBy, final SearchParameters searchParameters = SearchParameters.forAccountTransfer(externalId, offset, limit, orderBy, sortOrder);
sortOrder);
final LocalDate startDateRange = null; final LocalDate startDateRange = null;
final LocalDate endDateRange = null; final LocalDate endDateRange = null;
@@ -206,8 +204,7 @@ public class StandingInstructionApiResource {
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionApiResourceSwagger.GetStandingInstructionsStandingInstructionIdResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionApiResourceSwagger.GetStandingInstructionsStandingInstructionIdResponse.class))) })
public String retrieveOne( public String retrieveOne(
@PathParam("standingInstructionId") @Parameter(description = "standingInstructionId") final Long standingInstructionId, @PathParam("standingInstructionId") @Parameter(description = "standingInstructionId") final Long standingInstructionId,
@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch, @Context final UriInfo uriInfo, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit, @QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy, @QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
@@ -216,8 +213,7 @@ public class StandingInstructionApiResource {
this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME); this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
StandingInstructionData standingInstructionData = this.standingInstructionReadPlatformService.retrieveOne(standingInstructionId); StandingInstructionData standingInstructionData = this.standingInstructionReadPlatformService.retrieveOne(standingInstructionId);
final SearchParameters searchParameters = SearchParameters.forAccountTransfer(sqlSearch, externalId, offset, limit, orderBy, final SearchParameters searchParameters = SearchParameters.forAccountTransfer(externalId, offset, limit, orderBy, sortOrder);
sortOrder);
final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters()); final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters());
Page<AccountTransferData> transfers = null; Page<AccountTransferData> transfers = null;
if (!associationParameters.isEmpty()) { if (!associationParameters.isEmpty()) {
@@ -69,7 +69,6 @@ public class StandingInstructionHistoryApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionHistoryApiResourceSwagger.GetStandingInstructionRunHistoryResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StandingInstructionHistoryApiResourceSwagger.GetStandingInstructionRunHistoryResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit, @QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@@ -89,8 +88,7 @@ public class StandingInstructionHistoryApiResource {
final DateFormat dateFormat = StringUtils.isBlank(rawDateFormat) ? null : new DateFormat(rawDateFormat); final DateFormat dateFormat = StringUtils.isBlank(rawDateFormat) ? null : new DateFormat(rawDateFormat);
final SearchParameters searchParameters = SearchParameters.forAccountTransfer(sqlSearch, externalId, offset, limit, orderBy, final SearchParameters searchParameters = SearchParameters.forAccountTransfer(externalId, offset, limit, orderBy, sortOrder);
sortOrder);
LocalDate startDateRange = null; LocalDate startDateRange = null;
LocalDate endDateRange = null; LocalDate endDateRange = null;
if (fromDateParam != null) { if (fromDateParam != null) {
@@ -136,7 +136,6 @@ public class ClientsApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientsApiResourceSwagger.GetClientsResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = ClientsApiResourceSwagger.GetClientsResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("officeId") @Parameter(description = "officeId") final Long officeId, @QueryParam("officeId") @Parameter(description = "officeId") final Long officeId,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
@QueryParam("displayName") @Parameter(description = "displayName") final String displayName, @QueryParam("displayName") @Parameter(description = "displayName") final String displayName,
@@ -150,8 +149,8 @@ public class ClientsApiResource {
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder, @QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder,
@QueryParam("orphansOnly") @Parameter(description = "orphansOnly") final Boolean orphansOnly) { @QueryParam("orphansOnly") @Parameter(description = "orphansOnly") final Boolean orphansOnly) {
return retrieveAll(uriInfo, sqlSearch, officeId, externalId, displayName, firstname, lastname, status, hierarchy, offset, limit, return retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, hierarchy, offset, limit, orderBy,
orderBy, sortOrder, orphansOnly, false); sortOrder, orphansOnly, false);
} }
@GET @GET
@@ -440,13 +439,12 @@ public class ClientsApiResource {
return retrieveClientTransferTemplate(null, externalId); return retrieveClientTransferTemplate(null, externalId);
} }
public String retrieveAll(final UriInfo uriInfo, final String sqlSearch, final Long officeId, final String externalId, public String retrieveAll(final UriInfo uriInfo, final Long officeId, final String externalId, final String displayName,
final String displayName, final String firstname, final String lastname, final String status, final String hierarchy, final String firstname, final String lastname, final String status, final String hierarchy, final Integer offset,
final Integer offset, final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly, final Integer limit, final String orderBy, final String sortOrder, final Boolean orphansOnly, final boolean isSelfUser) {
final boolean isSelfUser) {
context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME); context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME);
final SearchParameters searchParameters = SearchParameters.forClients(sqlSearch, officeId, externalId, displayName, firstname, final SearchParameters searchParameters = SearchParameters.forClients(officeId, externalId, displayName, firstname, lastname,
lastname, status, hierarchy, offset, limit, orderBy, sortOrder, orphansOnly, isSelfUser); status, hierarchy, offset, limit, orderBy, sortOrder, orphansOnly, isSelfUser);
final Page<ClientData> clientData = clientReadPlatformService.retrieveAll(searchParameters); final Page<ClientData> clientData = clientReadPlatformService.retrieveAll(searchParameters);
final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return toApiJsonSerializer.serialize(settings, clientData, ClientApiConstants.CLIENT_RESPONSE_DATA_PARAMETERS); return toApiJsonSerializer.serialize(settings, clientData, ClientApiConstants.CLIENT_RESPONSE_DATA_PARAMETERS);
@@ -227,7 +227,6 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
private String buildSqlStringFromClientCriteria(String schemaSql, final SearchParameters searchParameters, List<Object> paramList) { private String buildSqlStringFromClientCriteria(String schemaSql, final SearchParameters searchParameters, List<Object> paramList) {
String sqlSearch = searchParameters.getSqlSearch();
final Long officeId = searchParameters.getOfficeId(); final Long officeId = searchParameters.getOfficeId();
final String externalId = searchParameters.getExternalId(); final String externalId = searchParameters.getExternalId();
final String displayName = searchParameters.getName(); final String displayName = searchParameters.getName();
@@ -236,13 +235,6 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
final String status = searchParameters.getStatus(); final String status = searchParameters.getStatus();
String extraCriteria = ""; String extraCriteria = "";
if (sqlSearch != null) {
sqlSearch = sqlSearch.replaceAll(" display_name ", " c.display_name ");
sqlSearch = sqlSearch.replaceAll("display_name ", "c.display_name ");
extraCriteria = " and (" + sqlSearch + ")";
this.columnValidator.validateSqlInjection(schemaSql, sqlSearch);
}
if (officeId != null) { if (officeId != null) {
extraCriteria += " and c.office_id = ? "; extraCriteria += " and c.office_id = ? ";
paramList.add(officeId); paramList.add(officeId);
@@ -465,19 +465,19 @@ public class LoansApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = LoansApiResourceSwagger.GetLoansResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = LoansApiResourceSwagger.GetLoansResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
// @QueryParam("underHierarchy") final String hierarchy, // @QueryParam("underHierarchy") final String hierarchy,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@QueryParam("limit") @Parameter(description = "limit") final Integer limit, @QueryParam("limit") @Parameter(description = "limit") final Integer limit,
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy, @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("accountNo") @Parameter(description = "accountNo") final String accountNo) { @QueryParam("accountNo") @Parameter(description = "accountNo") final String accountNo,
@QueryParam("status") @Parameter(description = "status") final String status) {
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS); this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
final SearchParameters searchParameters = SearchParameters.forLoans(sqlSearch, externalId, offset, limit, orderBy, sortOrder, final SearchParameters searchParameters = SearchParameters.builder().accountNo(accountNo).sortOrder(sortOrder)
accountNo); .externalId(externalId).offset(offset).limit(limit).orderBy(orderBy).status(status).build();
final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters); final Page<LoanAccountData> loanBasicDetails = this.loanReadPlatformService.retrieveAll(searchParameters);
@@ -55,7 +55,6 @@ import org.apache.fineract.infrastructure.core.service.SearchParameters;
import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.infrastructure.security.utils.ColumnValidator; import org.apache.fineract.infrastructure.security.utils.ColumnValidator;
import org.apache.fineract.infrastructure.security.utils.SQLInjectionValidator;
import org.apache.fineract.organisation.monetary.data.CurrencyData; import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency; import org.apache.fineract.organisation.monetary.domain.ApplicationCurrency;
import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper; import org.apache.fineract.organisation.monetary.domain.ApplicationCurrencyRepositoryWrapper;
@@ -313,7 +312,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
// TODO - for time being this will data scope list of loans returned to // TODO - for time being this will data scope list of loans returned to
// only loans that have a client associated. // only loans that have a client associated.
// to support senario where loan has group_id only OR client_id will // to support scenario where loan has group_id only OR client_id will
// probably require a UNION query // probably require a UNION query
// but that at present is an edge case // but that at present is an edge case
sqlBuilder.append(" join m_office o on (o.id = c.office_id or o.id = g.office_id) "); sqlBuilder.append(" join m_office o on (o.id = c.office_id or o.id = g.office_id) ");
@@ -327,12 +326,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
if (searchParameters != null) { if (searchParameters != null) {
String sqlQueryCriteria = searchParameters.getSqlSearch(); if (StringUtils.isNotBlank(searchParameters.getStatus())) {
if (StringUtils.isNotBlank(sqlQueryCriteria)) { sqlBuilder.append(" and l.loan_status_id = ?");
SQLInjectionValidator.validateSQLInput(sqlQueryCriteria); extraCriterias.add(Integer.parseInt(searchParameters.getStatus()));
sqlQueryCriteria = sqlQueryCriteria.replace("accountNo", "l.account_no"); arrayPos = arrayPos + 1;
this.columnValidator.validateSqlInjection(sqlBuilder.toString(), sqlQueryCriteria);
sqlBuilder.append(" and (").append(sqlQueryCriteria).append(")");
} }
if (StringUtils.isNotBlank(searchParameters.getExternalId())) { if (StringUtils.isNotBlank(searchParameters.getExternalId())) {
@@ -125,7 +125,6 @@ public class SavingsAccountsApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SavingsAccountsApiResourceSwagger.GetSavingsAccountsResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SavingsAccountsApiResourceSwagger.GetSavingsAccountsResponse.class))) })
public String retrieveAll(@Context final UriInfo uriInfo, public String retrieveAll(@Context final UriInfo uriInfo,
@QueryParam("sqlSearch") @Parameter(description = "sqlSearch") final String sqlSearch,
@QueryParam("externalId") @Parameter(description = "externalId") final String externalId, @QueryParam("externalId") @Parameter(description = "externalId") final String externalId,
// @QueryParam("underHierarchy") final String hierarchy, // @QueryParam("underHierarchy") final String hierarchy,
@QueryParam("offset") @Parameter(description = "offset") final Integer offset, @QueryParam("offset") @Parameter(description = "offset") final Integer offset,
@@ -135,7 +134,7 @@ public class SavingsAccountsApiResource {
context.authenticatedUser().validateHasReadPermission(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME); context.authenticatedUser().validateHasReadPermission(SavingsApiConstants.SAVINGS_ACCOUNT_RESOURCE_NAME);
final SearchParameters searchParameters = SearchParameters.forSavings(sqlSearch, externalId, offset, limit, orderBy, sortOrder); final SearchParameters searchParameters = SearchParameters.forSavings(externalId, offset, limit, orderBy, sortOrder);
final Page<SavingsAccountData> products = savingsAccountReadPlatformService.retrieveAll(searchParameters); final Page<SavingsAccountData> products = savingsAccountReadPlatformService.retrieveAll(searchParameters);
@@ -200,11 +200,11 @@ public class SavingsAccountReadPlatformServiceImpl implements SavingsAccountRead
objectArray[0] = hierarchySearchString; objectArray[0] = hierarchySearchString;
int arrayPos = 1; int arrayPos = 1;
if (searchParameters != null) { if (searchParameters != null) {
String sqlQueryCriteria = searchParameters.getSqlSearch();
if (StringUtils.isNotBlank(sqlQueryCriteria)) { if (StringUtils.isNotBlank(searchParameters.getStatus())) {
sqlQueryCriteria = sqlQueryCriteria.replaceAll("accountNo", "sa.account_no"); sqlBuilder.append(" and sa.status_enum = ?");
this.columnValidator.validateSqlInjection(sqlBuilder.toString(), sqlQueryCriteria); objectArray[arrayPos] = Integer.parseInt(searchParameters.getStatus());
sqlBuilder.append(" and (").append(sqlQueryCriteria).append(")"); arrayPos = arrayPos + 1;
} }
if (StringUtils.isNotBlank(searchParameters.getExternalId())) { if (StringUtils.isNotBlank(searchParameters.getExternalId())) {
@@ -90,13 +90,12 @@ public class SelfClientsApiResource {
@QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy, @QueryParam("orderBy") @Parameter(description = "orderBy") final String orderBy,
@QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) { @QueryParam("sortOrder") @Parameter(description = "sortOrder") final String sortOrder) {
final String sqlSearch = null;
final Long officeId = null; final Long officeId = null;
final String externalId = null; final String externalId = null;
final String hierarchy = null; final String hierarchy = null;
final Boolean orphansOnly = null; final Boolean orphansOnly = null;
return this.clientApiResource.retrieveAll(uriInfo, sqlSearch, officeId, externalId, displayName, firstname, lastname, status, return this.clientApiResource.retrieveAll(uriInfo, officeId, externalId, displayName, firstname, lastname, status, hierarchy,
hierarchy, offset, limit, orderBy, sortOrder, orphansOnly, true); offset, limit, orderBy, sortOrder, orphansOnly, true);
} }
@GET @GET
@@ -62,7 +62,7 @@ public class ClientTest extends IntegrationTest {
Optional<Long> retrieveFirst() { Optional<Long> retrieveFirst() {
GetClientsResponse clients = ok( GetClientsResponse clients = ok(
fineract().clients.retrieveAll21(null, null, null, null, null, null, null, null, 0, 1, null, null, false)); fineract().clients.retrieveAll21(null, null, null, null, null, null, null, 0, 1, null, null, false));
if (clients.getTotalFilteredRecords() != null && clients.getTotalFilteredRecords() > 0) { if (clients.getTotalFilteredRecords() != null && clients.getTotalFilteredRecords() > 0) {
return clients.getPageItems().stream().findFirst().map(item -> item.getId()); return clients.getPageItems().stream().findFirst().map(item -> item.getId());
} }