Skip to content

Commit 5956214

Browse files
avivijay19vidakovic
authored andcommitted
FINERACT-2287: New command processing for search
1 parent 8694d5f commit 5956214

8 files changed

Lines changed: 219 additions & 471 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/portfolio/search/data/AdHocQueryDataValidator.java

Lines changed: 0 additions & 321 deletions
This file was deleted.

fineract-core/src/main/java/org/apache/fineract/portfolio/search/data/AdHocQuerySearchConstants.java

Lines changed: 0 additions & 61 deletions
This file was deleted.

fineract-core/src/main/java/org/apache/fineract/portfolio/search/data/SearchConditions.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ public class SearchConditions {
3131
private final Boolean shareSeach;
3232
private final Boolean clientIdentifierSearch;
3333
private Boolean exactMatch;
34+
private final String hierarchy;
3435

35-
public SearchConditions(final String searchQueryParam, final String searchResource, Boolean exactMatch) {
36+
public SearchConditions(final String searchQueryParam, final String searchResource, Boolean exactMatch, final String hierarchy) {
3637
this.searchQuery = searchQueryParam;
3738
this.searchResource = searchResource;
3839
this.exactMatch = exactMatch;
40+
this.hierarchy = hierarchy;
3941
this.clientSearch = null == searchResource
4042
|| searchResource.toLowerCase().contains(SearchSupportedResources.CLIENTS.name().toLowerCase());
4143
this.groupSearch = null == searchResource
@@ -52,7 +54,7 @@ public SearchConditions(final String searchQueryParam, final String searchResour
5254

5355
public SearchConditions(final String searchQueryParam, final String searchResource, final Boolean clientSearch,
5456
final Boolean groupSearch, final Boolean loanSeach, final Boolean savingSeach, final Boolean shareSeach,
55-
final Boolean clientIdentifierSearch, Boolean exactMatch) {
57+
final Boolean clientIdentifierSearch, Boolean exactMatch, final String hierarchy) {
5658
this.searchQuery = searchQueryParam;
5759
this.searchResource = searchResource;
5860
this.clientSearch = clientSearch;
@@ -62,6 +64,7 @@ public SearchConditions(final String searchQueryParam, final String searchResour
6264
this.shareSeach = shareSeach;
6365
this.clientIdentifierSearch = clientIdentifierSearch;
6466
this.exactMatch = exactMatch;
67+
this.hierarchy = hierarchy;
6568
}
6669

6770
public String getSearchQuery() {
@@ -100,4 +103,8 @@ public Boolean isClientIdentifierSearch() {
100103
return this.clientIdentifierSearch;
101104
}
102105

106+
public String getHierarchy() {
107+
return this.hierarchy;
108+
}
109+
103110
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/search/api/SearchApiResource.java

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -35,69 +35,79 @@
3535
import jakarta.ws.rs.QueryParam;
3636
import jakarta.ws.rs.core.MediaType;
3737
import java.util.List;
38-
import java.util.Set;
3938
import lombok.RequiredArgsConstructor;
40-
import org.apache.fineract.portfolio.search.SearchConstants.SearchResponseParameters;
41-
import org.apache.fineract.portfolio.search.data.AdHocQueryDataValidator;
42-
import org.apache.fineract.portfolio.search.data.AdHocQuerySearchConditions;
39+
import org.apache.fineract.portfolio.search.data.AdHocQuerySearchRequest;
4340
import org.apache.fineract.portfolio.search.data.AdHocSearchQueryData;
4441
import org.apache.fineract.portfolio.search.data.SearchConditions;
4542
import org.apache.fineract.portfolio.search.data.SearchData;
46-
import org.apache.fineract.portfolio.search.service.SearchReadPlatformService;
43+
import org.apache.fineract.portfolio.search.service.SearchReadService;
44+
import org.apache.fineract.useradministration.domain.AppUser;
45+
import org.springframework.security.core.context.SecurityContextHolder;
4746
import org.springframework.stereotype.Component;
4847

4948
@Path("/v1/search")
5049
@Component
5150
@Tag(name = "Search API", description = "Search API allows to search scoped resources clients, loans and groups on specified fields.")
5251
@RequiredArgsConstructor
52+
@Consumes({ MediaType.APPLICATION_JSON })
53+
@Produces({ MediaType.APPLICATION_JSON })
5354
public class SearchApiResource {
5455

55-
private static final Set<String> SEARCH_RESPONSE_PARAMETERS = SearchResponseParameters.getAllValues();
56-
57-
private final SearchReadPlatformService searchReadPlatformService;
58-
private final AdHocQueryDataValidator fromApiJsonDeserializer;
56+
private final SearchReadService searchReadService;
5957

6058
@GET
6159
@Path("/template")
62-
@Consumes({ MediaType.APPLICATION_JSON })
63-
@Produces({ MediaType.APPLICATION_JSON })
64-
@Operation(summary = "Retrive Adhoc Search query template", description = "Mandatory Fields\n" + "\n" + "search?query=000000001\n")
60+
@Operation(summary = "Retrive Adhoc Search query template", description = """
61+
Mandatory Fields
62+
63+
search?query=000000001
64+
""")
6565
public AdHocSearchQueryData retrieveAdHocSearchQueryTemplate() {
6666

67-
return this.searchReadPlatformService.retrieveAdHocQueryTemplate();
67+
return searchReadService.retrieveAdHocQueryTemplate();
6868
}
6969

7070
@GET
71-
@Consumes({ MediaType.APPLICATION_JSON })
72-
@Produces({ MediaType.APPLICATION_JSON })
73-
@Operation(summary = "Search Resources", description = "Example Requests:\n" + "\n" + "search?query=000000001\n" + "\n" + "\n"
74-
+ "search?query=Petra&resource=clients,groups\n" + "\n" + "\n" + "search?query=Petra&resource=clients,groups&exactMatch=true")
71+
@Operation(summary = "Search Resources", description = """
72+
Example Requests:
73+
74+
search?query=000000001
75+
76+
77+
search?query=Petra&resource=clients,groups
78+
79+
80+
search?query=Petra&resource=clients,groups&exactMatch=true""")
7581
@ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = SearchApiResourceSwagger.GetSearchResponse.class))))
7682
public List<SearchData> searchData(@QueryParam("query") @Parameter(description = "query") final String query,
7783
@QueryParam("resource") @Parameter(description = "resource") final String resource,
7884
@DefaultValue("false") @QueryParam("exactMatch") @Parameter(description = "exactMatch") Boolean exactMatch) {
7985

80-
final SearchConditions searchConditions = new SearchConditions(query, resource, exactMatch);
86+
final AppUser currentUser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
87+
final String hierarchy = currentUser.getOffice().getHierarchy();
88+
final SearchConditions searchConditions = new SearchConditions(query, resource, exactMatch, hierarchy);
8189

82-
return this.searchReadPlatformService.retriveMatchingData(searchConditions);
90+
return searchReadService.retriveMatchingData(searchConditions);
8391
}
8492

8593
@POST
8694
@Path("/advance")
87-
@Consumes({ MediaType.APPLICATION_JSON })
88-
@Produces({ MediaType.APPLICATION_JSON })
89-
@Operation(summary = "Adhoc query search", description = "AdHocQuery search has more search options, it is a POST request, it uses request body to send search parameters\n"
90-
+ "\n" + "\n" + "Mandatory fields:" + "entities" + "\n" + "\n" + "Optional fields:"
91-
+ "loanStatus, loanProducts, offices, loanDateOption, loanFromDate, loanToDate, \n"
92-
+ "includeOutStandingAmountPercentage, outStandingAmountPercentageCondition, \n"
93-
+ "minOutStandingAmountPercentage and maxOutStandingAmountPercentage OR outStandingAmountPercentage, \n"
94-
+ "includeOutstandingAmount, outstandingAmountCondition, \n"
95-
+ "minOutstandingAmount and maxOutstandingAmount OR outstandingAmount")
96-
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = SearchApiResourceSwagger.PostAdhocQuerySearchRequest.class)))
97-
public List<AdHocSearchQueryData> advancedSearch(final String json) {
95+
@Operation(summary = "Adhoc query search", description = """
96+
AdHocQuery search has more search options, it is a POST request, \
97+
it uses request body to send search parameters
98+
9899
99-
final AdHocQuerySearchConditions searchConditions = this.fromApiJsonDeserializer.retrieveSearchConditions(json);
100+
Mandatory fields: entities
101+
102+
Optional fields: \
103+
loanStatus, loanProducts, offices, loanDateOption, loanFromDate, loanToDate,
104+
includeOutStandingAmountPercentage, outStandingAmountPercentageCondition,
105+
minOutStandingAmountPercentage and maxOutStandingAmountPercentage OR outStandingAmountPercentage,
106+
includeOutstandingAmount, outstandingAmountCondition,
107+
minOutstandingAmount and maxOutstandingAmount OR outstandingAmount""")
108+
@RequestBody(required = true, content = @Content(schema = @Schema(implementation = SearchApiResourceSwagger.PostAdhocQuerySearchRequest.class)))
109+
public List<AdHocSearchQueryData> advancedSearch(final AdHocQuerySearchRequest request) {
100110

101-
return this.searchReadPlatformService.retrieveAdHocQueryMatchingData(searchConditions);
111+
return searchReadService.retrieveAdHocQueryMatchingData(request);
102112
}
103113
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.apache.fineract.portfolio.search.data;
20+
21+
import java.io.Serializable;
22+
import java.math.BigDecimal;
23+
import java.time.LocalDate;
24+
import java.util.List;
25+
import lombok.AllArgsConstructor;
26+
import lombok.Builder;
27+
import lombok.Data;
28+
import lombok.NoArgsConstructor;
29+
30+
@Data
31+
@Builder
32+
@NoArgsConstructor
33+
@AllArgsConstructor
34+
public class AdHocQuerySearchRequest implements Serializable {
35+
36+
private String locale;
37+
private String dateFormat;
38+
private List<String> entities;
39+
private List<String> loanStatus;
40+
private List<Long> loanProducts;
41+
private List<Long> offices;
42+
private String loanDateOption;
43+
private LocalDate loanFromDate;
44+
private LocalDate loanToDate;
45+
private Boolean includeOutStandingAmountPercentage;
46+
private String outStandingAmountPercentageCondition;
47+
private BigDecimal minOutStandingAmountPercentage;
48+
private BigDecimal maxOutStandingAmountPercentage;
49+
private BigDecimal outStandingAmountPercentage;
50+
private Boolean includeOutstandingAmount;
51+
private String outstandingAmountCondition;
52+
private BigDecimal minOutstandingAmount;
53+
private BigDecimal maxOutstandingAmount;
54+
private BigDecimal outstandingAmount;
55+
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/search/service/SearchReadPlatformService.java renamed to fineract-provider/src/main/java/org/apache/fineract/portfolio/search/service/SearchReadService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
package org.apache.fineract.portfolio.search.service;
2020

2121
import java.util.List;
22-
import org.apache.fineract.portfolio.search.data.AdHocQuerySearchConditions;
22+
import org.apache.fineract.portfolio.search.data.AdHocQuerySearchRequest;
2323
import org.apache.fineract.portfolio.search.data.AdHocSearchQueryData;
2424
import org.apache.fineract.portfolio.search.data.SearchConditions;
2525
import org.apache.fineract.portfolio.search.data.SearchData;
2626

27-
public interface SearchReadPlatformService {
27+
public interface SearchReadService {
2828

2929
List<SearchData> retriveMatchingData(SearchConditions searchConditions);
3030

3131
AdHocSearchQueryData retrieveAdHocQueryTemplate();
3232

33-
List<AdHocSearchQueryData> retrieveAdHocQueryMatchingData(AdHocQuerySearchConditions searchConditions);
33+
List<AdHocSearchQueryData> retrieveAdHocQueryMatchingData(AdHocQuerySearchRequest request);
3434
}

0 commit comments

Comments
 (0)