Skip to content

Commit bc2e18c

Browse files
authored
Merge pull request #23 from indexdata/master
Master
2 parents 88449fc + f749f49 commit bc2e18c

141 files changed

Lines changed: 3640 additions & 1621 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

NEWS.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
* Replace deprecated mod-configuration with mod-settings for fetching tenant's locale settings ([CIRC-2295](https://folio-org.atlassian.net/browse/CIRC-2295))
33
* Fix sending notifications specified to be sent to proxy ([CIRC-2295](https://folio-org.atlassian.net/browse/CIRC-2385))
44
* Handling of patron notices for closed loans ([CIRC-1891](https://folio-org.atlassian.net/browse/CIRC-1891))
5-
* Render item's loan type in requests responses ([CIRC-2441])(https://folio-org.atlassian.net/browse/CIRC-2441))
5+
* Render item's loan type in requests responses ([CIRC-2441](https://folio-org.atlassian.net/browse/CIRC-2441))
6+
* Switch DCB user check from lastName to the user type ([CIRC-2482](https://folio-org.atlassian.net/browse/CIRC-2482))
7+
* Upgrade wiremock from 2.35.0 to 3.13.2 fixing CVE-2023-41329 ([CIRC-2543](https://folio-org.atlassian.net/browse/CIRC-2543))
8+
* Fix request losing retrieval service point name upon check-in ([CIRC-2535](https://folio-org.atlassian.net/browse/CIRC-2535))
69

710
## 24.4.0 2025-03-12
811
* Patron notices for the trigger “Item recalled” not sent if the item is not 1st in the title request queue (CIRC-2168)

descriptors/ModuleDescriptor-template.json

Lines changed: 124 additions & 49 deletions
Large diffs are not rendered by default.

pom.xml

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
<properties>
2626
<antlr4.version>4.11.1</antlr4.version>
2727
<drools.version>10.0.0</drools.version>
28-
<rmb.version>35.4.0</rmb.version>
29-
<vertx.version>4.5.13</vertx.version>
28+
<rmb.version>36.0.0-SNAPSHOT</rmb.version>
29+
<vertx.version>5.0.6</vertx.version>
30+
<folio.kafka.wrapper.version>4.0.0-SNAPSHOT</folio.kafka.wrapper.version>
3031
<log4j2.version>2.24.3</log4j2.version>
3132
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3233
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -64,7 +65,7 @@
6465
<dependency>
6566
<groupId>org.testcontainers</groupId>
6667
<artifactId>testcontainers-bom</artifactId>
67-
<version>1.21.0</version>
68+
<version>1.21.4</version>
6869
<type>pom</type>
6970
<scope>import</scope>
7071
</dependency>
@@ -124,12 +125,17 @@
124125
<dependency>
125126
<groupId>org.folio</groupId>
126127
<artifactId>mod-pubsub-client</artifactId>
127-
<version>2.16.0</version>
128+
<version>2.17.0-SNAPSHOT</version>
128129
</dependency>
129130
<dependency>
130131
<groupId>org.apache.commons</groupId>
131132
<artifactId>commons-text</artifactId>
132-
<version>1.10.0</version>
133+
<version>1.14.0</version>
134+
</dependency>
135+
<dependency>
136+
<groupId>commons-io</groupId>
137+
<artifactId>commons-io</artifactId>
138+
<version>2.21.0</version>
133139
</dependency>
134140
<dependency>
135141
<groupId>org.projectlombok</groupId>
@@ -206,9 +212,9 @@
206212
</exclusions>
207213
</dependency>
208214
<dependency>
209-
<groupId>com.github.tomakehurst</groupId>
210-
<artifactId>wiremock-jre8</artifactId>
211-
<version>2.35.0</version>
215+
<groupId>org.wiremock</groupId>
216+
<artifactId>wiremock</artifactId>
217+
<version>3.13.2</version>
212218
<scope>test</scope>
213219
</dependency>
214220
<dependency>
@@ -248,7 +254,7 @@
248254
<dependency>
249255
<groupId>org.folio</groupId>
250256
<artifactId>folio-kafka-wrapper</artifactId>
251-
<version>3.0.0</version>
257+
<version>${folio.kafka.wrapper.version}</version>
252258
</dependency>
253259
<dependency>
254260
<groupId>io.vertx</groupId>
@@ -461,6 +467,7 @@
461467
<!-- otherwise Drools KieServices.Factory.get() returns null: CIRC-309, CIRC-1147 -->
462468
<resource>META-INF/kie.conf</resource>
463469
</transformer>
470+
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
464471
</transformers>
465472
<artifactSet />
466473
<outputFile>${project.build.directory}/${project.artifactId}.jar</outputFile>
@@ -493,6 +500,11 @@
493500
<artifactId>maven-surefire-plugin</artifactId>
494501
<version>3.0.0-M5</version>
495502
</plugin>
503+
<plugin>
504+
<groupId>org.apache.maven.plugins</groupId>
505+
<artifactId>maven-failsafe-plugin</artifactId>
506+
<version>3.5.4</version>
507+
</plugin>
496508
<plugin>
497509
<groupId>org.apache.maven.plugins</groupId>
498510
<artifactId>maven-release-plugin</artifactId>

ramls/request-anonymization.raml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#%RAML 1.0
2+
title: Circulation
3+
version: v0.1
4+
protocols: [ HTTP, HTTPS ]
5+
baseUri: http://localhost:9130
6+
7+
documentation:
8+
- title: Request Anonymization API
9+
content: <b>Request Anonymization API</b>
10+
11+
types:
12+
anonymize-request-response: !include schema/anonymize-single-request-response.json
13+
errors: !include raml-util/schemas/errors.schema
14+
15+
traits:
16+
validate: !include raml-util/traits/validation.raml
17+
18+
/request-anonymization:
19+
/{requestId}:
20+
uriParameters:
21+
requestId:
22+
type: string
23+
description: Request UUID to anonymize
24+
example: 9fd9b9d8-1b1a-4a7a-9f54-5e7c5f5e0b2e
25+
pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'
26+
post:
27+
is: [ validate ]
28+
description: Anonymize a single closed request by its requestId.
29+
responses:
30+
200:
31+
description: The request has been successfully anonymized.
32+
body:
33+
application/json:
34+
type: anonymize-request-response
35+
example:
36+
requestId: 9fd9b9d8-1b1a-4a7a-9f54-5e7c5f5e0b2e
37+
anonymized: true
38+
39+
404:
40+
description: Request with the given requestId was not found.
41+
body:
42+
application/json:
43+
type: errors
44+
example:
45+
errors:
46+
- message: Request not found
47+
48+
422:
49+
description: Validation error — request is not closed or another rule prevents anonymization.
50+
body:
51+
application/json:
52+
type: errors
53+
example:
54+
errors:
55+
- message: requestNotClosed
56+
57+
500:
58+
description: Internal server error.
59+
body:
60+
application/json:
61+
type: errors
62+
example:
63+
errors:
64+
- message: Internal server error
65+
66+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"description": "Single Request Anonymization Response",
4+
"type": "object",
5+
"properties": {
6+
"requestId": {
7+
"type": "string",
8+
"format": "UUID",
9+
"description": "UUID of the request that was processed."
10+
},
11+
"anonymized": {
12+
"type": "boolean",
13+
"description": "True if the request is anonymized after this call (PII removed or already absent)."
14+
}
15+
},
16+
"required": ["requestId", "anonymized"],
17+
"additionalProperties": false
18+
}

src/main/java/org/folio/circulation/CirculationVerticle.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,34 @@
3636
import org.folio.circulation.resources.OverdueFineScheduledNoticeProcessingResource;
3737
import org.folio.circulation.resources.PickSlipsResource;
3838
import org.folio.circulation.resources.PrintEventsResource;
39+
import org.folio.circulation.resources.RequestAnonymizationResource;
3940
import org.folio.circulation.resources.RequestByInstanceIdResource;
4041
import org.folio.circulation.resources.RequestCirculationRulesEngineResource;
4142
import org.folio.circulation.resources.RequestCollectionResource;
4243
import org.folio.circulation.resources.RequestHoldShelfClearanceResource;
4344
import org.folio.circulation.resources.RequestQueueResource;
4445
import org.folio.circulation.resources.RequestScheduledNoticeProcessingResource;
4546
import org.folio.circulation.resources.ScheduledAnonymizationProcessingResource;
47+
import org.folio.circulation.resources.ScheduledRequestAnonymizationProcessingResource;
4648
import org.folio.circulation.resources.ScheduledDigitalRemindersProcessingResource;
4749
import org.folio.circulation.resources.SearchSlipsResource;
4850
import org.folio.circulation.resources.TenantActivationResource;
4951
import org.folio.circulation.resources.agedtolost.ScheduledAgeToLostFeeChargingResource;
5052
import org.folio.circulation.resources.agedtolost.ScheduledAgeToLostResource;
53+
import org.folio.circulation.resources.foruseatlocation.HoldByBarcodeResource;
54+
import org.folio.circulation.resources.foruseatlocation.PickupByBarcodeResource;
5155
import org.folio.circulation.resources.handlers.FeeFineBalanceChangedHandlerResource;
5256
import org.folio.circulation.resources.handlers.LoanRelatedFeeFineClosedHandlerResource;
5357
import org.folio.circulation.resources.renewal.RenewByBarcodeResource;
5458
import org.folio.circulation.resources.renewal.RenewByIdResource;
55-
import org.folio.circulation.resources.foruseatlocation.HoldByBarcodeResource;
56-
import org.folio.circulation.resources.foruseatlocation.PickupByBarcodeResource;
5759
import org.folio.circulation.support.logging.LogHelper;
5860
import org.folio.circulation.support.logging.Logging;
5961

6062
import io.vertx.core.AbstractVerticle;
6163
import io.vertx.core.Promise;
6264
import io.vertx.core.http.HttpClient;
63-
import io.vertx.core.http.HttpClientOptions;
6465
import io.vertx.core.http.HttpServer;
66+
import io.vertx.core.http.PoolOptions;
6567
import io.vertx.ext.web.Router;
6668

6769
public class CirculationVerticle extends AbstractVerticle {
@@ -78,8 +80,10 @@ public void start(Promise<Void> startFuture) {
7880
Router router = Router.router(vertx);
7981

8082
// bump up the connection pool size from the default value of 5
81-
final HttpClient client = vertx.createHttpClient(new HttpClientOptions().setMaxPoolSize(
82-
getHttpMaxPoolSize()));
83+
int httpMaxPoolSize = getHttpMaxPoolSize();
84+
final HttpClient client = vertx.createHttpClient(new PoolOptions()
85+
.setHttp1MaxSize(httpMaxPoolSize)
86+
.setHttp2MaxSize(httpMaxPoolSize));
8387

8488
this.server = vertx.createHttpServer();
8589

@@ -145,6 +149,7 @@ public void start(Promise<Void> startFuture) {
145149
new ScheduledDigitalRemindersProcessingResource(client).register(router);
146150
new DueDateNotRealTimeScheduledNoticeProcessingResource(client).register(router);
147151
new RequestScheduledNoticeProcessingResource(client).register(router);
152+
new RequestAnonymizationResource(client).register(router);
148153
new FeeFineScheduledNoticeProcessingResource(client).register(router);
149154
new FeeFineNotRealTimeScheduledNoticeProcessingResource(client).register(router);
150155
new OverdueFineScheduledNoticeProcessingResource(client).register(router);
@@ -153,6 +158,7 @@ public void start(Promise<Void> startFuture) {
153158
new LoanAnonymizationResource(client).register(router);
154159
new DeclareLostResource(client).register(router);
155160
new ScheduledAnonymizationProcessingResource(client).register(router);
161+
new ScheduledRequestAnonymizationProcessingResource(client).register(router);
156162
new EndPatronActionSessionResource(client).register(router);
157163
new ClaimItemReturnedResource(client).register(router);
158164
new ChangeDueDateResource(client).register(router);
@@ -169,13 +175,11 @@ public void start(Promise<Void> startFuture) {
169175
new PrintEventsResource(client).register(router);
170176

171177
server.requestHandler(router)
172-
.listen(config().getInteger("port"), result -> {
173-
if (result.succeeded()) {
174-
log.info("Listening on {}", server.actualPort());
175-
startFuture.complete();
176-
} else {
177-
startFuture.fail(result.cause());
178-
}
178+
.listen(config().getInteger("port"))
179+
.onFailure(startFuture::fail)
180+
.onSuccess(httpServer -> {
181+
log.info("Listening on {}", server.actualPort());
182+
startFuture.complete();
179183
});
180184
}
181185

@@ -184,15 +188,13 @@ public void stop(Promise<Void> stopFuture) {
184188
final Logger log = LogManager.getLogger(MethodHandles.lookup().lookupClass());
185189
log.info("Stopping circulation module");
186190

187-
if(server != null) {
188-
server.close(result -> {
189-
if (result.succeeded()) {
191+
if (server != null) {
192+
server.close()
193+
.onFailure(stopFuture::fail)
194+
.onSuccess(v -> {
190195
log.info("Stopped listening on {}", server.actualPort());
191196
stopFuture.complete();
192-
} else {
193-
stopFuture.fail(result.cause());
194-
}
195-
});
197+
});
196198
}
197199
}
198200
}

0 commit comments

Comments
 (0)