Skip to content
This repository has been archived by the owner on Feb 7, 2025. It is now read-only.

621: Implement check for linked orders/results #988

Merged
merged 92 commits into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
4dfe42a
Refactored to invert if
basiliskus Mar 29, 2024
5096feb
added skeleton for methods to implement
basiliskus Mar 29, 2024
aab57cf
Added methods to retrieve linked metadata
basiliskus Mar 29, 2024
8bda229
Added methods to get linked messages records
basiliskus Mar 29, 2024
c0c99bf
Reverted if-statement inversion
basiliskus Apr 1, 2024
be11531
WIP: implementation to save message links
basiliskus Apr 1, 2024
e4d5b7b
Refactored query to use self-join instead of nested query
basiliskus Apr 1, 2024
129b448
Added MessageLink and fixed db retrieval
basiliskus Apr 1, 2024
e00fa8f
Refactored to fix retrieval logic
basiliskus Apr 1, 2024
97ac36a
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
basiliskus Apr 2, 2024
3f43dc6
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
basiliskus Apr 2, 2024
ccb97b8
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
basiliskus Apr 2, 2024
e698f41
Added implementation for FilePartnerMetadataStorage.readMetadataForMe…
basiliskus Apr 3, 2024
07da76a
Added interface and custom exception, renamed classes for consistency…
basiliskus Apr 3, 2024
a975a91
Added implementation for FileMessageLinkStorage methods and registere…
basiliskus Apr 3, 2024
32d3efe
Refactored MessageLink to abstract from db structure and reflect use …
basiliskus Apr 4, 2024
d141281
Added test coverage for FileMessageLinkStorage
basiliskus Apr 4, 2024
ba0b8b3
Added calls to findMessagesIdsToLink and linkMessages in SendMessageH…
basiliskus Apr 4, 2024
534ac83
Fixed implementation for linkMessages and added test coverage for new…
basiliskus Apr 5, 2024
b34eb10
Adde tests for MessageLink and MessageLinkException
basiliskus Apr 5, 2024
9068b2a
Fixed failing test
basiliskus Apr 5, 2024
2c87674
Added test coverage for FileMessageLinkStorage
basiliskus Apr 5, 2024
12016a4
Added DatabaseMessageLinkStorage tests
jherrflexion Apr 5, 2024
8135b71
Fixed and added tests for readMetadataForMessageLinking
basiliskus Apr 5, 2024
9b12c6b
Added tests for DatabasePartnerMetadataStorage
jherrflexion Apr 5, 2024
08fcbb3
added test coverage for linkMessages
basiliskus Apr 5, 2024
5f5515d
Added javadocs
basiliskus Apr 5, 2024
4d9c40d
Adding logs
basiliskus Apr 5, 2024
9f81d65
Added more logs
basiliskus Apr 5, 2024
cf4e7a9
Changed query to make sure we're not duplicating records
basiliskus Apr 5, 2024
51c842e
Fixed query
basiliskus Apr 5, 2024
63a1161
Fixed insert of message link and handle race condition
basiliskus Apr 5, 2024
5a1f3e4
Fixed tests
basiliskus Apr 5, 2024
c607bfa
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
basiliskus Apr 5, 2024
537c5b7
Fixed build issues due to merged changes
basiliskus Apr 5, 2024
76b0b12
Fixed Etor unit tests
jherrflexion Apr 8, 2024
4a966cc
Fixed Orchestrator tests
jherrflexion Apr 8, 2024
80ea636
Fixed Send UseCase tests
jherrflexion Apr 8, 2024
81143d2
Fixed Metadata storage tests
jherrflexion Apr 8, 2024
df7ab9b
Fixed Metadata storage tests
jherrflexion Apr 8, 2024
429f821
Fixed Hapi tests
jherrflexion Apr 8, 2024
c060392
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 9, 2024
226ac72
SendMessageHelper is fully covered
luis-pabon-tf Apr 9, 2024
999f83f
Update SendMessageHelperTest.groovy
luis-pabon-tf Apr 9, 2024
7222e97
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 9, 2024
7daf959
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 9, 2024
d9af58f
Added fetchMessageLink tests
jherrflexion Apr 9, 2024
a389695
Added fetchMessageLink tests
jherrflexion Apr 9, 2024
592c3df
Added insertMessageLink tests
jherrflexion Apr 9, 2024
dc96658
Merge branch 'story/621/check-link-exists' of https://github.com/CDCg…
jherrflexion Apr 9, 2024
0c1097d
Added test for fetchMetadataForMessageLinking
jherrflexion Apr 9, 2024
0743982
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 9, 2024
e9dde37
Merge branch 'story/621/check-link-exists' of https://github.com/CDCg…
luis-pabon-tf Apr 9, 2024
2337cd4
Making sure to close db connection
basiliskus Apr 10, 2024
91d221b
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 10, 2024
51053e5
Merge branch 'story/621/check-link-exists' of https://github.com/CDCg…
luis-pabon-tf Apr 10, 2024
6e0b16a
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 10, 2024
66a8db5
Added test for SqlException
jherrflexion Apr 10, 2024
be6cc44
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 10, 2024
e529f58
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 11, 2024
dd6cde8
Update PartnerMetadataOrchestratorTest.groovy
luis-pabon-tf Apr 11, 2024
e07a487
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 11, 2024
2ce0db3
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 11, 2024
8788985
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 11, 2024
8a5a9ef
Update PostgresDaoTest.groovy
luis-pabon-tf Apr 11, 2024
019c95e
Update DatabasePartnerMetadataStorageTest.groovy
luis-pabon-tf Apr 11, 2024
8d50a26
Merge branch 'story-621-save_new_metadata' into story/621/check-link-…
luis-pabon-tf Apr 11, 2024
6a2d7d7
Merge branch 'main' into story/621/check-link-exists
basiliskus Apr 11, 2024
52a96de
Added missing override tags
basiliskus Apr 11, 2024
ff145fe
Split doc loading into a separate method
luis-pabon-tf Apr 11, 2024
c2393c7
Update EtorDomainRegistration.java
luis-pabon-tf Apr 11, 2024
e0c68ac
Update EtorDomainRegistrationTest.groovy
luis-pabon-tf Apr 11, 2024
1a7461c
Reverted back to null check to avoid null pointer exception
basiliskus Apr 11, 2024
ddbf36c
Fixed e2e test
basiliskus Apr 11, 2024
8d3bd35
Added a todo comment and removed unused import
basiliskus Apr 11, 2024
c9e5b5e
Merge branch 'main' into story/621/check-link-exists
basiliskus Apr 12, 2024
09f2bcf
Merge branch 'main' into story/621/check-link-exists
luis-pabon-tf Apr 12, 2024
a1f0809
Added migration scripts
basiliskus Apr 12, 2024
113d026
Made changes to reflect update made to link_id data type from int to …
basiliskus Apr 12, 2024
1d1b9ce
Merge branch 'main' into story/621/check-link-exists
basiliskus Apr 15, 2024
29ce246
Simplified set handling
basiliskus Apr 15, 2024
776bfc1
Fixed tests
basiliskus Apr 15, 2024
a21a5a5
Refactored to remove insertMessageLink and resuse upsertData
basiliskus Apr 15, 2024
8972370
Added linkMessage to Send Result UseCase and moved to link right afte…
basiliskus Apr 15, 2024
59ae84a
Refactored to avoid dealing with null linkId
basiliskus Apr 15, 2024
ac39308
Moved PostgresDao.fetchMessageLink logic to DatabaseMessageLinkStorag…
basiliskus Apr 15, 2024
43481a3
Added test coverage
basiliskus Apr 15, 2024
2752ac6
Fixed foreign key creation
basiliskus Apr 15, 2024
7b1080b
Refactored upsertData to be more generic in handling ON CONFLICT
basiliskus Apr 15, 2024
9ed1fc5
Made improvements based on PR feedback
basiliskus Apr 15, 2024
0d5b389
Removed test that should be included in validateGettersAndSetters
basiliskus Apr 15, 2024
9c63ce8
Added test coverage
basiliskus Apr 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gov.hhs.cdc.trustedintermediary.etor.metadata.partner;

