From c854bca1f8d7c311e0f401a8771a0ff570253780 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 28 May 2025 14:13:12 +0200 Subject: [PATCH 1/5] [NAE-2114] Task search on Search Node - added roles and permissions to elasticCase and task --- .../objects/elastic/domain/ElasticCase.java | 8 ++++++++ .../objects/elastic/domain/ElasticTask.java | 18 +++++++++++++----- .../spring/elastic/domain/ElasticCase.java | 17 +++++++++++++++++ .../spring/elastic/domain/ElasticTask.java | 17 ++++++++++++++--- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java index 2cee43c0a60..dafdc9008d4 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java @@ -10,6 +10,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import lombok.Setter; + import java.io.Serial; import java.io.Serializable; import java.sql.Timestamp; @@ -67,6 +69,12 @@ public abstract class ElasticCase implements Serializable { private Set taskMongoIds; + private Map> permissions; + + private Map> userRefs; + + private Map> users; + private Set enabledRoles; private Set viewRoles; 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 37bf1de7b43..a22309c432b 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 @@ -4,11 +4,10 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.netgrif.application.engine.objects.auth.domain.IUser; import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.workflow.domain.Task; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; import java.util.HashMap; @@ -53,7 +52,11 @@ public abstract class ElasticTask { private String transactionId; - private Set roles; + private Map> roles; + + private Map> userRefs; + + private Map> users; private Set viewUserRefs; @@ -89,12 +92,17 @@ public ElasticTask(Task task) { this.priority = task.getPriority(); this.userId = task.getUserId(); this.startDate = task.getStartDate(); - this.roles = task.getRoles().keySet(); + this.roles = task.getRoles(); + this.userRefs = task.getUserRefs(); + this.users = task.getUsers(); this.viewRoles = new HashSet<>(task.getViewRoles()); this.viewUserRefs = new HashSet<>(task.getViewUserRefs()); this.negativeViewRoles = new HashSet<>(task.getNegativeViewRoles()); this.viewUsers = new HashSet<>(task.getViewUsers()); this.negativeViewUsers = new HashSet<>(task.getNegativeViewUsers()); + this.assignPolicy = task.getAssignPolicy().toString(); + this.dataFocusPolicy = task.getDataFocusPolicy().toString(); + this.finishPolicy = task.getFinishPolicy().toString(); this.tags = new HashMap<>(task.getTags()); } diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java index 6735486d5e3..b67c0461773 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java @@ -10,8 +10,10 @@ import org.springframework.data.elasticsearch.annotations.FieldType; import java.time.LocalDateTime; +import java.util.Map; import java.util.Set; +import static org.springframework.data.elasticsearch.annotations.FieldType.Flattened; import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword; @NoArgsConstructor @@ -91,6 +93,21 @@ public Set getTaskMongoIds() { return super.getTaskMongoIds(); } + @Field(type = Flattened) + public Map> getUsers() { + return super.getUsers(); + } + + @Field(type = Flattened) + public Map> getUserRefs() { + return super.getUserRefs(); + } + + @Field(type = Flattened) + public Map> getPermissions() { + return super.getPermissions(); + } + @Field(type = Keyword) public Set getEnabledRoles() { return super.getEnabledRoles(); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java index 39424915bec..ca1a5c7dbdc 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java @@ -10,8 +10,10 @@ import org.springframework.data.elasticsearch.annotations.FieldType; import java.time.LocalDateTime; +import java.util.Map; import java.util.Set; +import static org.springframework.data.elasticsearch.annotations.FieldType.Flattened; import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword; @NoArgsConstructor @@ -92,9 +94,18 @@ public String getTransactionId() { return super.getTransactionId(); } - @Field(type = Keyword) - @Override - public Set getRoles() { + @Field(type = Flattened) + public Map> getUsers() { + return super.getUsers(); + } + + @Field(type = Flattened) + public Map> getUserRefs() { + return super.getUserRefs(); + } + + @Field(type = Flattened) + public Map> getRoles() { return super.getRoles(); } From 614dcafbb81aae5161133ae096b181304951c6da Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Thu, 29 May 2025 10:58:54 +0200 Subject: [PATCH 2/5] [NAE-2114] Task search on Search Node - In the constructor for `Task` (domain `Task` to DTO), the mapping of the user field was updated to set `userId` by fetching the string ID (`task.getUser().getStringId()`) instead of creating a `User` object (`User.createUser(...`). - These changes simplify the `Task` class by focusing on storing the `userId` directly instead of the complete `User` object. --- .../engine/workflow/web/responsebodies/Task.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java index 27d35baf402..2855262772f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java @@ -1,14 +1,12 @@ package com.netgrif.application.engine.workflow.web.responsebodies; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.objects.elastic.domain.ElasticTask; import com.netgrif.application.engine.objects.petrinet.domain.dataset.Field; import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; import com.netgrif.application.engine.objects.petrinet.domain.layout.TaskLayout; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import lombok.Data; -import org.bson.types.ObjectId; import java.time.LocalDateTime; import java.util.List; @@ -38,7 +36,7 @@ public class Task { private Integer priority; - private User user; + private String userId; private Map> roles; @@ -85,7 +83,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.user = task.getUser() != null ? User.createUser(task.getUser()) : null; + this.userId = task.getUser() != null ? task.getUser().getStringId() : null; this.roles = task.getRoles(); this.users = task.getUsers(); this.startDate = task.getStartDate(); From e4c3ab1dc60fca9e60ab555fbb5d0c7d95cab0e0 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Fri, 30 May 2025 10:19:51 +0200 Subject: [PATCH 3/5] [NAE-2115] Task search on Search Node - Added `userRealmId` property to the `Task` class with getters and setters for better user realm tracking. - Updated `TaskService` to handle `userRealmId` during task start, delegation, and completion processes. - Removed `@NoArgsConstructor` annotations from `ElasticCase` and `ElasticTask` to enforce proper instantiation via constructors. - Added `@JsonIgnore` to the `getUserRealmId` method for serialization behavior control. These changes enhance task user identification and support future implementation of multi-realm capabilities. --- .../application/engine/workflow/service/TaskService.java | 3 +++ .../engine/objects/elastic/domain/ElasticCase.java | 1 - .../engine/objects/elastic/domain/ElasticTask.java | 1 - .../application/engine/objects/workflow/domain/Task.java | 8 ++++++++ 4 files changed, 11 insertions(+), 2 deletions(-) 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 85c6b4cdc01..db2113701c7 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 @@ -189,6 +189,7 @@ protected Case assignTaskToUser(IUser user, Task task, String useCaseId) throws startExecution(transition, useCase); task.setUserId(user.getSelfOrImpersonated().getStringId()); + task.setUserRealmId(user.getSelfOrImpersonated().getRealmId()); task.setStartDate(LocalDateTime.now()); task.setUser(user.getSelfOrImpersonated()); @@ -270,6 +271,7 @@ public FinishTaskEventOutcome finishTask(Task task, IUser user, Map Date: Fri, 30 May 2025 10:21:41 +0200 Subject: [PATCH 4/5] [NAE-2115] Task search on Search Node - Added `userRealmId` property to the `Task` class with getters and setters for better user realm tracking. - Updated `TaskService` to handle `userRealmId` during task start, delegation, and completion processes. - Removed `@NoArgsConstructor` annotations from `ElasticCase` and `ElasticTask` to enforce proper instantiation via constructors. - Added `@JsonIgnore` to the `getUserRealmId` method for serialization behavior control. These changes enhance task user identification and support future implementation of multi-realm capabilities. --- .../application/engine/workflow/web/responsebodies/Task.java | 3 +++ .../engine/objects/elastic/domain/ElasticTask.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java index 2855262772f..4115b62b7e0 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java @@ -38,6 +38,8 @@ public class Task { private String userId; + private String userRealmId; + private Map> roles; private Map> users; @@ -84,6 +86,7 @@ public Task(com.netgrif.application.engine.objects.workflow.domain.Task task, Lo this.caseTitle = task.getCaseTitle(); this.priority = task.getPriority(); this.userId = task.getUser() != null ? task.getUser().getStringId() : null; + this.userRealmId = task.getUserRealmId() != null ? task.getUser().getRealmId() : null; this.roles = task.getRoles(); this.users = task.getUsers(); this.startDate = task.getStartDate(); 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 1f5b16bdbdd..14de3fc69e6 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 @@ -45,6 +45,8 @@ public abstract class ElasticTask { private String userId; + private String userRealmId; + @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime startDate; @@ -90,6 +92,7 @@ public ElasticTask(Task task) { if (task.getPriority() != null) this.priority = task.getPriority(); this.userId = task.getUserId(); + this.userRealmId = task.getUserRealmId(); this.startDate = task.getStartDate(); this.roles = task.getRoles(); this.userRefs = task.getUserRefs(); @@ -112,6 +115,7 @@ public void update(ElasticTask task) { this.caseTitleSortable = this.caseTitle; this.priority = task.getPriority(); this.userId = task.getUserId(); + this.userRealmId = task.getUserRealmId(); this.startDate = task.getStartDate(); this.roles = task.getRoles(); this.viewRoles = task.getViewRoles(); From b376213e6da1ffb86b93250674e96a846e140a16 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Fri, 30 May 2025 10:25:00 +0200 Subject: [PATCH 5/5] [NAE-2115] Task search on Search Node - reverted noargsconstructor - added userRealmId to builder constructor --- .../engine/objects/elastic/domain/ElasticCase.java | 1 + .../engine/objects/elastic/domain/ElasticTask.java | 1 + .../engine/adapter/spring/workflow/domain/Task.java | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java index 6d5e5f89c70..dafdc9008d4 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java @@ -24,6 +24,7 @@ @Data +@NoArgsConstructor @AllArgsConstructor public abstract class ElasticCase implements Serializable { 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 14de3fc69e6..e0bd698820a 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 @@ -16,6 +16,7 @@ import java.util.Set; @Data +@NoArgsConstructor @AllArgsConstructor public abstract class ElasticTask { 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 d4e6ef6e72d..690bb5a3b44 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 @@ -28,8 +28,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, IUser 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, 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, String userId, String userRealmId, IUser 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); } @Id