Skip to content

Commit bd8af57

Browse files
Merge branch 'master' into MODFIN-408
2 parents ef2005f + 21d140d commit bd8af57

30 files changed

+334
-292
lines changed

descriptors/ModuleDescriptor-template.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@
350350
"finance-storage.budgets.collection.get",
351351
"finance-storage.fiscal-years.item.get",
352352
"finance-storage.transactions.collection.get",
353-
"finance-storage.transaction-totals.collection.get",
353+
"finance-storage.transaction-totals.batch.post",
354354
"acquisitions-units-storage.units.collection.get",
355355
"acquisitions-units-storage.memberships.collection.get"
356356
]
@@ -372,7 +372,7 @@
372372
"finance-storage.budgets.collection.get",
373373
"finance-storage.fiscal-years.item.get",
374374
"finance-storage.transactions.collection.get",
375-
"finance-storage.transaction-totals.collection.get",
375+
"finance-storage.transaction-totals.batch.post",
376376
"acquisitions-units-storage.units.collection.get",
377377
"acquisitions-units-storage.memberships.collection.get"
378378
]
@@ -840,13 +840,13 @@
840840
"pathPattern": "/finance/finance-data",
841841
"permissionsRequired": ["finance.finance-data.collection.put"],
842842
"modulePermissions": [
843-
"finance-storage.budgets.item.get",
843+
"finance-storage.budgets.batch.post",
844+
"finance-storage.funds.batch.post",
844845
"finance-storage.finance-data.collection.put",
845846
"finance-storage.fund-update-logs.item.get",
846847
"finance-storage.fund-update-logs.item.post",
847848
"finance-storage.fund-update-logs.item.put",
848-
"finance-storage.job-number.get",
849-
"finance-storage.funds.item.get"
849+
"finance-storage.job-number.get"
850850
]
851851
}
852852
]

pom.xml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
<!--Project properties-->
3737
<ramlfiles_path>${basedir}/ramls</ramlfiles_path>
38-
<raml-module-builder.version>35.4.0</raml-module-builder.version>
38+
<raml-module-builder.version>36.0.0-SNAPSHOT</raml-module-builder.version>
3939
<sonar.exclusions>**/models/*.java</sonar.exclusions>
4040
<sonar.test.exclusions>**/*Test.java</sonar.test.exclusions>
4141
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -44,33 +44,33 @@
4444
<jsonschema_paths>acq-models/mod-finance/schemas,raml-util/schemas,acq-models/common/schemas</jsonschema_paths>
4545

4646
<!--Dependency Management Properties-->
47-
<spring.version>6.2.7</spring.version>
48-
<vertx.version>4.5.13</vertx.version>
49-
<junit.jupiter.version>5.12.0</junit.jupiter.version>
50-
<log4j.version>2.24.3</log4j.version>
47+
<spring.version>7.0.2</spring.version>
48+
<vertx.version>5.0.6</vertx.version>
49+
<junit.jupiter.version>6.0.1</junit.jupiter.version>
50+
<log4j.version>2.25.3</log4j.version>
5151

5252
<!--Dependency properties-->
53-
<mockito.version>5.15.2</mockito.version>
54-
<aspectj.version>1.9.22.1</aspectj.version>
55-
<rest-assured.version>5.5.1</rest-assured.version>
56-
<folio-di-support.version>3.0.0</folio-di-support.version>
57-
<caffeine.version>3.2.0</caffeine.version>
53+
<mockito.version>5.21.0</mockito.version>
54+
<aspectj.version>1.9.25.1</aspectj.version>
55+
<rest-assured.version>6.0.0</rest-assured.version>
56+
<folio-di-support.version>4.0.0-SNAPSHOT</folio-di-support.version>
57+
<caffeine.version>3.2.3</caffeine.version>
5858

5959
<!--Folio dependencies properties-->
60-
<folio-module-descriptor-validator.version>1.0.0</folio-module-descriptor-validator.version>
60+
<folio-module-descriptor-validator.version>1.0.1</folio-module-descriptor-validator.version>
6161