import gov.hhs.cdc.trustedintermediary.etor.RSEndpointClient;
import gov.hhs.cdc.trustedintermediary.external.database.DatabaseLinkedMessageStorage;
import gov.hhs.cdc.trustedintermediary.external.reportstream.ReportStreamEndpointClientException;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import gov.hhs.cdc.trustedintermediary.wrappers.formatter.Formatter;
Expand All @@ -11,6 +12,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;

Expand All @@ -24,6 +26,7 @@ public class PartnerMetadataOrchestrator {
private static final PartnerMetadataOrchestrator INSTANCE = new PartnerMetadataOrchestrator();

@Inject PartnerMetadataStorage partnerMetadataStorage;
@Inject DatabaseLinkedMessageStorage linkedMessageStorage;
@Inject RSEndpointClient rsclient;
@Inject Formatter formatter;
@Inject Logger logger;
Expand Down Expand Up @@ -143,43 +146,45 @@ public Optional<PartnerMetadata> getMetadata(String receivedSubmissionId)

PartnerMetadata partnerMetadata = optionalPartnerMetadata.get();
var sentSubmissionId = partnerMetadata.sentSubmissionId();
if (metadataIsStale(partnerMetadata) && sentSubmissionId != null) {
logger.logInfo(
"Receiver name not found in metadata or delivery status still pending, looking up {} from RS history API",
sentSubmissionId);

String receiver;
String rsStatus;
String rsMessage = "";
String timeDelivered;
try {
String bearerToken = rsclient.getRsToken();
String responseBody =
rsclient.requestHistoryEndpoint(sentSubmissionId, bearerToken);
var parsedResponseBody = getDataFromReportStream(responseBody);
receiver = parsedResponseBody[0];
rsStatus = parsedResponseBody[1];
rsMessage = parsedResponseBody[2];
timeDelivered = parsedResponseBody[3];
} catch (ReportStreamEndpointClientException | FormatterProcessingException e) {
throw new PartnerMetadataException(
"Unable to retrieve metadata from RS history API", e);
}

var ourStatus = ourStatusFromReportStreamStatus(rsStatus);
if (!metadataIsStale(partnerMetadata) || sentSubmissionId == null) {
basiliskus marked this conversation as resolved.
Show resolved Hide resolved
return Optional.of(partnerMetadata);
}

logger.logInfo("Updating metadata with receiver {} and status {}", receiver, ourStatus);
partnerMetadata = partnerMetadata.withReceiver(receiver).withDeliveryStatus(ourStatus);
logger.logInfo(
"Receiver name not found in metadata or delivery status still pending, looking up {} from RS history API",
sentSubmissionId);

if (ourStatus == PartnerMetadataStatus.FAILED) {
partnerMetadata = partnerMetadata.withFailureMessage(rsMessage);
} else if (ourStatus == PartnerMetadataStatus.DELIVERED && timeDelivered != null) {
partnerMetadata = partnerMetadata.withTimeDelivered(Instant.parse(timeDelivered));
}
String receiver;
String rsStatus;
String rsMessage;
String timeDelivered;
try {
String bearerToken = rsclient.getRsToken();
String responseBody = rsclient.requestHistoryEndpoint(sentSubmissionId, bearerToken);
var parsedResponseBody = getDataFromReportStream(responseBody);
receiver = parsedResponseBody[0];
rsStatus = parsedResponseBody[1];
rsMessage = parsedResponseBody[2];
timeDelivered = parsedResponseBody[3];
} catch (ReportStreamEndpointClientException | FormatterProcessingException e) {
throw new PartnerMetadataException(
"Unable to retrieve metadata from RS history API", e);
}

partnerMetadataStorage.saveMetadata(partnerMetadata);
var ourStatus = ourStatusFromReportStreamStatus(rsStatus);

logger.logInfo("Updating metadata with receiver {} and status {}", receiver, ourStatus);
partnerMetadata = partnerMetadata.withReceiver(receiver).withDeliveryStatus(ourStatus);

if (ourStatus == PartnerMetadataStatus.FAILED) {
partnerMetadata = partnerMetadata.withFailureMessage(rsMessage);
} else if (ourStatus == PartnerMetadataStatus.DELIVERED && timeDelivered != null) {
partnerMetadata = partnerMetadata.withTimeDelivered(Instant.parse(timeDelivered));
}

partnerMetadataStorage.saveMetadata(partnerMetadata);

return Optional.of(partnerMetadata);
}

Expand Down Expand Up @@ -319,6 +324,23 @@ PartnerMetadataStatus ourStatusFromReportStreamStatus(String rsStatus) {
};
}

