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 30543fd72e FINERACT-2169: Refactor client address controller;
30543fd72e is described below

commit 30543fd72e8e986a7bc8270f00f6fbd96a3dddf3
Author: viktorpavlenko <[email protected]>
AuthorDate: Wed Apr 9 16:38:17 2025 +0300

    FINERACT-2169: Refactor client address controller;
---
 .../infrastructure/core/component/FetcherRule.java | 27 +++----
 .../portfolio/address/data/AddressData.java        |  2 +
 .../test/stepdef/common/ClientStepDef.java         | 10 +--
 .../ClientAddressSearchParam.java}                 | 34 +++++----
 .../service/AddressReadPlatformService.java        | 15 ++--
 .../service/AddressReadPlatformServiceImpl.java    | 46 +++++++-----
 .../client/api/ClientAddressApiResource.java       | 84 ++++++----------------
 .../api/ClientAddressApiResourcesSwagger.java      | 81 ---------------------
 .../client/api/ClientsApiResourceSwagger.java      |  3 +-
 .../client/data/ClientAddressRequest.java          | 52 ++++++++++++++
 .../fineract/integrationtests/ClientTest.java      | 23 +++---
 .../integrationtests/common/ClientHelper.java      | 12 ++--
 12 files changed, 165 insertions(+), 224 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/component/FetcherRule.java
similarity index 56%
copy from 
fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
copy to 
fineract-core/src/main/java/org/apache/fineract/infrastructure/core/component/FetcherRule.java
index cc9b22d38a..746d885316 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/component/FetcherRule.java
@@ -16,22 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.portfolio.address.service;
+package org.apache.fineract.infrastructure.core.component;
 
-import java.util.Collection;
-import org.apache.fineract.portfolio.address.data.AddressData;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import lombok.RequiredArgsConstructor;
 