6262
<!--Maven plugin properties-->
63-
<aspectj-maven-plugin.version>1.14</aspectj-maven-plugin.version>
64-
<exec-maven-plugin.version>3.5.0</exec-maven-plugin.version>
65-
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
66-
<maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
67-
<maven-antrun-plugin.version>3.1.0</maven-antrun-plugin.version>
68-
<maven-shade-plugin.version>3.6.0</maven-shade-plugin.version>
63+
<aspectj-maven-plugin.version>1.14.1</aspectj-maven-plugin.version>
64+
<exec-maven-plugin.version>3.6.3</exec-maven-plugin.version>
65+
<maven-resources-plugin.version>3.4.0</maven-resources-plugin.version>
66+
<maven-compiler-plugin.version>3.14.1</maven-compiler-plugin.version>
67+
<maven-antrun-plugin.version>3.2.0</maven-antrun-plugin.version>
68+
<maven-shade-plugin.version>3.6.1</maven-shade-plugin.version>
6969
<properties-maven-plugin.version>1.2.1</properties-maven-plugin.version>
7070
<jsonschema2pojo-maven-plugin.version>1.2.2</jsonschema2pojo-maven-plugin.version>
71-
<maven-release-plugin.version>3.1.1</maven-release-plugin.version>
72-
<maven-surefire-plugin.version>3.5.2</maven-surefire-plugin.version>
73-
<build-helper-maven-plugin.version>3.6.0</build-helper-maven-plugin.version>
71+
<maven-release-plugin.version>3.3.1</maven-release-plugin.version>
72+
<maven-surefire-plugin.version>3.5.4</maven-surefire-plugin.version>
73+
<build-helper-maven-plugin.version>3.6.1</build-helper-maven-plugin.version>
7474
<copy-rename-maven-plugin.version>1.0.1</copy-rename-maven-plugin.version>
7575

7676
<argLine />
@@ -154,7 +154,7 @@
154154
<dependency>
155155
<groupId>one.util</groupId>
156156
<artifactId>streamex</artifactId>
157-
<version>0.8.3</version>
157+
<version>0.8.4</version>
158158
</dependency>
159159
<dependency>
160160
<groupId>commons-lang</groupId>
@@ -186,7 +186,7 @@
186186
<dependency>
187187
<groupId>org.javamoney</groupId>
188188
<artifactId>moneta</artifactId>
189-
<version>1.4.4</version>
189+
<version>1.4.5</version>
190190
<exclusions>
191191
<exclusion>
192192
<groupId>org.javamoney.moneta</groupId>

ramls/finance-data.raml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ documentation:
1010

1111
types:
1212
errors: !include raml-util/schemas/errors.schema
13+
batch-id-collection: !include acq-models/common/schemas/batch_id_collection.json
1314
fy-finance-data-collection: !include acq-models/mod-finance/schemas/fy_finance_data_collection.json
1415
UUID:
1516
type: string

ramls/transaction.raml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ types:
1313
transaction-collection: !include acq-models/mod-finance/schemas/transaction_collection.json
1414
transaction-total: !include acq-models/mod-finance/schemas/transaction_total.json
1515
transaction-total-collection: !include acq-models/mod-finance/schemas/transaction_total_collection.json
16+
transaction-total-batch: !include acq-models/mod-finance/schemas/transaction_total_batch.json
1617
batch: !include acq-models/mod-finance/schemas/batch.json
1718
UUID:
1819
type: string

src/main/java/org/folio/rest/core/RestClient.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
import java.util.Map;
1111

12-
import org.apache.logging.log4j.LogManager;
13-
import org.apache.logging.log4j.Logger;
1412
import org.folio.okapi.common.WebClientFactory;
1513
import org.folio.rest.core.models.RequestContext;
1614
import org.folio.rest.exception.HttpException;
@@ -21,30 +19,16 @@
2119
import io.vertx.core.MultiMap;
2220
import io.vertx.core.Promise;
2321
import io.vertx.core.http.HttpMethod;
22+
import io.vertx.core.http.HttpResponseExpectation;
2423
import io.vertx.core.json.JsonObject;
2524
import io.vertx.ext.web.client.HttpResponse;
2625
import io.vertx.ext.web.client.WebClient;
2726
import io.vertx.ext.web.client.WebClientOptions;
28-
import io.vertx.ext.web.client.predicate.ErrorConverter;
29-
import io.vertx.ext.web.client.predicate.ResponsePredicate;
27+
import lombok.extern.log4j.Log4j2;
3028

