diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/EmailMessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/EmailMessageDecorator.java index e1933998c7c..f9c3bb9070c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/EmailMessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/EmailMessageDecorator.java @@ -53,11 +53,11 @@ public class EmailMessageDecorator implements MessageDecorator { } @Override - public String getEntityUrl(String entityType, String fqn, String additionalParams) { + public String getEntityUrl(String prefix, String fqn, String additionalParams) { return String.format( "%s", getSmtpSettings().getOpenMetadataUrl(), - entityType, + prefix, fqn.trim(), nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams), fqn.trim()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/FeedMessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/FeedMessageDecorator.java index 05e580a9e4b..8b193e295ca 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/FeedMessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/FeedMessageDecorator.java @@ -51,11 +51,11 @@ public class FeedMessageDecorator implements MessageDecorator { } @Override - public String getEntityUrl(String entityType, String fqn, String additionalParams) { + public String getEntityUrl(String prefix, String fqn, String additionalParams) { return String.format( "[%s](/%s/%s%s)", fqn, - entityType, + prefix, fqn.trim(), nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams)); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/GChatMessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/GChatMessageDecorator.java index 93156f94efc..7a2374c6826 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/GChatMessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/GChatMessageDecorator.java @@ -55,11 +55,11 @@ public class GChatMessageDecorator implements MessageDecorator { } @Override - public String getEntityUrl(String entityType, String fqn, String additionalParams) { + public String getEntityUrl(String prefix, String fqn, String additionalParams) { return String.format( "<%s/%s/%s%s|%s>", getSmtpSettings().getOpenMetadataUrl(), - entityType, + prefix, fqn.trim().replace(" ", "%20"), nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams), fqn.trim()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MSTeamsMessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MSTeamsMessageDecorator.java index 36c83d5e295..d76fcf8cee3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MSTeamsMessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MSTeamsMessageDecorator.java @@ -55,12 +55,12 @@ public class MSTeamsMessageDecorator implements MessageDecorator { } @Override - public String getEntityUrl(String entityType, String fqn, String additionalParams) { + public String getEntityUrl(String prefix, String fqn, String additionalParams) { return String.format( "[%s](/%s/%s%s)", fqn.trim(), getSmtpSettings().getOpenMetadataUrl(), - entityType, + prefix, nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams)); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java index 3a5716de148..e08d932d7a1 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/MessageDecorator.java @@ -34,6 +34,7 @@ import org.openmetadata.schema.entity.feed.Thread; import org.openmetadata.schema.tests.TestCase; import org.openmetadata.schema.type.ChangeEvent; import org.openmetadata.schema.type.Include; +import org.openmetadata.schema.type.ThreadType; import org.openmetadata.service.Entity; import org.openmetadata.service.exception.UnhandledServerException; import org.openmetadata.service.resources.feeds.MessageParser; @@ -60,7 +61,7 @@ public interface MessageDecorator { String getRemoveMarkerClose(); - String getEntityUrl(String entityType, String fqn, String additionalInput); + String getEntityUrl(String prefix, String fqn, String additionalInput); T buildEntityMessage(ChangeEvent event); @@ -77,10 +78,8 @@ public interface MessageDecorator { // Hande Test Case if (entityType.equals(Entity.TEST_CASE)) { TestCase testCase = (TestCase) entityInterface; - MessageParser.EntityLink link = MessageParser.EntityLink.parse(testCase.getEntityLink()); - // TODO: this needs to be fixed no way to know the UI redirection return getEntityUrl( - link.getEntityType(), link.getEntityFQN(), "profiler?activeTab=Data%20Quality"); + "incident-manager", testCase.getFullyQualifiedName(), "test-case-results"); } // Glossary Term @@ -98,6 +97,38 @@ public interface MessageDecorator { return getEntityUrl(entityType, fqn, ""); } + default String buildThreadUrl( + ThreadType threadType, String entityType, EntityInterface entityInterface) { + String activeTab = + threadType.equals(ThreadType.Task) ? "activity_feed/tasks" : "activity_feed/all"; + String fqn = entityInterface.getFullyQualifiedName(); + if (CommonUtil.nullOrEmpty(fqn)) { + EntityInterface result = + Entity.getEntity(entityType, entityInterface.getId(), "id", Include.NON_DELETED); + fqn = result.getFullyQualifiedName(); + } + + // Hande Test Case + if (entityType.equals(Entity.TEST_CASE)) { + TestCase testCase = (TestCase) entityInterface; + return getEntityUrl("incident-manager", testCase.getFullyQualifiedName(), "issues"); + } + + // Glossary Term + if (entityType.equals(Entity.GLOSSARY_TERM)) { + // Glossary Term is a special case where the URL is different + return getEntityUrl(Entity.GLOSSARY, fqn, activeTab); + } + + // Tag + if (entityType.equals(Entity.TAG)) { + // Tags need to be redirected to Classification Page + return getEntityUrl("tags", fqn.split("\\.")[0], ""); + } + + return getEntityUrl(entityType, fqn, activeTab); + } + default T buildOutgoingMessage(ChangeEvent event) { if (event.getEntityType().equals(Entity.THREAD)) { return buildThreadMessage(event); @@ -195,18 +226,21 @@ public interface MessageDecorator { String headerMessage = ""; List attachmentList = new ArrayList<>(); + + String assetUrl = + getThreadAssetsUrl(thread.getType(), MessageParser.EntityLink.parse(thread.getAbout())); switch (thread.getType()) { case Conversation -> { switch (event.getEventType()) { case THREAD_CREATED -> { headerMessage = String.format( - "@%s started a conversation for asset %s", - thread.getCreatedBy(), thread.getAbout()); + "@%s started a conversation for asset %s", thread.getCreatedBy(), assetUrl); attachmentList.add(replaceEntityLinks(thread.getMessage())); } case POST_CREATED -> { - headerMessage = String.format("@%s posted a message", thread.getCreatedBy()); + headerMessage = + String.format("@%s posted a message on asset %s", thread.getCreatedBy(), assetUrl); attachmentList.add( String.format( "@%s : %s", thread.getCreatedBy(), replaceEntityLinks(thread.getMessage()))); @@ -221,7 +255,9 @@ public interface MessageDecorator { } case THREAD_UPDATED -> { headerMessage = - String.format("@%s posted update on Conversation", thread.getUpdatedBy()); + String.format( + "@%s posted update on Conversation for asset %s", + thread.getUpdatedBy(), assetUrl); attachmentList.add(replaceEntityLinks(thread.getMessage())); } } @@ -232,7 +268,7 @@ public interface MessageDecorator { headerMessage = String.format( "@%s created a Task for %s %s", - thread.getCreatedBy(), entityLink.getEntityType(), entityUrl); + thread.getCreatedBy(), entityLink.getEntityType(), assetUrl); attachmentList.add(String.format("Task Type : %s", thread.getTask().getType().value())); attachmentList.add( String.format( @@ -246,8 +282,8 @@ public interface MessageDecorator { case POST_CREATED -> { headerMessage = String.format( - "@%s posted a message on the Task with Id : %s", - thread.getCreatedBy(), thread.getTask().getId()); + "@%s posted a message on the Task with Id : %s for Asset %s", + thread.getCreatedBy(), thread.getTask().getId(), assetUrl); thread .getPosts() .forEach( @@ -260,8 +296,8 @@ public interface MessageDecorator { case THREAD_UPDATED -> { headerMessage = String.format( - "@%s posted update on the Task with Id : %s", - thread.getUpdatedBy(), thread.getTask().getId()); + "@%s posted update on the Task with Id : %s for Asset %s", + thread.getUpdatedBy(), thread.getTask().getId(), assetUrl); attachmentList.add(String.format("Task Type : %s", thread.getTask().getType().value())); attachmentList.add( String.format( @@ -275,15 +311,15 @@ public interface MessageDecorator { case TASK_CLOSED -> { headerMessage = String.format( - "@%s closed Task with Id : %s", - thread.getCreatedBy(), thread.getTask().getId()); + "@%s closed Task with Id : %s for Asset %s", + thread.getCreatedBy(), thread.getTask().getId(), assetUrl); attachmentList.add(String.format("Current Status : %s", thread.getTask().getStatus())); } case TASK_RESOLVED -> { headerMessage = String.format( - "@%s resolved Task with Id : %s", - thread.getCreatedBy(), thread.getTask().getId()); + "@%s resolved Task with Id : %s for Asset %s", + thread.getCreatedBy(), thread.getTask().getId(), assetUrl); attachmentList.add(String.format("Current Status : %s", thread.getTask().getStatus())); } } @@ -341,6 +377,18 @@ public interface MessageDecorator { return message; } + default String getThreadAssetsUrl( + ThreadType threadType, MessageParser.EntityLink aboutEntityLink) { + try { + return this.buildThreadUrl( + threadType, + aboutEntityLink.getEntityType(), + Entity.getEntity(aboutEntityLink, "id", Include.ALL)); + } catch (Exception ex) { + return ""; + } + } + private String getDateString(long epochTimestamp) { Instant instant = Instant.ofEpochSecond(epochTimestamp); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/SlackMessageDecorator.java b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/SlackMessageDecorator.java index 2075eb236a6..b18446a08ac 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/SlackMessageDecorator.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/formatter/decorators/SlackMessageDecorator.java @@ -55,11 +55,11 @@ public class SlackMessageDecorator implements MessageDecorator { return "~"; } - public String getEntityUrl(String entityType, String fqn, String additionalParams) { + public String getEntityUrl(String prefix, String fqn, String additionalParams) { return String.format( "<%s/%s/%s%s|%s>", getSmtpSettings().getOpenMetadataUrl(), - entityType, + prefix, fqn.trim().replaceAll(" ", "%20"), nullOrEmpty(additionalParams) ? "" : String.format("/%s", additionalParams), fqn.trim()); diff --git a/openmetadata-service/src/main/resources/json/data/eventsubscription/ActivityFeedEvents.json b/openmetadata-service/src/main/resources/json/data/eventsubscription/ActivityFeedEvents.json index f2f6cb774e5..1abf827e266 100644 --- a/openmetadata-service/src/main/resources/json/data/eventsubscription/ActivityFeedEvents.json +++ b/openmetadata-service/src/main/resources/json/data/eventsubscription/ActivityFeedEvents.json @@ -20,7 +20,7 @@ { "name": "matchAnyFieldChange", "effect": "exclude", - "condition": "matchAnyFieldChange({'usageSummary'})" + "condition": "matchAnyFieldChange({'usageSummary', 'sourceHash', 'lifeCycle'})" } ] }, @@ -81,7 +81,9 @@ { "name": "fieldChangeList", "input": [ - "usageSummary" + "usageSummary", + "sourceHash", + "lifeCycle" ] } ]