Skip to content

Commit bd32f54

Browse files
authored
Merge pull request #187 from NyashaMuusha/JMPI-add-matching-rule-to-audit-trail
Jmpi add matching rule to audit trail
2 parents b5183ea + 80dfe79 commit bd32f54

File tree

19 files changed

+274
-144
lines changed

19 files changed

+274
-144
lines changed

JeMPI_Apps/JeMPI_Bootstrapper/src/main/resources/data/postgres/audit-schema.sql

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ CREATE TABLE IF NOT EXISTS audit_trail (
22
id UUID NOT NULL DEFAULT gen_random_uuid(),
33
insertedAt TIMESTAMP NOT NULL DEFAULT now(),
44
createdAt TIMESTAMP NOT NULL,
5-
interactionID VARCHAR(64),
6-
goldenID VARCHAR(64),
7-
event VARCHAR(256),
5+
eventType VARCHAR(256),
6+
eventData JSONB,
87
CONSTRAINT PKEY_AUDIT_TRAIL PRIMARY KEY (id)
98
);
10-
CREATE INDEX IF NOT EXISTS idx_gid ON audit_trail(goldenID);
11-
CREATE INDEX IF NOT EXISTS idx_iid ON audit_trail(interactionID);
9+
CREATE INDEX IF NOT EXISTS idx_eventdata ON audit_trail USING GIN (eventData jsonb_path_ops);
10+
CREATE INDEX IF NOT EXISTS idx_eventtype ON audit_trail(eventType);

JeMPI_Apps/JeMPI_Controller/src/main/java/org/jembi/jempi/controller/PsqlAuditTrail.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.jembi.jempi.shared.models.AuditEvent;
77

88
import java.sql.SQLException;
9+
import java.sql.Types;
910
import java.util.Locale;
1011

1112
import static org.jembi.jempi.shared.models.GlobalConstants.PSQL_TABLE_AUDIT_TRAIL;
@@ -53,17 +54,17 @@ CONSTRAINT PKEY_AUDIT_TRAIL PRIMARY KEY (id)
5354
*/
5455
}
5556

