Skip to content

Commit 36a8bad

Browse files
committed
FINERACT-2165: migrate AuditHelper to Feign client
1 parent 347694a commit 36a8bad

7 files changed

Lines changed: 173 additions & 123 deletions

File tree

fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020

2121
import io.swagger.v3.oas.annotations.Operation;
2222
import io.swagger.v3.oas.annotations.Parameter;
23+
import io.swagger.v3.oas.annotations.media.Content;
24+
import io.swagger.v3.oas.annotations.media.Schema;
25+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
2326
import io.swagger.v3.oas.annotations.tags.Tag;
2427
import jakarta.ws.rs.BeanParam;
2528
import jakarta.ws.rs.GET;
@@ -66,6 +69,7 @@ public class AuditsApiResource {
6669
+ "\n" + "Example Requests:\n" + "\n" + "audits\n" + "\n" + "audits?fields=madeOnDate,maker,processingResult\n" + "\n"
6770
+ "audits?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n" + "audits?officeId=1\n" + "\n"
6871
+ "audits?officeId=1&includeJson=true")
72+
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = AuditsApiResourceSwagger.PageGetAuditsResponse.class)))
6973
public String retrieveAuditEntries(@Context final UriInfo uriInfo, @BeanParam AuditRequest auditRequest,
7074
@QueryParam("offset") @Parameter(description = "offset") final Integer offset,
7175
@QueryParam("limit") @Parameter(description = "limit") final Integer limit,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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.commands.api;
20+
21+
import io.swagger.v3.oas.annotations.media.Schema;
22+
import java.util.List;
23+
import org.apache.fineract.commands.data.AuditData;
24+
25+
final class AuditsApiResourceSwagger {
26+
27+
private AuditsApiResourceSwagger() {}
28+
29+
@Schema(description = "PageGetAuditsResponse")
30+
public static final class PageGetAuditsResponse {
31+
32+
private PageGetAuditsResponse() {}
33+
34+
@Schema(example = "1")
35+
public Integer totalFilteredRecords;
36+
public List<AuditData> pageItems;
37+
}
38+
}

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/InternalLoanInformationApiResource.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,23 @@ public void afterPropertiesSet() {
7272
@Path("{loanId}/audit")
7373
@Produces({ MediaType.APPLICATION_JSON })
7474
@SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT")
75-
public AuditData getLoanAuditFields(@Context final UriInfo uriInfo, @PathParam("loanId") Long loanId) {
75+
public LoanAuditFieldsData getLoanAuditFields(@Context final UriInfo uriInfo, @PathParam("loanId") Long loanId) {
7676
log.warn("------------------------------------------------------------");
7777
log.warn(" ");
7878
log.warn("Fetching loan with {}", loanId);
7979
log.warn(" ");
8080
log.warn("------------------------------------------------------------");
8181

8282
final Loan loan = loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
83-
return new AuditData(loan.getCreatedBy().orElse(null), loan.getCreatedDate().orElse(null), loan.getLastModifiedBy().orElse(null),
84-
loan.getLastModifiedDate().orElse(null));
83+
return new LoanAuditFieldsData(loan.getCreatedBy().orElse(null), loan.getCreatedDate().orElse(null),
84+
loan.getLastModifiedBy().orElse(null), loan.getLastModifiedDate().orElse(null));
8585
}
8686

8787
@GET
8888
@Path("{loanId}/transaction/{transactionId}/audit")
8989
@Produces({ MediaType.APPLICATION_JSON })
9090
@SuppressFBWarnings("SLF4J_SIGN_ONLY_FORMAT")
91-
public AuditData getLoanTransactionAuditFields(@Context final UriInfo uriInfo, @PathParam("loanId") Long loanId,
91+
public LoanAuditFieldsData getLoanTransactionAuditFields(@Context final UriInfo uriInfo, @PathParam("loanId") Long loanId,
9292
@PathParam("transactionId") Long transactionId) {
9393
log.warn("------------------------------------------------------------");
9494
log.warn(" ");
@@ -97,7 +97,7 @@ public AuditData getLoanTransactionAuditFields(@Context final UriInfo uriInfo, @
9797
log.warn("------------------------------------------------------------");
9898

9999
final LoanTransaction transaction = loanTransactionRepository.findById(transactionId).orElseThrow();
100-
return new AuditData(transaction.getCreatedBy().orElse(null), transaction.getCreatedDate().orElse(null),
100+
return new LoanAuditFieldsData(transaction.getCreatedBy().orElse(null), transaction.getCreatedDate().orElse(null),
101101
transaction.getLastModifiedBy().orElse(null), transaction.getLastModifiedDate().orElse(null));
102102
}
103103

@@ -145,6 +145,6 @@ public LocalDate getMaxTransactionDateOfActiveLoans() {
145145
return loanRepositoryWrapper.findMaxTransactionDateOfActiveLoans();
146146
}
147147

148-
private record AuditData(Long createdBy, OffsetDateTime createdDate, Long lastModifiedBy, OffsetDateTime lastModifiedDate) {
148+
private record LoanAuditFieldsData(Long createdBy, OffsetDateTime createdDate, Long lastModifiedBy, OffsetDateTime lastModifiedDate) {
149149
}
150150
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/AuditIntegrationTest.java

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
import io.restassured.specification.ResponseSpecification;
3131
import java.security.SecureRandom;
3232
import java.util.Arrays;
33-
import java.util.HashMap;
34-
import java.util.LinkedHashMap;
3533
import java.util.List;
34+
import org.apache.fineract.client.models.AuditData;
35+
import org.apache.fineract.client.models.AuditSearchData;
3636
import org.apache.fineract.integrationtests.common.AuditHelper;
3737
import org.apache.fineract.integrationtests.common.ClientHelper;
3838
import org.apache.fineract.integrationtests.common.OfficeHelper;
@@ -51,7 +51,6 @@ public class AuditIntegrationTest {
5151
private ResponseSpecification responseSpec;
5252
private RequestSpecification requestSpec;
5353
private ClientHelper clientHelper;
54-
private AuditHelper auditHelper;
5554
private SchedulerJobHelper schedulerJobHelper;
5655
private static final SecureRandom rand = new SecureRandom();
5756

@@ -65,7 +64,6 @@ public void setup() {
6564
this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
6665
this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
6766
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
68-
this.auditHelper = new AuditHelper(this.requestSpec, this.responseSpec);
6967
this.clientHelper = new ClientHelper(this.requestSpec, this.responseSpec);
7068
this.schedulerJobHelper = new SchedulerJobHelper(this.requestSpec);
7169
}
@@ -74,19 +72,17 @@ public void setup() {
7472
public void testAuditSearchTemplate() {
7573
// given
7674
// when
77-
LinkedHashMap auditSearchTemplate = this.auditHelper.getAuditSearchTemplate();
75+
AuditSearchData auditSearchTemplate = AuditHelper.getAuditSearchTemplate();
7876

7977
// then
8078
assertNotNull(auditSearchTemplate);
81-
assertEquals(4, auditSearchTemplate.size()); // appUsers, actionNames, entityNames, processingResults
82-
assertTrue(((List) auditSearchTemplate.get("actionNames")).size() > 0);
79+
assertTrue(auditSearchTemplate.getActionNames().size() > 0);
8380

8481
// verify all command processing status enum values are present and use enum_value (not enum_message_property)
85-
List<LinkedHashMap> statuses = (List<LinkedHashMap>) auditSearchTemplate.get("statuses");
86-
assertNotNull(statuses);
87-
assertEquals(6, statuses.size());
82+
assertNotNull(auditSearchTemplate.getStatuses());
83+
assertEquals(6, auditSearchTemplate.getStatuses().size());
8884

89-
List<String> statusValues = statuses.stream().map(r -> (String) r.get("processingResult"))
85+
List<String> statusValues = auditSearchTemplate.getStatuses().stream().map(r -> r.getProcessingResult())
9086
.collect(java.util.stream.Collectors.toList());
9187

9288
assertTrue(statusValues.contains("Invalid"));
@@ -101,44 +97,43 @@ public void testAuditSearchTemplate() {
10197
* Here we Create/Update different Entities and verify an audit is generated for each action. This can be further
10298
* extened with more entities and actions in similiar way.
10399
*/
104-
@SuppressWarnings("unchecked")
105100
@Test
106101
public void auditShouldbeCreated() {
107102
// Audits recieved after all actions are performed.
108-
List<HashMap<String, Object>> auditsRecieved;
103+
List<AuditData> auditsRecieved;
109104

110105
// Audits recieved before any action is performed, needed in special
111106
// cases eg: reactivate client, close client
112-
List<HashMap<String, Object>> auditsRecievedInitial;
107+
List<AuditData> auditsRecievedInitial;
113108

114109
// When Client is created: Count should be "1"
115110
final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
116111
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientId);
117112

118-
auditsRecieved = auditHelper.getAuditDetails(clientId, "CREATE", "CLIENT");
119-
auditHelper.verifyOneAuditOnly(auditsRecieved, clientId, "CREATE", "CLIENT");
113+
auditsRecieved = AuditHelper.getAuditDetails(clientId, "CREATE", "CLIENT");
114+
AuditHelper.verifyOneAuditOnly(auditsRecieved, clientId, "CREATE", "CLIENT");
120115

121116
// Performs multiple close and reactivate on client
122117

123118
for (int i = 0; i < 4; i++) {
124119
// Close
125-
auditsRecievedInitial = auditHelper.getAuditDetails(clientId, "CLOSE", "CLIENT");
120+
auditsRecievedInitial = AuditHelper.getAuditDetails(clientId, "CLOSE", "CLIENT");
126121
this.clientHelper.closeClient(clientId);
127-
auditsRecieved = auditHelper.getAuditDetails(clientId, "CLOSE", "CLIENT");
128-
auditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, clientId, "CLOSE", "CLIENT");
122+
auditsRecieved = AuditHelper.getAuditDetails(clientId, "CLOSE", "CLIENT");
123+
AuditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, clientId, "CLOSE", "CLIENT");
129124

130125
// Activate
131-
auditsRecievedInitial = auditHelper.getAuditDetails(clientId, "REACTIVATE", "CLIENT");
126+
auditsRecievedInitial = AuditHelper.getAuditDetails(clientId, "REACTIVATE", "CLIENT");
132127
this.clientHelper.reactivateClient(clientId);
133-
auditsRecieved = auditHelper.getAuditDetails(clientId, "REACTIVATE", "CLIENT");
134-
auditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, clientId, "REACTIVATE", "CLIENT");
128+
auditsRecieved = AuditHelper.getAuditDetails(clientId, "REACTIVATE", "CLIENT");
129+
AuditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, clientId, "REACTIVATE", "CLIENT");
135130
}
136131

137132
// When Office is created
138133
OfficeHelper officeHelper = new OfficeHelper();
139134
int officeId = officeHelper.createOffice(java.time.LocalDate.of(2020, 6, 22)).getResourceId().intValue();
140-
auditsRecieved = auditHelper.getAuditDetails(officeId, "CREATE", "OFFICE");
141-
auditHelper.verifyOneAuditOnly(auditsRecieved, officeId, "CREATE", "OFFICE");
135+
auditsRecieved = AuditHelper.getAuditDetails(officeId, "CREATE", "OFFICE");
136+
AuditHelper.verifyOneAuditOnly(auditsRecieved, officeId, "CREATE", "OFFICE");
142137
}
143138

144139
@Test
@@ -159,7 +154,7 @@ public void checkAuditsWithLimitParam() {
159154
for (int i = 0; i < 3; i++) {
160155
// limit contains a number between 1-8
161156
int limit = rand.nextInt(7) + 1;
162-
auditHelper.verifyLimitParameterfor(limit);
157+
AuditHelper.verifyLimitParameterfor(limit);
163158
}
164159
}
165160

@@ -170,24 +165,23 @@ public void checkIfOrderBySupported() {
170165
"madeOnDate", "id", "loanId", "actionName");
171166

172167
for (int i = 0; i < shouldBeSupportedFor.size(); i++) {
173-
auditHelper.verifyOrderBysupported(shouldBeSupportedFor.get(i));
168+
AuditHelper.verifyOrderBysupported(shouldBeSupportedFor.get(i));
174169
}
175170

176171
}
177172

178-
@SuppressWarnings("unchecked")
179173
@Test
180174
public void executeSchedulerJobShouldCreateAuditEntry() {
181175
// given
182176
int jobId = schedulerJobHelper.getSchedulerJobIdByShortName("SA_AANF").intValue();
183-
List<HashMap<String, Object>> auditsRecievedInitial = auditHelper.getAuditDetails(jobId, "EXECUTEJOB", "SCHEDULER");
177+
List<AuditData> auditsRecievedInitial = AuditHelper.getAuditDetails(jobId, "EXECUTEJOB", "SCHEDULER");
184178

185179
// when
186180
schedulerJobHelper.runSchedulerJob(jobId);
187181

188182
// then
189-
List<HashMap<String, Object>> auditsRecieved = auditHelper.getAuditDetails(jobId, "EXECUTEJOB", "SCHEDULER");
190-
auditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, jobId, "EXECUTEJOB", "SCHEDULER");
183+
List<AuditData> auditsRecieved = AuditHelper.getAuditDetails(jobId, "EXECUTEJOB", "SCHEDULER");
184+
AuditHelper.verifyMultipleAuditsOnserver(auditsRecievedInitial, auditsRecieved, jobId, "EXECUTEJOB", "SCHEDULER");
191185
}
192186

193187
}

integration-tests/src/test/java/org/apache/fineract/integrationtests/IpTrackingIntegrationTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
import io.restassured.http.ContentType;
2727
import io.restassured.specification.RequestSpecification;
2828
import io.restassured.specification.ResponseSpecification;
29-
import java.util.HashMap;
3029
import java.util.List;
30+
import org.apache.fineract.client.models.AuditData;
3131
import org.apache.fineract.integrationtests.common.AuditHelper;
3232
import org.apache.fineract.integrationtests.common.ClientHelper;
3333
import org.apache.fineract.integrationtests.common.Utils;
@@ -36,7 +36,6 @@
3636

3737
public class IpTrackingIntegrationTest {
3838

39-
private AuditHelper auditHelper;
4039
private static final String EXPECTED_LOCAL_IP = "127.0.0.1";
4140
private RequestSpecification requestSpec;
4241
private ResponseSpecification responseSpec;
@@ -50,7 +49,6 @@ public void setup() {
5049
this.requestSpec.auth().basic("mifos", "password");
5150
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
5251
this.responseSpecForSearch = new ResponseSpecBuilder().expectStatusCode(200).build();
53-
this.auditHelper = new AuditHelper(this.requestSpec, this.responseSpec);
5452
}
5553

5654
@Test
@@ -61,10 +59,10 @@ public void capturesIpAddressWhenCreatingClient() throws Exception {
6159
// given
6260
final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
6361
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientId);
64-
List<HashMap<String, Object>> auditsRecieved = auditHelper.getAuditDetails(clientId, "CREATE", "CLIENT");
62+
List<AuditData> auditsRecieved = AuditHelper.getAuditDetails(clientId, "CREATE", "CLIENT");
6563

6664
// when
67-
String ip = auditsRecieved.get(0).get("ip").toString();
65+
String ip = auditsRecieved.get(0).getIp();
6866

6967
assumeTrue(!ip.isEmpty(), "IP not arrived: skipping capture test when enabled");
7068
// then

integration-tests/src/test/java/org/apache/fineract/integrationtests/MakercheckerTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.apache.fineract.client.models.PutGlobalConfigurationsRequest;
3434
import org.apache.fineract.client.models.PutPermissionsRequest;
3535
import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
36-
import org.apache.fineract.integrationtests.common.AuditHelper;
3736
import org.apache.fineract.integrationtests.common.ClientHelper;
3837
import org.apache.fineract.integrationtests.common.CommonConstants;
3938
import org.apache.fineract.integrationtests.common.FineractClientHelper;
@@ -58,7 +57,6 @@ public class MakercheckerTest {
5857
private RequestSpecification requestSpec;
5958
private MakercheckersHelper makercheckersHelper;
6059
private RolesHelper rolesHelper;
61-
private AuditHelper auditHelper;
6260
private SavingsProductHelper savingsProductHelper;
6361
private SavingsAccountHelper savingsAccountHelper;
6462
private static final String START_DATE_STRING = "03 June 2023";
@@ -73,7 +71,6 @@ public void setup() {
7371
this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
7472
this.makercheckersHelper = new MakercheckersHelper(this.requestSpec, this.responseSpec);
7573
this.rolesHelper = new RolesHelper();
76-
this.auditHelper = new AuditHelper(requestSpec, responseSpec);
7774
this.savingsProductHelper = new SavingsProductHelper();
7875
this.savingsAccountHelper = new SavingsAccountHelper(this.requestSpec, this.responseSpec);
7976
this.globalConfigurationHelper = new GlobalConfigurationHelper();

0 commit comments

Comments
 (0)