29+
@Log4j2
3130
public class RestClient {
3231

33-
private static final Logger log = LogManager.getLogger();
34-
private static final ErrorConverter ERROR_CONVERTER = ErrorConverter.createFullBody(
35-
result -> {
36-
String errorResponse = result.response().bodyAsString();
37-
if (isJsonOfType(errorResponse, Errors.class)) {
38-
return new HttpException(result.response().statusCode(), mapToErrors(errorResponse));
39-
}
40-
else {
41-
return getErrorByCode(errorResponse)
42-
.map(errorCode -> new HttpException(result.response().statusCode(), errorCode))
43-
.orElse(new HttpException(result.response().statusCode(), errorResponse));
44-
}
45-
});
46-
protected static final ResponsePredicate SUCCESS_RESPONSE_PREDICATE =
47-
ResponsePredicate.create(ResponsePredicate.SC_SUCCESS, ERROR_CONVERTER);
4832
public static final String REQUEST_MESSAGE_LOG_INFO = "Calling {} {}";
4933

5034
public <T> Future<T> post(String endpoint, T entity, Class<T> responseType, RequestContext requestContext) {
@@ -53,8 +37,8 @@ public <T> Future<T> post(String endpoint, T entity, Class<T> responseType, Requ
5337
return getVertxWebClient(requestContext.context())
5438
.postAbs(buildAbsEndpoint(caseInsensitiveHeader, endpoint))
5539
.putHeaders(caseInsensitiveHeader)
56-
.expect(SUCCESS_RESPONSE_PREDICATE)
5740
.sendJson(entity)
41+
.compose(RestClient::convertHttpResponse)
5842
.map(HttpResponse::bodyAsJsonObject)
5943
.map(body -> body.mapTo(responseType))
6044
.onFailure(log::error);
@@ -66,8 +50,8 @@ public <T> Future<Void> postEmptyResponse(String endpoint, T entity, RequestCont
6650
return getVertxWebClient(requestContext.context())
6751
.postAbs(buildAbsEndpoint(caseInsensitiveHeader, endpoint))
6852
.putHeaders(caseInsensitiveHeader)
69-
.expect(SUCCESS_RESPONSE_PREDICATE)
7053
.sendJson(entity)
54+
.compose(RestClient::convertHttpResponse)
7155
.onFailure(log::error)
7256
.mapEmpty();
7357
}
@@ -78,8 +62,8 @@ public <REQ, RES> Future<RES> postBatch(String endpoint, REQ requestEntity, Clas
7862
return getVertxWebClient(requestContext.context())
7963
.postAbs(buildAbsEndpoint(caseInsensitiveHeader, endpoint))
8064
.putHeaders(caseInsensitiveHeader)
81-
.expect(SUCCESS_RESPONSE_PREDICATE)
8265
.sendJson(requestEntity)
66+
.compose(RestClient::convertHttpResponse)
8367
.map(HttpResponse::bodyAsJsonObject)
8468
.map(body -> body.mapTo(responseType))
8569
.onFailure(log::error);
@@ -101,8 +85,8 @@ public <T> Future<Void> put(String endpoint, T dataObject, RequestContext reques
10185
return getVertxWebClient(requestContext.context())
10286
.putAbs(buildAbsEndpoint(caseInsensitiveHeader, endpoint))
10387
.putHeaders(caseInsensitiveHeader)
104-
.expect(SUCCESS_RESPONSE_PREDICATE)
10588
.sendJson(recordData)
89+
.compose(RestClient::convertHttpResponse)
10690
.onFailure(log::error)
10791
.mapEmpty();
10892
}
@@ -116,8 +100,8 @@ public <T> Future<T> put(String endpoint, T dataObject, Class<T> responseType ,R
116100
return getVertxWebClient(requestContext.context())
117101
.putAbs(buildAbsEndpoint(caseInsensitiveHeader, endpoint))
118102
.putHeaders(caseInsensitiveHeader)
119-
.expect(SUCCESS_RESPONSE_PREDICATE)
120103
.sendJson(recordData)
104+
.compose(RestClient::convertHttpResponse)
121105
.map(HttpResponse::bodyAsJsonObject)
122106
.map(jsonObject -> jsonObject.mapTo(responseType))
123107
.onFailure(log::error);
@@ -132,8 +116,8 @@ public Future<Void> delete(String endpointById, boolean skipError404, RequestCon
132116
getVertxWebClient(requestContext.context())
133117
.deleteAbs(buildAbsEndpoint(caseInsensitiveHeader, endpointById))
134118
.putHeaders(caseInsensitiveHeader)
135-
.expect(SUCCESS_RESPONSE_PREDICATE)
136119
.send()
120+
.compose(RestClient::convertHttpResponse)
137121
.onSuccess(f -> promise.complete())
138122
.onFailure(t -> handleErrorResponse(promise, t, skipError404));
139123

@@ -177,8 +161,8 @@ public <T> Future<T> get(String endpoint, boolean skipError404, Class<T> respons
177161
getVertxWebClient(requestContext.context())
178162
.getAbs(absEndpoint)
179163
.putHeaders(caseInsensitiveHeader)
180-
.expect(SUCCESS_RESPONSE_PREDICATE)
181164
.send()
165+
.compose(RestClient::convertHttpResponse)
182166
.map(HttpResponse::bodyAsJsonObject)
183167
.map(jsonObject -> jsonObject.mapTo(responseType))
184168
.onSuccess(promise::complete)
@@ -187,20 +171,35 @@ public <T> Future<T> get(String endpoint, boolean skipError404, Class<T> respons
187171
return promise.future();
188172
}
189173

190-
protected WebClient getVertxWebClient(Context context) {
174+
private static WebClient getVertxWebClient(Context context) {
191175
WebClientOptions options = new WebClientOptions();
192176
options.setLogActivity(true);
193177
options.setKeepAlive(true);
194178
options.setConnectTimeout(2000);
195179
options.setIdleTimeout(5000);
196-
options.setTryUseCompression(true);
197-
180+
options.setDecompressionSupported(true);
198181
return WebClientFactory.getWebClient(context.owner(), options);
199182
}
200183

201-
protected String buildAbsEndpoint(MultiMap okapiHeaders, String endpoint) {
184+
private static String buildAbsEndpoint(MultiMap okapiHeaders, String endpoint) {
202185
var okapiURL = okapiHeaders.get(OKAPI_URL);
203186
return okapiURL + endpoint;
204187
}
205188

189+
private static <T> Future<HttpResponse<T>> convertHttpResponse(HttpResponse<T> response) {
190+
if (HttpResponseExpectation.SC_SUCCESS.test(response)) {
191+
return Future.succeededFuture(response);
192+
}
193+
HttpException exception;
194+
var errorResponse = response.bodyAsString();
195+
if (isJsonOfType(errorResponse, Errors.class)) {
196+
exception = new HttpException(response.statusCode(), mapToErrors(errorResponse));
197+
} else {
198+
exception = getErrorByCode(errorResponse)
199+
.map(errorCode -> new HttpException(response.statusCode(), errorCode))
200+
.orElse(new HttpException(response.statusCode(), errorResponse));
201+
}
202+
return Future.failedFuture(exception);
203+
}
204+
206205
}

src/main/java/org/folio/rest/helper/FundsHelper.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.apache.commons.collections4.CollectionUtils;
2121
import org.apache.logging.log4j.LogManager;
2222
import org.apache.logging.log4j.Logger;
23-
import org.folio.okapi.common.GenericCompositeFuture;
2423
import org.folio.rest.core.RestClient;
2524
import org.folio.rest.core.models.RequestContext;
2625
import org.folio.rest.exception.HttpException;
@@ -113,7 +112,7 @@ private Future<Void> assignFundToGroups(CompositeFund compositeFund, String fisc
113112
var futures = groupFundFiscalYears.stream()
114113
.map(groupFundFiscalYear -> groupFundFiscalYearService.createGroupFundFiscalYear(groupFundFiscalYear, new RequestContext(ctx, okapiHeaders)))
115114
.collect(Collectors.toList());
116-
return GenericCompositeFuture.join(futures)
115+
return Future.join(futures)
117116
.mapEmpty();
118117
}
119118

@@ -148,15 +147,15 @@ private Future<Void> assignFundToGroups(List<GroupFundFiscalYear> groupFundFisca
148147
.map(groupFundFiscalYear -> groupFundFiscalYearService.createGroupFundFiscalYear(groupFundFiscalYear, new RequestContext(ctx, okapiHeaders)))
149148
.collect(Collectors.toList());
150149

151-
return GenericCompositeFuture.join(futures)
150+
return Future.join(futures)
152151
.mapEmpty();
153152
}
154153

155154
private Future<Void> unassignGroupsForFund(Collection<String> groupFundFiscalYearIds) {
156155
var futures = groupFundFiscalYearIds.stream()
157156
.map(id -> groupFundFiscalYearService.deleteGroupFundFiscalYear(id, new RequestContext(ctx, okapiHeaders)))
158157
.collect(Collectors.toList());
159-
return GenericCompositeFuture.join(futures)
158+
return Future.join(futures)
160159
.mapEmpty();
161160
}
162161

src/main/java/org/folio/rest/impl/InitAPIs.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,18 @@ public class InitAPIs implements InitAPI {
2222

2323
@Override
2424
public void init(Vertx vertx, Context context, Handler<AsyncResult<Boolean>> resultHandler) {
25-
vertx.executeBlocking(
26-
promise -> {
27-
initJavaMoney();
28-
SpringContextUtil.init(vertx, context, ApplicationConfig.class);
29-
promise.complete();
30-
},
31-
result -> {
32-
if (result.succeeded()) {
33-
resultHandler.handle(Future.succeededFuture(true));
34-
} else {
35-
logger.error("Failure to init API", result.cause());
36-
resultHandler.handle(Future.failedFuture(result.cause()));
37-
}
38-
});
25+
vertx.executeBlocking(() -> {
26+
initJavaMoney();
27+
SpringContextUtil.init(vertx, context, ApplicationConfig.class);
28+
return true;
29+
}).onComplete(result -> {
30+
if (result.succeeded()) {
31+
resultHandler.handle(Future.succeededFuture(true));
32+
} else {
33+
logger.error("Failure to init API", result.cause());
34+
resultHandler.handle(Future.failedFuture(result.cause()));
35+
}
36+
});
3937
}
4038

4139
private void initJavaMoney() {

src/main/java/org/folio/rest/util/BudgetUtils.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,17 @@
77
import org.folio.rest.jaxrs.model.BudgetExpenseClass;
88
import org.folio.rest.jaxrs.model.SharedBudget;
99
import org.folio.rest.jaxrs.model.StatusExpenseClass;
10-
import org.folio.rest.jaxrs.model.Transaction.TransactionType;
10+
import org.folio.rest.jaxrs.model.Transaction;
11+
import org.folio.rest.jaxrs.model.TransactionType;
1112

1213
import io.vertx.core.json.JsonObject;
13-
import org.folio.rest.jaxrs.model.TransactionTotal;
14+
import lombok.experimental.UtilityClass;
1415

16+
@UtilityClass
1517
public final class BudgetUtils {
1618

17-
public static final List<TransactionType> TRANSFER_TRANSACTION_TYPES = List.of(TransactionType.TRANSFER, TransactionType.ROLLOVER_TRANSFER);
18-
public static final List<TransactionTotal.TransactionType> TRANSFER_TRANSACTION_TOTAL_TYPES = List.of(TransactionTotal.TransactionType.TRANSFER, TransactionTotal.TransactionType.ROLLOVER_TRANSFER);
19-
20-
private BudgetUtils() {
21-
22-
}
19+
public static final List<Transaction.TransactionType> TRANSFER_TRANSACTION_TYPES = List.of(Transaction.TransactionType.TRANSFER, Transaction.TransactionType.ROLLOVER_TRANSFER);
20+
public static final List<TransactionType> TRANSFER_TRANSACTION_TOTAL_TYPES = List.of(TransactionType.TRANSFER, TransactionType.ROLLOVER_TRANSFER);
2321

2422
public static SharedBudget buildSharedBudget(Budget budget, List<BudgetExpenseClass> budgetExpenseClasses) {
2523
List<StatusExpenseClass> statusExpenseClasses = budgetExpenseClasses.stream()
@@ -33,7 +31,7 @@ public static SharedBudget convertToSharedBudget(Budget budget) {
3331
}
3432

3533
public static Budget convertToBudget(SharedBudget budget) {
36-
JsonObject jsonSharedBudget = JsonObject.mapFrom(budget);
34+
JsonObject jsonSharedBudget = JsonObject.mapFrom(budget);
3735
jsonSharedBudget.remove("statusExpenseClasses");
3836
return jsonSharedBudget.mapTo(Budget.class);
3937
}

0 commit comments

Comments
 (0)