56-
void addAuditEvent(final AuditEvent event) {
57+
void addAuditEvent(final AuditEvent auditEvent) {
5758
psqlClient.connect(AppConfig.POSTGRESQL_AUDIT_DB);
59+
5860
try (var preparedStatement = psqlClient.prepareStatement(String.format(Locale.ROOT, """
59-
INSERT INTO %s (createdAt, interactionID, goldenID, event)
60-
VALUES (?, ?, ?, ?);
61+
INSERT INTO %s (createdAt, eventType, eventData)
62+
VALUES (?, ?, ?::json);
6163
""", PSQL_TABLE_AUDIT_TRAIL)
62-
.stripIndent())) {
63-
preparedStatement.setTimestamp(1, event.createdAt());
64-
preparedStatement.setString(2, event.interactionID());
65-
preparedStatement.setString(3, event.goldenID());
66-
preparedStatement.setString(4, event.event());
64+
.stripIndent())) {
65+
preparedStatement.setTimestamp(1, auditEvent.createdAt());
66+
preparedStatement.setString(2, auditEvent.eventType().name());
67+
preparedStatement.setObject(3, auditEvent.eventData(), Types.OTHER);
6768
preparedStatement.executeUpdate();
6869
} catch (SQLException e) {
6970
LOGGER.error(e.getLocalizedMessage(), e);

JeMPI_Apps/JeMPI_LibAPI/src/main/java/org/jembi/jempi/libapi/BackEnd.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ public record GetGoldenRecordAuditTrailRequest(
505505
String uid) implements Event {
506506
}
507507

508-
public record GetGoldenRecordAuditTrailResponse(List<AuditEvent> auditTrail) {
508+
public record GetGoldenRecordAuditTrailResponse(List<ApiModels.ApiAuditTrail.LinkingAuditEntry> auditTrail) {
509509
}
510510

511511
public record GetInteractionAuditTrailRequest(
@@ -519,7 +519,7 @@ public record SQLDashboardDataRequest(
519519
ActorRef<SQLDashboardDataResponse> replyTo) implements Event {
520520
}
521521

522-
public record GetInteractionAuditTrailResponse(List<AuditEvent> auditTrail) {
522+
public record GetInteractionAuditTrailResponse(List<ApiModels.ApiAuditTrail.LinkingAuditEntry> auditTrail) {
523523
}
524524

525525

JeMPI_Apps/JeMPI_LibAPI/src/main/java/org/jembi/jempi/libapi/PsqlAuditTrail.java

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
import org.apache.logging.log4j.LogManager;
44
import org.apache.logging.log4j.Logger;
5-
import org.jembi.jempi.shared.models.AuditEvent;
5+
import org.jembi.jempi.shared.models.ApiModels;
6+
import org.jembi.jempi.shared.models.GlobalConstants;
7+
import org.jembi.jempi.shared.models.LinkingAuditEventData;
8+
import org.jembi.jempi.shared.utils.AuditTrailBridge;
69

710
import java.sql.PreparedStatement;
811
import java.sql.ResultSet;
9-
import java.util.ArrayList;
10-
import java.util.List;
11-
import java.util.Locale;
12+
import java.util.*;
1213

1314
import static org.jembi.jempi.shared.models.GlobalConstants.PSQL_TABLE_AUDIT_TRAIL;
1415

@@ -25,49 +26,67 @@ final class PsqlAuditTrail {
2526
psqlClient = new PsqlClient(pgServer, pgPort, pgDatabase, pgUser, pgPassword);
2627
}
2728

28-
List<AuditEvent> goldenRecordAuditTrail(final String uid) {
29+
List<ApiModels.ApiAuditTrail.LinkingAuditEntry> goldenRecordAuditTrail(final String uid) {
2930
psqlClient.connect();
30-
final var list = new ArrayList<AuditEvent>();
31+
final var list = new ArrayList<ApiModels.ApiAuditTrail.LinkingAuditEntry>();
3132
try (PreparedStatement preparedStatement = psqlClient.prepareStatement(String.format(Locale.ROOT,
32-
"""
33-
SELECT * FROM %s where goldenID = ?;
34-
""",
35-
PSQL_TABLE_AUDIT_TRAIL)
36-
.stripIndent())) {
37-
preparedStatement.setString(1, uid);
33+
"SELECT * FROM %s WHERE eventType = ? AND eventData ->> 'goldenID' = ?",
34+
PSQL_TABLE_AUDIT_TRAIL))) {
35+
preparedStatement.setString(1, GlobalConstants.AuditEventType.LINKING_EVENT.name());
36+
preparedStatement.setString(2, uid);
3837
ResultSet rs = preparedStatement.executeQuery();
3938
while (rs.next()) {
40-
final var insertedAt = rs.getTimestamp(2);
41-
final var createdAt = rs.getTimestamp(3);
42-
final var interactionID = rs.getString(4);
43-
final var goldenID = rs.getString(5);
44-
final var event = rs.getString(6);
45-
list.add(new AuditEvent(createdAt, insertedAt, interactionID, goldenID, event));
39+
final var insertTime = rs.getString(2);
40+
final var createdTime = rs.getString(3);
41+
final var eventType = rs.getString(4);
42+
final var eventData = rs.getString(5);
43+
if (Objects.equals(eventType, GlobalConstants.AuditEventType.LINKING_EVENT.name())) {
44+
LinkingAuditEventData deserializeEventData = AuditTrailBridge.getDeserializeEventData(eventData, LinkingAuditEventData.class);
45+
list.add(new ApiModels.ApiAuditTrail.LinkingAuditEntry(
46+
insertTime,
47+
createdTime,
48+
deserializeEventData.interaction_id(),
49+
deserializeEventData.goldenID(),
50+
deserializeEventData.message(),
51+
deserializeEventData.score(),
52+
deserializeEventData.linkingRule().name()
53+
));
54+
}
4655
}
4756
} catch (Exception e) {
4857
LOGGER.error(e);
4958
}
5059
return list;
5160
}
5261

53-
List<AuditEvent> interactionRecordAuditTrail(final String uid) {
62+
List<ApiModels.ApiAuditTrail.LinkingAuditEntry> interactionRecordAuditTrail(final String uid) {
5463
psqlClient.connect();
55-
final var list = new ArrayList<AuditEvent>();
56-
try (PreparedStatement preparedStatement = psqlClient.prepareStatement(String.format(Locale.ROOT,
57-
"""
58-
SELECT * FROM %s where interactionID = ?;
59-
""",
60-
PSQL_TABLE_AUDIT_TRAIL)
61-
.stripIndent())) {
62-
preparedStatement.setString(1, uid);
64+
final var list = new ArrayList<ApiModels.ApiAuditTrail.LinkingAuditEntry>();
65+
try (PreparedStatement preparedStatement = psqlClient.prepareStatement(String.format(
66+
Locale.ROOT,
67+
"SELECT * FROM %s WHERE eventType = ? AND eventData ->> 'interaction_id' = ?",
68+
PSQL_TABLE_AUDIT_TRAIL))) {
69+
preparedStatement.setString(1, GlobalConstants.AuditEventType.LINKING_EVENT.name());
70+
preparedStatement.setString(2, uid);
6371
ResultSet rs = preparedStatement.executeQuery();
6472
while (rs.next()) {
65-
final var insertedAt = rs.getTimestamp(2);
66-
final var createdAt = rs.getTimestamp(3);
67-
final var interactionID = rs.getString(4);
68-
final var goldenID = rs.getString(5);
69-
final var event = rs.getString(6);
70-
list.add(new AuditEvent(createdAt, insertedAt, interactionID, goldenID, event));
73+
final var insertTime = rs.getString(2);
74+
final var createdTime = rs.getString(3);
75+
final var eventType = rs.getString(4);
76+
final var eventData = rs.getString(5);
77+
78+
if (Objects.equals(eventType, GlobalConstants.AuditEventType.LINKING_EVENT.name())) {
79+
LinkingAuditEventData deserializeEventData = AuditTrailBridge.getDeserializeEventData(eventData, LinkingAuditEventData.class);
80+
list.add(new ApiModels.ApiAuditTrail.LinkingAuditEntry(
81+
insertTime,
82+
createdTime,
83+
deserializeEventData.interaction_id(),
84+
deserializeEventData.goldenID(),
85+
deserializeEventData.message(),
86+
deserializeEventData.score(),
87+
deserializeEventData.linkingRule().name()
88+
));
89+
}
7190
}
7291
} catch (Exception e) {
7392
LOGGER.error(e);

JeMPI_Apps/JeMPI_LibAPI/src/main/java/org/jembi/jempi/libapi/Routes.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -111,33 +111,24 @@ public static Route getGoldenRecordAuditTrail(
111111
final ActorRef<BackEnd.Event> backEnd) {
112112
return parameter("gid",
113113
uid -> onComplete(Ask.getGoldenRecordAuditTrail(actorSystem, backEnd, uid),
114-
result -> {
115-
if (!result.isSuccess()) {
116-
LOGGER.warn("IM_A_TEAPOT");
117-
}
118-
return result.isSuccess()
119-
? complete(StatusCodes.OK,
120-
ApiModels.ApiAuditTrail.fromAuditTrail(result.get().auditTrail()),
121-
JSON_MARSHALLER)
122-
: complete(ApiModels.getHttpErrorResponse(GlobalConstants.IM_A_TEA_POT));
123-
}));
114+
result -> result.isSuccess()
115+
? complete(StatusCodes.OK,
116+
result.get().auditTrail(),
117+
JSON_MARSHALLER)
118+
: complete(ApiModels.getHttpErrorResponse(StatusCodes.IM_A_TEAPOT))));
119+
124120
}
125121

126122
public static Route getInteractionAuditTrail(
127123
final ActorSystem<Void> actorSystem,
128124
final ActorRef<BackEnd.Event> backEnd) {
129125
return parameter("iid",
130126
uid -> onComplete(Ask.getInteractionAuditTrail(actorSystem, backEnd, uid),
131-
result -> {
132-
if (!result.isSuccess()) {
133-
LOGGER.warn("IM_A_TEAPOT");
134-
}
135-
return result.isSuccess()
136-
? complete(StatusCodes.OK,
137-
ApiModels.ApiAuditTrail.fromAuditTrail(result.get().auditTrail()),
138-
JSON_MARSHALLER)
139-
: complete(ApiModels.getHttpErrorResponse(GlobalConstants.IM_A_TEA_POT));
140-
}));
127+
result -> result.isSuccess()
128+
? complete(StatusCodes.OK,
129+
result.get().auditTrail(),
130+
JSON_MARSHALLER)
131+
: complete(ApiModels.getHttpErrorResponse(StatusCodes.IM_A_TEAPOT))));
141132
}
142133

143134
public static Route patchIidNewGidLink(

0 commit comments

Comments
 (0)