-public interface AddressReadPlatformService {
+@RequiredArgsConstructor
+public class FetcherRule<P, R> {
 
-    Collection<AddressData> retrieveAddressFields(long clientid);
+    private final Predicate<P> condition;
+    private final Function<P, R> action;
 
-    Collection<AddressData> retrieveAllClientAddress(long clientid);
+    public boolean matches(P params) {
+        return condition.test(params);
+    }
 
-    Collection<AddressData> retrieveAddressbyType(long clientid, long typeid);
-
-    Collection<AddressData> retrieveAddressbyTypeAndStatus(long clientid, long 
typeid, String status);
-
-    Collection<AddressData> retrieveAddressbyStatus(long clientid, String 
status);
-
-    AddressData retrieveTemplate();
+    public R execute(P params) {
+        return action.apply(params);
+    }
 }
diff --git 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java
 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java
index 4742b5608a..8e96cacc90 100644
--- 
a/fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/portfolio/address/data/AddressData.java
@@ -22,8 +22,10 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.Collection;
+import lombok.Getter;
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
 
+@Getter
 @SuppressWarnings("unused")
 public class AddressData implements Serializable {
 
diff --git 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/ClientStepDef.java
 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/ClientStepDef.java
index 7777afb81d..622d43e69f 100644
--- 
a/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/ClientStepDef.java
+++ 
b/fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/common/ClientStepDef.java
@@ -23,8 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import io.cucumber.java.en.Then;
 import io.cucumber.java.en.When;
 import java.io.IOException;
-import java.util.Arrays;
-import org.apache.fineract.client.models.PostClientsAddressRequest;
+import java.util.Collections;
+import org.apache.fineract.client.models.ClientAddressRequest;
 import org.apache.fineract.client.models.PostClientsRequest;
 import org.apache.fineract.client.models.PostClientsResponse;
 import org.apache.fineract.client.services.ClientApi;
@@ -92,13 +92,13 @@ public class ClientStepDef extends AbstractStepDef {
         Long stateId = 
codeHelper.createStateCodeValue(Utils.randomNameGenerator("Budapest", 
4)).body().getResourceId();
         String city = "Budapest";
         boolean addressIsActive = true;
-        long postalCode = 1000L;
+        String postalCode = "1000";
 
-        PostClientsAddressRequest addressRequest = new 
PostClientsAddressRequest().postalCode(postalCode).city(city).countryId(countryId)
+        ClientAddressRequest addressRequest = new 
ClientAddressRequest().postalCode(postalCode).city(city).countryId(countryId)
                 
.stateProvinceId(stateId).addressTypeId(addressTypeId).isActive(addressIsActive);
 
         PostClientsRequest clientsRequest = 
clientRequestFactory.defaultClientCreationRequest().firstname(firstName).lastname(lastName)
-                .address(Arrays.asList(addressRequest));
+                .address(Collections.singletonList(addressRequest));
 
         Response<PostClientsResponse> response = 
clientApi.create6(clientsRequest).execute();
         ErrorHelper.checkSuccessfulApiCall(response);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/filter/ClientAddressSearchParam.java
similarity index 56%
copy from 
fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/portfolio/address/filter/ClientAddressSearchParam.java
index cc9b22d38a..5fb3990838 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/filter/ClientAddressSearchParam.java
@@ -16,22 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.portfolio.address.service;
-
-import java.util.Collection;
-import org.apache.fineract.portfolio.address.data.AddressData;
-
-public interface AddressReadPlatformService {
-
-    Collection<AddressData> retrieveAddressFields(long clientid);
-
-    Collection<AddressData> retrieveAllClientAddress(long clientid);
-
-    Collection<AddressData> retrieveAddressbyType(long clientid, long typeid);
-
-    Collection<AddressData> retrieveAddressbyTypeAndStatus(long clientid, long 
typeid, String status);
-
-    Collection<AddressData> retrieveAddressbyStatus(long clientid, String 
status);
-
-    AddressData retrieveTemplate();
+package org.apache.fineract.portfolio.address.filter;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.FieldNameConstants;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@FieldNameConstants
+public class ClientAddressSearchParam {
+
+    private Long clientId;
+    private Long addressTypeId;
+    private String status;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
index cc9b22d38a..49cf27eabc 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java
@@ -18,20 +18,23 @@
  */
 package org.apache.fineract.portfolio.address.service;
 
-import java.util.Collection;
+import java.util.List;
 import org.apache.fineract.portfolio.address.data.AddressData;
+import org.apache.fineract.portfolio.address.filter.ClientAddressSearchParam;
 
 public interface AddressReadPlatformService {
 
-    Collection<AddressData> retrieveAddressFields(long clientid);
+    List<AddressData> retrieveAddressFields(long clientid);
 
-    Collection<AddressData> retrieveAllClientAddress(long clientid);
+    List<AddressData> retrieveAllClientAddress(long clientid);
 
-    Collection<AddressData> retrieveAddressbyType(long clientid, long typeid);
+    List<AddressData> retrieveAddressbyType(long clientid, long typeid);
 
-    Collection<AddressData> retrieveAddressbyTypeAndStatus(long clientid, long 
typeid, String status);
+    List<AddressData> retrieveAddressbyTypeAndStatus(long clientid, long 
typeid, String status);
 
-    Collection<AddressData> retrieveAddressbyStatus(long clientid, String 
status);
+    List<AddressData> retrieveAddressbyStatus(long clientid, String status);
+
+    List<AddressData> retrieveBySearchParam(ClientAddressSearchParam 
searchFilter);
 
     AddressData retrieveTemplate();
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java
index 5e0a60f4df..249d60c1cc 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java
@@ -23,33 +23,26 @@ import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.infrastructure.codes.data.CodeValueData;
 import 
org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService;
+import org.apache.fineract.infrastructure.core.component.FetcherRule;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.address.data.AddressData;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.fineract.portfolio.address.filter.ClientAddressSearchParam;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Service;
 
 @Service
+@RequiredArgsConstructor
 public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformService {
 
     private final JdbcTemplate jdbcTemplate;
     private final PlatformSecurityContext context;
     private final CodeValueReadPlatformService readService;
 
-    @Autowired
-    public AddressReadPlatformServiceImpl(final PlatformSecurityContext 
context, final JdbcTemplate jdbcTemplate,
-            final CodeValueReadPlatformService readService) {
-        this.context = context;
-        this.jdbcTemplate = jdbcTemplate;
-        this.readService = readService;
-    }
-
     private static final class AddFieldsMapper implements 
RowMapper<AddressData> {
 
         public String schema() {
@@ -178,7 +171,7 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
     }
 
     @Override
-    public Collection<AddressData> retrieveAddressFields(final long clientid) {
+    public List<AddressData> retrieveAddressFields(final long clientid) {
         this.context.authenticatedUser();
 
         final AddFieldsMapper rm = new AddFieldsMapper();
@@ -188,7 +181,7 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
     }
 
     @Override
-    public Collection<AddressData> retrieveAllClientAddress(final long 
clientid) {
+    public List<AddressData> retrieveAllClientAddress(final long clientid) {
         this.context.authenticatedUser();
         final AddMapper rm = new AddMapper();
         final String sql = "select " + rm.schema() + " and ca.client_id=?";
@@ -196,7 +189,7 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
     }
 
     @Override
-    public Collection<AddressData> retrieveAddressbyType(final long clientid, 
final long typeid) {
+    public List<AddressData> retrieveAddressbyType(final long clientid, final 
long typeid) {
         this.context.authenticatedUser();
 
         final AddMapper rm = new AddMapper();
@@ -206,7 +199,7 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
     }
 
     @Override
-    public Collection<AddressData> retrieveAddressbyTypeAndStatus(final long 
clientid, final long typeid, final String status) {
+    public List<AddressData> retrieveAddressbyTypeAndStatus(final long 
clientid, final long typeid, final String status) {
         this.context.authenticatedUser();
         boolean temp = Boolean.parseBoolean(status);
 
@@ -217,7 +210,7 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
     }
 
     @Override
-    public Collection<AddressData> retrieveAddressbyStatus(final long 
clientid, final String status) {
+    public List<AddressData> retrieveAddressbyStatus(final long clientid, 
final String status) {
         this.context.authenticatedUser();
         boolean temp = Boolean.parseBoolean(status);
 
@@ -227,14 +220,29 @@ public class AddressReadPlatformServiceImpl implements 
AddressReadPlatformServic
         return this.jdbcTemplate.query(sql, rm, new Object[] { clientid, temp 
}); // NOSONAR
     }
 
+    @Override
+    public List<AddressData> retrieveBySearchParam(ClientAddressSearchParam 
params) {
+        return getFilterRules().stream().filter(rule -> 
rule.matches(params)).map(r -> r.execute(params)).findFirst()
+                .orElse(retrieveAddressbyStatus(params.getClientId(), 
params.getStatus()));
+    }
+
     @Override
     public AddressData retrieveTemplate() {
-        final List<CodeValueData> countryoptions = new 
ArrayList<>(this.readService.retrieveCodeValuesByCode("COUNTRY"));
+        final List<CodeValueData> countryoptions = 
this.readService.retrieveCodeValuesByCode("COUNTRY");
 
-        final List<CodeValueData> StateOptions = new 
ArrayList<>(this.readService.retrieveCodeValuesByCode("STATE"));
+        final List<CodeValueData> StateOptions = 
this.readService.retrieveCodeValuesByCode("STATE");
 
-        final List<CodeValueData> addressTypeOptions = new 
ArrayList<>(this.readService.retrieveCodeValuesByCode("ADDRESS_TYPE"));
+        final List<CodeValueData> addressTypeOptions = 
this.readService.retrieveCodeValuesByCode("ADDRESS_TYPE");
 
         return AddressData.template(countryoptions, StateOptions, 
addressTypeOptions);
     }
+
+    private List<FetcherRule<ClientAddressSearchParam, List<AddressData>>> 
getFilterRules() {
+        return List.of(
+                new FetcherRule<>(p -> p.getAddressTypeId() == 0 && 
p.getStatus() == null, p -> retrieveAllClientAddress(p.getClientId())),
+                new FetcherRule<>(p -> p.getAddressTypeId() != 0 && 
p.getStatus() == null,
+                        p -> retrieveAddressbyType(p.getClientId(), 
p.getAddressTypeId())),
+                new FetcherRule<>(p -> p.getAddressTypeId() != 0 && 
p.getStatus() != null,
+                        p -> retrieveAddressbyTypeAndStatus(p.getClientId(), 
p.getAddressTypeId(), p.getStatus())));
+    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResource.java
index 01f4d964cb..b496f06915 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResource.java
@@ -20,7 +20,6 @@ package org.apache.fineract.portfolio.client.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.parameters.RequestBody;
@@ -35,24 +34,19 @@ import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.UriInfo;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.List;
 import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import 
org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
-import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import 
org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import 
org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.address.data.AddressData;
+import org.apache.fineract.portfolio.address.filter.ClientAddressSearchParam;
 import 
org.apache.fineract.portfolio.address.service.AddressReadPlatformServiceImpl;
+import org.apache.fineract.portfolio.client.data.ClientAddressRequest;
 import org.springframework.stereotype.Component;
 
 @Path("/v1/client")
@@ -61,29 +55,19 @@ import org.springframework.stereotype.Component;
 @RequiredArgsConstructor
 public class ClientAddressApiResource {
 
-    private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(
-            Arrays.asList("addressId", "street", "addressLine1", 
"addressLine2", "addressLine3", "townVillage", "city", "countyDistrict",
-                    "stateProvinceId", "countryId", "postalCode", "latitude", 
"longitude", "createdBy", "createdOn", "updatedBy",
-                    "updatedOn", "clientAddressId", "client_id", "address_id", 
"address_type_id", "isActive", "fieldConfigurationId",
-                    "entity", "table", "field", "is_enabled", "is_mandatory", 
"validation_regex"));
     private static final String RESOURCE_NAME_FOR_PERMISSIONS = "Address";
     private final PlatformSecurityContext context;
     private final AddressReadPlatformServiceImpl readPlatformService;
     private final DefaultToApiJsonSerializer<AddressData> toApiJsonSerializer;
-    private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
 
     @GET
     @Path("addresses/template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String getAddressesTemplate(@Context final UriInfo uriInfo) {
-        
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-
-        final AddressData template = 
this.readPlatformService.retrieveTemplate();
-
-        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.toApiJsonSerializer.serialize(settings, template, 
RESPONSE_DATA_PARAMETERS);
+    public AddressData getAddressesTemplate() {
+        
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
+        return readPlatformService.retrieveTemplate();
 
     }
 
@@ -92,19 +76,16 @@ public class ClientAddressApiResource {
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "Create an address for a Client", description = 
"Mandatory Fields : \n" + "type and clientId")
-    @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = 
ClientAddressApiResourcesSwagger.PostClientClientIdAddressesRequest.class)))
+    @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = ClientAddressRequest.class)))
     @ApiResponses({
             @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = 
ClientAddressApiResourcesSwagger.PostClientClientIdAddressesResponse.class))) })
-    public String addClientAddress(@QueryParam("type") @Parameter(description 
= "type") final long addressTypeId,
+    public CommandProcessingResult addClientAddress(@QueryParam("type") 
@Parameter(description = "type") final long addressTypeId,
             @PathParam("clientid") @Parameter(description = "clientId") final 
long clientid,
-            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
-
+            @Parameter(hidden = true) ClientAddressRequest 
clientAddressRequest) {
         final CommandWrapper commandRequest = new 
CommandWrapperBuilder().addClientAddress(clientid, addressTypeId)
-                .withJson(apiRequestBodyAsJson).build();
+                
.withJson(toApiJsonSerializer.serialize(clientAddressRequest)).build();
 
-        final CommandProcessingResult result = 
this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
-
-        return this.toApiJsonSerializer.serialize(result);
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
     @GET
@@ -113,30 +94,11 @@ public class ClientAddressApiResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "List all addresses for a Client", description = 
"Example Requests:\n" + "\n" + "client/1/addresses\n" + "\n"
             + "\n" + "clients/1/addresses?status=false,true&&type=1,2,3")
-    @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(array = @ArraySchema(schema = @Schema(implementation = 
ClientAddressApiResourcesSwagger.GetClientClientIdAddressesResponse.class)))) })
-    public String getAddresses(@QueryParam("status") @Parameter(description = 
"status") final String status,
+    public List<AddressData> getAddresses(@QueryParam("status") 
@Parameter(description = "status") final String status,
             @QueryParam("type") @Parameter(description = "type") final long 
addressTypeId,
-            @PathParam("clientid") @Parameter(description = "clientId") final 
long clientid, @Context final UriInfo uriInfo) {
-        Collection<AddressData> address;
-
-        
this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-
-        // TODO: This is quite a confusing implementation with all these checks
-        // These have to be considered as filtering criterias instead
-        if (addressTypeId == 0 && status == null) {
-            address = 
this.readPlatformService.retrieveAllClientAddress(clientid);
-        } else if (addressTypeId != 0 && status == null) {
-            address = this.readPlatformService.retrieveAddressbyType(clientid, 
addressTypeId);
-        } else if (addressTypeId != 0 && status != null) {
-            address = 
this.readPlatformService.retrieveAddressbyTypeAndStatus(clientid, 
addressTypeId, status);
-        } else {
-            address = 
this.readPlatformService.retrieveAddressbyStatus(clientid, status);
-        }
-
-        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.toApiJsonSerializer.serialize(settings, address, 
RESPONSE_DATA_PARAMETERS);
-
+            @PathParam("clientid") @Parameter(description = "clientId") final 
long clientid) {
+        
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
+        return readPlatformService.retrieveBySearchParam(new 
ClientAddressSearchParam(clientid, addressTypeId, status));
     }
 
     @PUT
@@ -145,18 +107,14 @@ public class ClientAddressApiResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "Update an address for a Client", description = "All 
the address fields can be updated by using update client address API\n"
             + "\n" + "Mandatory Fields\n" + "type and addressId")
-    @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = 
ClientAddressApiResourcesSwagger.PutClientClientIdAddressesRequest.class)))
+    @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = ClientAddressRequest.class)))
     @ApiResponses(value = {
             @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = 
ClientAddressApiResourcesSwagger.PutClientClientIdAddressesResponse.class))) })
-    public String updateClientAddress(@PathParam("clientid") 
@Parameter(description = "clientId") final long clientid,
-            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
+    public CommandProcessingResult updateClientAddress(@PathParam("clientid") 
@Parameter(description = "clientId") final long clientid,
+            @Parameter(hidden = true) ClientAddressRequest 
clientAddressRequest) {
 
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateClientAddress(clientid).withJson(apiRequestBodyAsJson)
-                .build();
-
-        final CommandProcessingResult result = 
this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
-
-        return this.toApiJsonSerializer.serialize(result);
+        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateClientAddress(clientid)
+                
.withJson(toApiJsonSerializer.serialize(clientAddressRequest)).build();
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
-
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
index 5b557fc0a4..2bb2d1832a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
@@ -28,31 +28,6 @@ final class ClientAddressApiResourcesSwagger {
 
     private ClientAddressApiResourcesSwagger() {}
 
-    @Schema(description = "PostClientClientIdAddressesRequest")
-    public static final class PostClientClientIdAddressesRequest {
-
-        private PostClientClientIdAddressesRequest() {}
-
-        @Schema(example = "Ipca")
-        public String street;
-        @Schema(example = "Kandivali")
-        public String addressLine1;
-        @Schema(example = "plot47")
-        public String addressLine2;
-        @Schema(example = "charkop")
-        public String addressLine3;
-        @Schema(example = "Mumbai")
-        public String city;
-        @Schema(example = "800")
-        public Long stateProvinceId;
-        @Schema(example = "802")
-        public Long countryId;
-        @Schema(example = "400064")
-        public Long postalCode;
-        @Schema(example = "true")
-        public Boolean isActive;
-    }
-
     @Schema(description = "PostClientClientIdAddressesResponse")
     public static final class PostClientClientIdAddressesResponse {
 
@@ -62,62 +37,6 @@ final class ClientAddressApiResourcesSwagger {
         public Long resourceId;
     }
 
-    @Schema(description = "GetClientClientIdAddressesResponse")
-    public static final class GetClientClientIdAddressesResponse {
-
-        private GetClientClientIdAddressesResponse() {}
-
-        @Schema(example = "111755")
-        public Long client_id;
-        @Schema(example = "PERMANENT ADDRESS")
-        public String addressType;
-        @Schema(example = "14")
-        public Long addressId;
-        @Schema(example = "804")
-        public Long addressTypeId;
-        @Schema(example = "false")
-        public Boolean isActive;
-        @Schema(example = "anki's home")
-        public String street;
-        @Schema(example = "test123")
-        public String addressLine1;
-        @Schema(example = "iuyt")
-        public String addressLine2;
-        @Schema(example = " ")
-        public String addressLine3;
-        @Schema(example = " ")
-        public String townVillage;
-        @Schema(example = "mumbai")
-        public String city;
-        @Schema(example = " ")
-        public String countyDistrict;
-        @Schema(example = "801")
-        public Long stateProvinceId;
-        @Schema(example = "UNITED STATES")
-        public String countryName;
-        @Schema(example = "GUJRAT")
-        public String stateName;
-        @Schema(example = "807")
-        public Long countryId;
-        @Schema(example = "400095")
-        public Long postalCode;
-        @Schema(example = " ")
-        public String createdBy;
-        @Schema(example = " ")
-        public String updatedBy;
-    }
-
-    @Schema(description = "PutClientClientIdAddressesRequest")
-    public static final class PutClientClientIdAddressesRequest {
-
-        private PutClientClientIdAddressesRequest() {}
-
-        @Schema(example = "67")
-        public Long addressId;
-        @Schema(example = "goldensource")
-        public String street;
-    }
-
     @Schema(description = "PutClientClientIdAddressesResponse")
     public static final class PutClientClientIdAddressesResponse {
 
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
index b93d6612cf..7ab477c006 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
@@ -23,6 +23,7 @@ import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
+import org.apache.fineract.portfolio.client.data.ClientAddressRequest;
 
 /**
  * Created by Chirag Gupta on 01/13/18.
@@ -327,7 +328,7 @@ final class ClientsApiResourceSwagger {
         @Schema(description = "List of PostClientsDatatable")
         public List<PostClientsDatatable> datatables;
         @Schema(description = "Address requests")
-        public List<PostClientsAddressRequest> address;
+        public List<ClientAddressRequest> address;
         @Schema(example = "[email protected]")
         public String emailAddress;
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientAddressRequest.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientAddressRequest.java
new file mode 100644
index 0000000000..5df556aa99
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientAddressRequest.java
@@ -0,0 +1,52 @@
+/**
+ * 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.portfolio.client.data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class ClientAddressRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String city;
+    private Long countryId;
+    private Boolean isActive;
+    private String postalCode;
+    private Long addressTypeId;
+    private String addressLine1;
+    private String addressLine2;
+    private String addressLine3;
+    private String townVillage;
+    private String countyDistrict;
+    private Long stateProvinceId;
+    private BigDecimal latitude;
+    private BigDecimal longitude;
+    private String createdBy;
+    private String createdOn;
+    private String updatedBy;
+    private String updatedOn;
+    private Long addressId;
+}
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java
index 1a992c812a..7e44cbfc3a 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java
@@ -35,12 +35,11 @@ import java.security.SecureRandom;
 import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
-import org.apache.fineract.client.models.GetClientClientIdAddressesResponse;
+import org.apache.fineract.client.models.AddressData;
+import org.apache.fineract.client.models.ClientAddressRequest;
 import org.apache.fineract.client.models.GetClientsClientIdResponse;
 import org.apache.fineract.client.models.GlobalConfigurationPropertyData;
-import org.apache.fineract.client.models.PostClientClientIdAddressesRequest;
 import org.apache.fineract.client.models.PostClientClientIdAddressesResponse;
-import org.apache.fineract.client.models.PostClientsAddressRequest;
 import org.apache.fineract.client.models.PostClientsRequest;
 import org.apache.fineract.client.models.PutGlobalConfigurationsRequest;
 import 
org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
@@ -218,10 +217,10 @@ public class ClientTest {
         Integer stateId = CodeHelper.createStateCodeValue(requestSpec, 
responseSpec, Utils.randomStringGenerator("Budapest", 4), 0);
         String city = "Budapest";
         boolean addressIsActive = true;
-        long postalCode = 1000L;
+        String postalCode = "1000";
 
         // when
-        PostClientsAddressRequest addressRequest = new 
PostClientsAddressRequest().postalCode(postalCode).city(city)
+        ClientAddressRequest addressRequest = new 
ClientAddressRequest().postalCode(postalCode).city(city)
                 
.countryId(Long.valueOf(countryId)).stateProvinceId(Long.valueOf(stateId)).addressTypeId(addressTypeId.longValue())
                 .isActive(addressIsActive);
         PostClientsRequest request = 
ClientHelper.defaultClientCreationRequest().address(List.of(addressRequest));
@@ -229,8 +228,8 @@ public class ClientTest {
 
         // then
         ClientHelper.verifyClientCreatedOnServer(requestSpec, responseSpec, 
clientId);
-        List<GetClientClientIdAddressesResponse> clientAddresses = 
ClientHelper.getClientAddresses(requestSpec, responseSpec, clientId);
-        GetClientClientIdAddressesResponse addressResponse = 
clientAddresses.get(0);
+        List<AddressData> clientAddresses = 
ClientHelper.getClientAddresses(requestSpec, responseSpec, clientId);
+        AddressData addressResponse = clientAddresses.get(0);
         assertThat(addressResponse.getCity()).isEqualTo(city);
         assertThat(addressResponse.getCountryId()).isEqualTo((long) countryId);
         assertThat(addressResponse.getStateProvinceId()).isEqualTo((long) 
stateId);
@@ -248,19 +247,19 @@ public class ClientTest {
         Integer stateId = CodeHelper.createStateCodeValue(requestSpec, 
responseSpec, Utils.randomStringGenerator("Budapest", 4), 0);
         String city = "Budapest";
         boolean addressIsActive = true;
-        long postalCode = 1000L;
+        String postalCode = "1000";
 
         PostClientsRequest clientRequest = 
ClientHelper.defaultClientCreationRequest();
         final Integer clientId = ClientHelper.createClient(requestSpec, 
responseSpec, clientRequest);
         // when
-        PostClientClientIdAddressesRequest request = new 
PostClientClientIdAddressesRequest().postalCode(postalCode).city(city)
-                
.countryId(Long.valueOf(countryId)).stateProvinceId(Long.valueOf(stateId)).isActive(addressIsActive);
+        ClientAddressRequest request = new 
ClientAddressRequest().postalCode(postalCode).city(city).countryId(Long.valueOf(countryId))
+                
.stateProvinceId(Long.valueOf(stateId)).isActive(addressIsActive);
         PostClientClientIdAddressesResponse response = 
ClientHelper.createClientAddress(requestSpec, responseSpec, 
clientId.longValue(),
                 addressTypeId, request);
         // then
         assertThat(response.getResourceId()).isNotNull();
-        List<GetClientClientIdAddressesResponse> clientAddresses = 
ClientHelper.getClientAddresses(requestSpec, responseSpec, clientId);
-        GetClientClientIdAddressesResponse addressResponse = 
clientAddresses.get(0);
+        List<AddressData> clientAddresses = 
ClientHelper.getClientAddresses(requestSpec, responseSpec, clientId);
+        AddressData addressResponse = clientAddresses.get(0);
         assertThat(addressResponse.getCity()).isEqualTo(city);
         assertThat(addressResponse.getCountryId()).isEqualTo((long) countryId);
         assertThat(addressResponse.getStateProvinceId()).isEqualTo((long) 
stateId);
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
index 0a1e7aaf99..7b573576fe 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java
@@ -38,9 +38,10 @@ import java.util.List;
 import java.util.UUID;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.fineract.client.models.AddressData;
+import org.apache.fineract.client.models.ClientAddressRequest;
 import org.apache.fineract.client.models.ClientTextSearch;
 import org.apache.fineract.client.models.DeleteClientsClientIdResponse;
-import org.apache.fineract.client.models.GetClientClientIdAddressesResponse;
 import org.apache.fineract.client.models.GetClientTransferProposalDateResponse;
 import org.apache.fineract.client.models.GetClientsClientIdAccountsResponse;
 import org.apache.fineract.client.models.GetClientsClientIdResponse;
@@ -50,7 +51,6 @@ import org.apache.fineract.client.models.GetObligeeData;
 import org.apache.fineract.client.models.LoanAccountLockResponseDTO;
 import org.apache.fineract.client.models.PageClientSearchData;
 import org.apache.fineract.client.models.PagedRequestClientTextSearch;
-import org.apache.fineract.client.models.PostClientClientIdAddressesRequest;
 import org.apache.fineract.client.models.PostClientClientIdAddressesResponse;
 import org.apache.fineract.client.models.PostClientsClientIdIdentifiersRequest;
 import 
org.apache.fineract.client.models.PostClientsClientIdIdentifiersResponse;
@@ -263,7 +263,7 @@ public class ClientHelper {
     // org.apache.fineract.client.models.PostLoansLoanIdRequest)
     @Deprecated(forRemoval = true)
     public static PostClientClientIdAddressesResponse 
createClientAddress(final RequestSpecification requestSpec,
-            final ResponseSpecification responseSpec, long clientId, long 
addressTypeId, PostClientClientIdAddressesRequest request) {
+            final ResponseSpecification responseSpec, long clientId, long 
addressTypeId, ClientAddressRequest request) {
         final String CREATE_CLIENT_ADDRESS_URL = 
"/fineract-provider/api/v1/client/" + clientId + "/addresses?type=" + 
addressTypeId + "&"
                 + Utils.TENANT_IDENTIFIER;
         log.info("---------------------------------CREATING A CLIENT ADDRESS 
---------------------------------------------");
@@ -659,12 +659,12 @@ public class ClientHelper {
     // Example: 
org.apache.fineract.integrationtests.common.loans.LoanTransactionHelper.disburseLoan(java.lang.Long,
     // org.apache.fineract.client.models.PostLoansLoanIdRequest)
     @Deprecated(forRemoval = true)
-    public static List<GetClientClientIdAddressesResponse> 
getClientAddresses(final RequestSpecification requestSpec,
-            final ResponseSpecification responseSpec, final int clientId) {
+    public static List<AddressData> getClientAddresses(final 
RequestSpecification requestSpec, final ResponseSpecification responseSpec,
+            final int clientId) {
         final String GET_CLIENT_ADDRESSES_URL = 
"/fineract-provider/api/v1/client/" + clientId + "/addresses?" + 
Utils.TENANT_IDENTIFIER;
         log.info("---------------------------------GET A CLIENT'S ADDRESSES 
---------------------------------------------");
         String clientResponseStr = Utils.performServerGet(requestSpec, 
responseSpec, GET_CLIENT_ADDRESSES_URL);
-        return GSON.fromJson(clientResponseStr, new 
TypeToken<List<GetClientClientIdAddressesResponse>>() {}.getType());
+        return GSON.fromJson(clientResponseStr, new 
TypeToken<List<AddressData>>() {}.getType());
     }
 
     // TODO: Rewrite to use fineract-client instead!


Reply via email to