From 1b7f07fca2881e6ca7844bef2fb5203822ca92e2 Mon Sep 17 00:00:00 2001 From: bezak Date: Tue, 3 Feb 2026 15:28:42 +0100 Subject: [PATCH 1/4] [NAE-2354] Include assignee userRealmId in task response - refactor Task to contain ActorRef instead of just userId --- .../engine/workflow/service/TaskSearchService.java | 2 +- .../engine/workflow/service/TaskService.java | 12 ++++-------- .../engine/workflow/web/responsebodies/Task.java | 8 +++----- .../application/engine/ipc/TaskApiTest.groovy | 2 +- .../engine/objects/elastic/domain/ElasticTask.java | 14 ++++++++++++-- .../engine/objects/workflow/domain/Task.java | 11 +++++------ .../adapter/spring/workflow/domain/Task.java | 5 +++-- 7 files changed, 29 insertions(+), 25 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java index 2e9ce479e9..8a24ba6e6e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java @@ -221,7 +221,7 @@ private void buildUserQuery(TaskSearchRequest request, BooleanBuilder query) { } public Predicate userQuery(String userId) { - return QTask.task.userId.eq(userId); + return QTask.task.assignee.id.eq(userId); } private void buildProcessQuery(TaskSearchRequest request, BooleanBuilder query) { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index cc81367878..595677184a 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -192,8 +192,7 @@ protected Case assignTaskToUser(AbstractUser user, Task task, String useCaseId) startExecution(transition, useCase); // TODO: impersonation - task.setUserId(user.getStringId()); - task.setUserRealmId(user.getRealmId()); + task.setAssignee(ActorTransformer.toActorRef(user)); task.setStartDate(LocalDateTime.now()); // TODO: impersonation task.setUser(user); @@ -279,8 +278,7 @@ public FinishTaskEventOutcome finishTask(Task task, AbstractUser user, Map> roles; @@ -85,8 +84,7 @@ public Task(com.netgrif.application.engine.objects.workflow.domain.Task task, Lo this.caseColor = task.getCaseColor(); this.caseTitle = task.getCaseTitle(); this.priority = task.getPriority(); - this.userId = task.getUser() != null ? task.getUser().getStringId() : null; - this.userRealmId = task.getUser() != null ? task.getUser().getRealmId() : null; + this.assignee = task.getAssignee(); this.roles = task.getRoles(); this.users = task.getUsers(); this.startDate = task.getStartDate(); diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy index 89ea77e4dc..9b6a10c6d3 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy @@ -209,7 +209,7 @@ class TaskApiTest { helper.assignTaskToSuper(TASK_BULK_TASK, control.stringId) helper.finishTaskAsSuper(TASK_BULK_TASK, control.stringId) - assert taskRepository.findAll(QTask.task.userId.eq(userService.system.getStringId())).size() == 2 + assert taskRepository.findAll(QTask.task.assignee.id.eq(userService.system.getStringId())).size() == 2 } public static final String TASK_GETTER_NET_FILE = "ipc_data.xml" diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java index db7babc19e..db3616f9bf 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java @@ -51,6 +51,10 @@ public abstract class ElasticTask implements Serializable { private String userRealmId; + private String userFullName; + + private String username; + private LocalDateTime startDate; private String transactionId; @@ -93,8 +97,12 @@ public ElasticTask(Task task) { this.caseTitleSortable = this.caseTitle; if (task.getPriority() != null) this.priority = task.getPriority(); - this.userId = task.getUserId(); - this.userRealmId = task.getUserRealmId(); + if (task.getAssignee() != null) { + this.userId = task.getAssignee().getId(); + this.userRealmId = task.getAssignee().getRealmId(); + this.username = task.getAssignee().getUsername(); + this.userFullName = task.getAssignee().getFullName(); + } this.startDate = task.getStartDate(); this.roles = task.getRoles(); this.userRefs = task.getUserRefs(); @@ -118,6 +126,8 @@ public void update(ElasticTask task) { this.priority = task.getPriority(); this.userId = task.getUserId(); this.userRealmId = task.getUserRealmId(); + this.userFullName = task.getUserFullName(); + this.username = task.getUsername(); this.startDate = task.getStartDate(); this.roles = task.getRoles(); this.viewRoles = task.getViewRoles(); diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java index 34dd668f92..6d114f5b0a 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java @@ -4,6 +4,7 @@ import com.netgrif.application.engine.objects.annotations.Indexable; import com.netgrif.application.engine.objects.annotations.Indexed; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.ActorRef; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; @@ -68,12 +69,10 @@ public abstract class Task implements Serializable { @Setter private Integer priority; + @Getter @Setter @Indexed - private String userId; - - @Setter - private String userRealmId; + private ActorRef assignee; @Getter @Setter @@ -280,12 +279,12 @@ public void addEventTitle(EventType type, I18nString title) { @JsonIgnore public String getUserId() { - return userId; + return assignee != null ? assignee.getId() : null; } @JsonIgnore public String getUserRealmId() { - return userRealmId; + return assignee != null ? assignee.getRealmId() : null; } public String getTranslatedEventTitle(EventType assign, Locale locale) { diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java index ce9702a0f9..1706fb4be9 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.ActorRef; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; @@ -29,8 +30,8 @@ public Task() { } @Builder(builderMethodName = "with") - public Task(ProcessResourceId _id, String processId, String caseId, String transitionId, TaskLayout layout, I18nString title, String caseColor, String caseTitle, Integer priority, String userId, String userRealmId, AbstractUser user, List triggers, Map> roles, Map> userRefs, Map> users, List viewRoles, List viewUserRefs, List viewUsers, List negativeViewRoles, List negativeViewUsers, LocalDateTime startDate, LocalDateTime finishDate, String finishedBy, String transactionId, Boolean requiredFilled, LinkedHashSet immediateDataFields, List> immediateData, String icon, AssignPolicy assignPolicy, DataFocusPolicy dataFocusPolicy, FinishPolicy finishPolicy, Map eventTitles, Map assignedUserPolicy, Map consumedTokens, Map tags) { - super(_id, processId, caseId, transitionId, layout, title, caseColor, caseTitle, priority, userId, userRealmId, user, triggers, roles, userRefs, users, viewRoles, viewUserRefs, viewUsers, negativeViewRoles, negativeViewUsers, startDate, finishDate, finishedBy, transactionId, requiredFilled, immediateDataFields, immediateData, icon, assignPolicy, dataFocusPolicy, finishPolicy, eventTitles, assignedUserPolicy, consumedTokens, tags); + public Task(ProcessResourceId _id, String processId, String caseId, String transitionId, TaskLayout layout, I18nString title, String caseColor, String caseTitle, Integer priority, ActorRef assignee, AbstractUser user, List triggers, Map> roles, Map> userRefs, Map> users, List viewRoles, List viewUserRefs, List viewUsers, List negativeViewRoles, List negativeViewUsers, LocalDateTime startDate, LocalDateTime finishDate, String finishedBy, String transactionId, Boolean requiredFilled, LinkedHashSet immediateDataFields, List> immediateData, String icon, AssignPolicy assignPolicy, DataFocusPolicy dataFocusPolicy, FinishPolicy finishPolicy, Map eventTitles, Map assignedUserPolicy, Map consumedTokens, Map tags) { + super(_id, processId, caseId, transitionId, layout, title, caseColor, caseTitle, priority, assignee, user, triggers, roles, userRefs, users, viewRoles, viewUserRefs, viewUsers, negativeViewRoles, negativeViewUsers, startDate, finishDate, finishedBy, transactionId, requiredFilled, immediateDataFields, immediateData, icon, assignPolicy, dataFocusPolicy, finishPolicy, eventTitles, assignedUserPolicy, consumedTokens, tags); } @Id From a1a58570ee1f4da3bcf6461a2878826f532eaceb Mon Sep 17 00:00:00 2001 From: bezak Date: Thu, 5 Feb 2026 11:07:09 +0100 Subject: [PATCH 2/4] [NAE-2354] Include assignee userRealmId in task response - resolve conflicts with rev10 branch --- .../netgrif/application/engine/workflow/service/TaskService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index 771b846f57..eeeb27153e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -2,6 +2,7 @@ import com.google.common.collect.Ordering; import com.netgrif.application.engine.objects.auth.domain.AbstractUser; +import com.netgrif.application.engine.objects.auth.domain.ActorTransformer; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskMappingService; From 5eabbdcbf5015b917b28b6919502b7d9ab645b7c Mon Sep 17 00:00:00 2001 From: bezak Date: Thu, 5 Feb 2026 11:12:11 +0100 Subject: [PATCH 3/4] [NAE-2354] Include assignee userRealmId in task response - fix TaskRepository methods dependent on removed attribute userId --- .../engine/workflow/domain/repositories/TaskRepository.java | 6 +++--- .../application/engine/workflow/service/TaskService.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java index 5338d1d4ab..4c3ba538e7 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java @@ -26,9 +26,9 @@ public interface TaskRepository extends MongoRepository, QuerydslP List findAllByTransitionIdIn(Collection ids); - Page findByUserId(Pageable pageable, String userId); + Page findByAssignee_Id(Pageable pageable, String userId); - List findByUserIdAndFinishDateNotNull(Long userId); + List findByAssignee_Id_AndFinishDateNotNull(String userId); Task findByTransitionIdAndCaseId(String transitionId, String caseId); @@ -36,7 +36,7 @@ public interface TaskRepository extends MongoRepository, QuerydslP List findAllBy_idIn(Iterable id); - void deleteAllByCaseIdAndUserIdIsNull(String caseId); + void deleteAllByCaseIdAndAssignee_Id_IsNull(String caseId); void deleteAllByCaseIdAndFinishDateIsNotNull(String caseId); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index eeeb27153e..26be3a46e3 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -759,7 +759,7 @@ public List findAllById(List ids) { public Page findByUser(Pageable pageable, AbstractUser user) { // TODO: impersonation // return loadUsers(taskRepository.findByUserId(pageable, user.getSelfOrImpersonated().getStringId())); - return loadUsers(taskRepository.findByUserId(pageable, user.getStringId())); + return loadUsers(taskRepository.findByAssignee_Id(pageable, user.getStringId())); } @Override From 966c8a7c73d8ea459cc49862dc2830db3c34a8a6 Mon Sep 17 00:00:00 2001 From: bezak Date: Thu, 5 Feb 2026 11:56:22 +0100 Subject: [PATCH 4/4] [NAE-2354] Include assignee userRealmId in task response - implement coderabbit suggestion --- .../engine/workflow/domain/repositories/TaskRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java index 4c3ba538e7..019b2d1bac 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java @@ -28,7 +28,7 @@ public interface TaskRepository extends MongoRepository, QuerydslP Page findByAssignee_Id(Pageable pageable, String userId); - List findByAssignee_Id_AndFinishDateNotNull(String userId); + List findByAssignee_IdAndFinishDateNotNull(String userId); Task findByTransitionIdAndCaseId(String transitionId, String caseId); @@ -36,7 +36,7 @@ public interface TaskRepository extends MongoRepository, QuerydslP List findAllBy_idIn(Iterable id); - void deleteAllByCaseIdAndAssignee_Id_IsNull(String caseId); + void deleteAllByCaseIdAndAssignee_IdIsNull(String caseId); void deleteAllByCaseIdAndFinishDateIsNotNull(String caseId);