boolean isMessageLinked(String receivedSubmissionId) throws Exception {
var linkedMessageSet = linkedMessageStorage.readLinkedMessages(receivedSubmissionId);
return !linkedMessageSet.isEmpty();
}

Set<String> findMessagesToLink(String receivedSubmissionId) throws PartnerMetadataException {
var metadataSet =
partnerMetadataStorage.readMetadataForLinkingMessages(receivedSubmissionId);
return metadataSet.stream()
.map(PartnerMetadata::receivedSubmissionId)
.collect(Collectors.toSet());
}

void linkMessages(Set<String> messagesToLink) {
// create entries in message_link table using receivedSubmissionIds in messagesToLink
}

private boolean metadataIsStale(PartnerMetadata partnerMetadata) {
return partnerMetadata.receiver() == null
|| partnerMetadata.deliveryStatus() == PartnerMetadataStatus.PENDING;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,7 @@ Optional<PartnerMetadata> readMetadata(String receivedSubmissionId)
* @return a set of {@link PartnerMetadata}s.
*/
Set<PartnerMetadata> readMetadataForSender(String sender) throws PartnerMetadataException;

Set<PartnerMetadata> readMetadataForLinkingMessages(String submissionId)
throws PartnerMetadataException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package gov.hhs.cdc.trustedintermediary.external.database;

import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import java.sql.SQLException;
import java.util.Set;
import javax.inject.Inject;

public class DatabaseLinkedMessageStorage {

@Inject DbDao dao;

@Inject Logger logger;

private static final DatabaseLinkedMessageStorage INSTANCE = new DatabaseLinkedMessageStorage();

private DatabaseLinkedMessageStorage() {}

public static DatabaseLinkedMessageStorage getInstance() {
return INSTANCE;
}

public Set<?> readLinkedMessages(String submissionId) throws Exception {
Set<?> linkedMessageSet;
try {
linkedMessageSet = dao.fetchLinkedMessages(submissionId);
} catch (SQLException e) {
throw new Exception("Error retrieving metadata", e);
}
return linkedMessageSet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,16 @@ public Set<PartnerMetadata> readMetadataForSender(String sender)
}
return consolidatedMetadata;
}

@Override
public Set<PartnerMetadata> readMetadataForLinkingMessages(String submissionId)
throws PartnerMetadataException {
Set<PartnerMetadata> metadataSet;
try {
metadataSet = dao.fetchMetadataForMessageLinking(submissionId);
} catch (SQLException e) {
throw new PartnerMetadataException("Error retrieving metadata", e);
}
return metadataSet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ void upsertMetadata(
PartnerMetadataMessageType messageType)
throws SQLException;

Object fetchMetadata(String uniqueId) throws SQLException;

Set<PartnerMetadata> fetchMetadataForSender(String sender) throws SQLException;

Object fetchMetadata(String uniqueId) throws SQLException;
Set<PartnerMetadata> fetchMetadataForMessageLinking(String submissionId) throws SQLException;

Set<PartnerMetadata> fetchLinkedMessages(String messageId) throws SQLException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,62 @@ public PartnerMetadata fetchMetadata(String submissionId) throws SQLException {
}
}

@Override
public Set<PartnerMetadata> fetchMetadataForMessageLinking(String submissionId)
throws SQLException {
var sql =
"""
SELECT m2.*
FROM metadata m1
JOIN metadata m2
ON m1.placer_order_number = m2.placer_order_number
AND m1.sending_application_id = m2.sending_application_id
AND m1.sending_facility_id = m2.sending_facility_id
WHERE m1.sent_message_id = ?;
""";

try (Connection conn = connectionPool.getConnection();
PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, submissionId);
ResultSet resultSet = statement.executeQuery();

Set<PartnerMetadata> metadataSet = new HashSet<>();

while (resultSet.next()) {
metadataSet.add(partnerMetadataFromResultSet(resultSet));
}

return metadataSet;
}
}

@Override
public Set<PartnerMetadata> fetchLinkedMessages(String messageId) throws SQLException {
var sql =
"""
basiliskus marked this conversation as resolved.
Show resolved Hide resolved
SELECT *
FROM message_link
WHERE link_id = (
SELECT link_id
FROM message_link
WHERE message_id = ?);
""";

try (Connection conn = connectionPool.getConnection();
PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, messageId);
ResultSet resultSet = statement.executeQuery();

Set<PartnerMetadata> metadataSet = new HashSet<>();

while (resultSet.next()) {
metadataSet.add(partnerMetadataFromResultSet(resultSet));
}

return metadataSet;
}
}

private PartnerMetadata partnerMetadataFromResultSet(ResultSet resultSet) throws SQLException {
Instant timeReceived = null;
Instant timeDelivered = null;
Expand Down