From 3830e79f52eb35c061ccb30c3ee26efa1c615bd4 Mon Sep 17 00:00:00 2001 From: Mohit Yadav <105265192+mohityadav766@users.noreply.github.com> Date: Tue, 20 May 2025 19:58:38 +0530 Subject: [PATCH] Fix Test Case Assignee not cleared from incident tasks (#21314) --- .../service/jdbi3/CollectionDAO.java | 8 ++++++++ .../service/jdbi3/TeamRepository.java | 6 ++++++ .../TestCaseResolutionStatusRepository.java | 6 ++++-- .../service/jdbi3/UserRepository.java | 5 +++++ .../service/resources/feeds/FeedUtil.java | 20 +++++++++++++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java index 792976daadc..231280e296a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/CollectionDAO.java @@ -2058,6 +2058,14 @@ public interface CollectionDAO { glossaryTermLink.getFullyQualifiedFieldType()); } + default List listThreadsByTaskAssignee(String taskAssigneesId) { + String condition = String.format(" WHERE taskAssigneesIds LIKE '%%%s%%'", taskAssigneesId); + return listThreadsByTaskAssigneesId(condition); + } + + @SqlQuery("SELECT json FROM thread_entity ") + List listThreadsByTaskAssigneesId(@Define("cond") String cond); + @SqlQuery( "SELECT entityLink, type, taskStatus, COUNT(id) as count " + "FROM ( " diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java index 7685f4a53b7..a2b153479cd 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java @@ -68,6 +68,7 @@ import org.openmetadata.schema.api.teams.CreateTeam; import org.openmetadata.schema.api.teams.CreateTeam.TeamType; import org.openmetadata.schema.entity.teams.Team; import org.openmetadata.schema.entity.teams.TeamHierarchy; +import org.openmetadata.schema.entity.teams.User; import org.openmetadata.schema.type.ChangeDescription; import org.openmetadata.schema.type.ChangeEvent; import org.openmetadata.schema.type.EntityReference; @@ -86,6 +87,7 @@ import org.openmetadata.service.Entity; import org.openmetadata.service.exception.CatalogExceptionMessage; import org.openmetadata.service.exception.EntityNotFoundException; import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord; +import org.openmetadata.service.resources.feeds.FeedUtil; import org.openmetadata.service.resources.teams.TeamResource; import org.openmetadata.service.security.policyevaluator.SubjectContext; import org.openmetadata.service.util.EntityUtil; @@ -328,6 +330,10 @@ public class TeamRepository extends EntityRepository { return SubjectContext.getRolesForTeams(getParentsForInheritedRoles(team)); } + protected void entitySpecificCleanup(User entityInterface) { + FeedUtil.cleanUpTaskForAssignees(entityInterface.getId(), TEAM); + } + private TeamHierarchy getTeamHierarchy(Team team) { return new TeamHierarchy() .withId(team.getId()) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java index 3a67676af8e..c3624b77bb5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseResolutionStatusRepository.java @@ -1,5 +1,6 @@ package org.openmetadata.service.jdbi3; +import static org.openmetadata.common.utils.CommonUtil.nullOrEmpty; import static org.openmetadata.schema.type.EventType.ENTITY_UPDATED; import static org.openmetadata.service.Entity.getEntityReferenceByName; @@ -334,8 +335,9 @@ public class TestCaseResolutionStatusRepository private void patchTaskAssignee(Thread originalTask, EntityReference newAssignee, String user) { Thread updatedTask = JsonUtils.deepCopy(originalTask, Thread.class); - updatedTask.setTask( - updatedTask.getTask().withAssignees(Collections.singletonList(newAssignee))); + List updatedAssignees = + nullOrEmpty(newAssignee) ? new ArrayList<>() : Collections.singletonList(newAssignee); + updatedTask.setTask(updatedTask.getTask().withAssignees(updatedAssignees)); JsonPatch patch = JsonUtils.getJsonPatch(originalTask, updatedTask); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java index 4246ed7223d..d4187f925f9 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java @@ -69,6 +69,7 @@ import org.openmetadata.service.exception.BadRequestException; import org.openmetadata.service.exception.CatalogExceptionMessage; import org.openmetadata.service.exception.EntityNotFoundException; import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord; +import org.openmetadata.service.resources.feeds.FeedUtil; import org.openmetadata.service.resources.teams.UserResource; import org.openmetadata.service.secrets.SecretsManager; import org.openmetadata.service.secrets.SecretsManagerFactory; @@ -328,6 +329,10 @@ public class UserRepository extends EntityRepository { } } + protected void entitySpecificCleanup(User entityInterface) { + FeedUtil.cleanUpTaskForAssignees(entityInterface.getId(), USER); + } + /* Validate if the user is already part of the given team */ public void validateTeamAddition(UUID userId, UUID teamId) { User user = find(userId, NON_DELETED); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedUtil.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedUtil.java index bb7aba97249..4de74a9a00a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedUtil.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/feeds/FeedUtil.java @@ -13,8 +13,13 @@ package org.openmetadata.service.resources.feeds; +import java.util.List; +import java.util.UUID; import org.openmetadata.schema.entity.feed.Thread; +import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Post; +import org.openmetadata.service.Entity; +import org.openmetadata.service.util.JsonUtils; public final class FeedUtil { @@ -25,4 +30,19 @@ public final class FeedUtil { thread.getPosts().add(post); thread.withPostsCount(thread.getPosts().size()); } + + public static void cleanUpTaskForAssignees(UUID entityId, String entityType) { + List userTasks = + Entity.getCollectionDAO().feedDAO().listThreadsByTaskAssignee(entityId.toString()); + List threads = JsonUtils.readObjects(userTasks, Thread.class); + for (Thread thread : threads) { + List assignees = thread.getTask().getAssignees(); + assignees.removeIf( + entityReference -> + entityReference.getId().equals(entityId) + && entityReference.getType().equals(entityType)); + thread.getTask().setAssignees(assignees); + Entity.getCollectionDAO().feedDAO().update(thread.getId(), JsonUtils.pojoToJson(thread)); + } + } }