1
1
package org .folio .service ;
2
2
3
+ import io .vertx .core .AsyncResult ;
3
4
import io .vertx .core .Context ;
4
5
import io .vertx .core .Future ;
6
+ import io .vertx .core .Handler ;
7
+ import io .vertx .sqlclient .Row ;
8
+ import io .vertx .sqlclient .RowSet ;
9
+ import org .folio .rest .RestVerticle ;
5
10
import org .folio .rest .jaxrs .model .PrintEventsRequest ;
11
+ import org .folio .rest .jaxrs .model .PrintEventsStatusResponse ;
12
+ import org .folio .rest .jaxrs .model .PrintEventsStatusResponses ;
6
13
import org .folio .rest .jaxrs .resource .PrintEventsStorage ;
7
14
import org .folio .rest .model .PrintEvent ;
8
15
import org .folio .rest .persist .PgUtil ;
16
+ import org .folio .rest .persist .PostgresClient ;
9
17
import org .slf4j .Logger ;
10
18
import org .slf4j .LoggerFactory ;
11
19
12
20
import javax .ws .rs .core .Response ;
21
+ import java .time .ZoneOffset ;
22
+ import java .util .ArrayList ;
23
+ import java .util .Date ;
13
24
import java .util .List ;
14
25
import java .util .Map ;
26
+ import java .util .stream .Collectors ;
15
27
28
+ import static io .vertx .core .Future .succeededFuture ;
29
+ import static org .folio .rest .persist .PgUtil .postgresClient ;
30
+ import static org .folio .rest .persist .PostgresClient .convertToPsqlStandard ;
16
31
import static org .folio .support .ModuleConstants .PRINT_EVENTS_TABLE ;
17
32
18
33
public class PrintEventsService {
@@ -22,6 +37,23 @@ public class PrintEventsService {
22
37
private final Context vertxContext ;
23
38
private final Map <String , String > okapiHeaders ;
24
39
40
+ private static final String PRINT_EVENT_FETCH_QUERY = """
41
+ WITH cte AS (
42
+ SELECT id, jsonb->>'requestId' AS request_id, jsonb->>'printEventDate' AS last_updated_date,
43
+ jsonb->>'requesterName' AS requester_name, jsonb->>'requesterId' AS requester_id,
44
+ COUNT(*) OVER (PARTITION BY jsonb->>'requestId') AS request_count,
45
+ ROW_NUMBER() OVER (PARTITION BY jsonb->>'requestId'
46
+ ORDER BY (jsonb->>'printEventDate')::timestamptz DESC) AS rank
47
+ FROM %s.%s
48
+ where jsonb->>'requestId' in (%s)
49
+ )
50
+ SELECT request_id, requester_name, requester_id, request_count, (last_updated_date)::timestamptz
51
+ FROM cte
52
+ WHERE
53
+ rank = 1;
54
+ """ ;
55
+
56
+
25
57
26
58
public PrintEventsService (Context vertxContext , Map <String , String > okapiHeaders ) {
27
59
this .vertxContext = vertxContext ;
@@ -41,4 +73,53 @@ public Future<Response> create(PrintEventsRequest printEventRequest) {
41
73
return PgUtil .postSync (PRINT_EVENTS_TABLE , printEvents , MAX_ENTITIES , false , okapiHeaders , vertxContext ,
42
74
PrintEventsStorage .PostPrintEventsStoragePrintEventsEntryResponse .class );
43
75
}
76
+
77
+ public void getPrintEventRequestDetails (List <String > requestIds , Handler <AsyncResult <Response >> asyncResultHandler ) {
78
+ LOG .debug ("getPrintEventRequestDetails:: Fetching print event details for requestIds {}" , requestIds );
79
+ String tenantId = okapiHeaders .get (RestVerticle .OKAPI_HEADER_TENANT );
80
+ PostgresClient postgresClient = postgresClient (vertxContext , okapiHeaders );
81
+ postgresClient .execute (formatQuery (tenantId , requestIds ), handler -> {
82
+ try {
83
+ if (handler .succeeded ()) {
84
+ asyncResultHandler .handle (
85
+ succeededFuture (PrintEventsStorage .PostPrintEventsStoragePrintEventsStatusResponse
86
+ .respond200WithApplicationJson (mapRowSetToResponse (handler .result ()))));
87
+ } else {
88
+ LOG .warn ("getPrintEventRequestDetails:: Error while executing query" , handler .cause ());
89
+ asyncResultHandler .handle (succeededFuture (PrintEventsStorage .PostPrintEventsStoragePrintEventsStatusResponse
90
+ .respond500WithTextPlain (handler .cause ())));
91
+ }
92
+ } catch (Exception ex ) {
93
+ LOG .warn ("getPrintEventRequestDetails:: Error while fetching print details" , ex );
94
+ asyncResultHandler .handle (succeededFuture (PrintEventsStorage .PostPrintEventsStoragePrintEventsEntryResponse
95
+ .respond500WithTextPlain (ex .getMessage ())));
96
+ }
97
+ });
98
+ }
99
+
100
+ private String formatQuery (String tenantId , List <String > requestIds ) {
101
+ String formattedRequestIds = requestIds
102
+ .stream ()
103
+ .map (requestId -> "'" + requestId + "'" )
104
+ .collect (Collectors .joining (", " ));
105
+ return String .format (PRINT_EVENT_FETCH_QUERY , convertToPsqlStandard (tenantId ), PRINT_EVENTS_TABLE , formattedRequestIds );
106
+ }
107
+
108
+ private PrintEventsStatusResponses mapRowSetToResponse (RowSet <Row > rowSet ) {
109
+ PrintEventsStatusResponses printEventsStatusResponses = new PrintEventsStatusResponses ();
110
+ List <PrintEventsStatusResponse > responseList = new ArrayList <>();
111
+ rowSet .forEach (row -> {
112
+ var response = new PrintEventsStatusResponse ();
113
+ response .setRequestId (row .getString ("request_id" ));
114
+ response .setRequesterName (row .getString ("requester_name" ));
115
+ response .setRequesterId (row .getString ("requester_id" ));
116
+ response .setCount (row .getInteger ("request_count" ));
117
+ response .setPrintEventDate (Date .from (row .getLocalDateTime ("last_updated_date" )
118
+ .atZone (ZoneOffset .UTC ).toInstant ()));
119
+ responseList .add (response );
120
+ });
121
+ printEventsStatusResponses .setPrintEventsStatusResponses (responseList );
122
+ printEventsStatusResponses .setTotalRecords (rowSet .size ());
123
+ return printEventsStatusResponses ;
124
+ }
44
125
}
0 commit comments