From 3a6ab123b5f87423dd7a93183771c41c54d1903b Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Mon, 1 Dec 2025 15:48:12 +0100 Subject: [PATCH 1/8] [NAE-2288] Delete of process retains global role from user - added filter for global role --- .../application/engine/auth/service/UserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 9820e6296b..842283deb5 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -544,7 +544,7 @@ public void removeRoleOfDeletedPetriNet(PetriNet petriNet) { public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { String defaultRealmCollection = collectionNameProvider.getDefaultRealmCollection(); Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); - Collection roleIds = petriNetRoles.stream().map(ProcessRole::get_id).collect(Collectors.toSet()); + Collection roleIds = petriNetRoles.stream().filter(r -> !r.isGlobal()).map(ProcessRole::get_id).collect(Collectors.toSet()); Page users; do { users = searchUsersByRoleIds(roleIds, defaultRealmCollection, pageable); From ba05893c1f3c12c2c150ca2bfd8432e13ea5294c Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 3 Dec 2025 12:01:52 +0100 Subject: [PATCH 2/8] Improve null handling, performance, and serialization Added `@JsonIgnore` to prevent `sessionId` serialization. Enhanced null-checking and parameter handling in `NaeReflectionUtils`. Optimized `ActionApiMethods` lookup with a prebuilt map for better performance. --- .../petrinet/service/ProcessRoleService.java | 10 ++++---- .../engine/auth/service/UserServiceImpl.java | 25 ++++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java index 1c94340d3a..15d54946c3 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java @@ -147,10 +147,10 @@ protected void assignRolesToActor(Collection oldActorRoles, Collect Set rolesNewToUser = getRolesNewToActor(userOldRoles, requestedRoles); Set rolesRemovedFromUser = getRolesRemovedFromActor(userOldRoles, requestedRoles); - String idOfPetriNetContainingRole = getProcessIdRoleBelongsTo(rolesNewToUser, rolesRemovedFromUser); - if (!isGlobalFromFirstRole(rolesNewToUser) && !isGlobalFromFirstRole(rolesRemovedFromUser) && idOfPetriNetContainingRole == null) { - return; - } +// String idOfPetriNetContainingRole = getProcessIdRoleBelongsTo(rolesNewToUser, rolesRemovedFromUser); +// if (!isGlobalFromFirstRole(rolesNewToUser) && !isGlobalFromFirstRole(rolesRemovedFromUser) && idOfPetriNetContainingRole == null) { +// return; +// } oldActorRoles.clear(); oldActorRoles.addAll(updateRequestedRoles(userOldRoles, rolesNewToUser, rolesRemovedFromUser)); @@ -416,7 +416,7 @@ public Page findAllByDefaultName(String name, Pageable pageable) { @Override public void deleteRolesOfNet(PetriNet net, LoggedUser loggedUser) { log.info("[" + net.getStringId() + "]: Initiating deletion of all roles of Petri net " + net.getIdentifier() + " version " + net.getVersion().toString()); - List deletedRoleIds = this.findAllByNetStringId(net.getStringId()).stream().filter(processRole -> processRole.getProcessId() != null).map(ProcessRole::get_id).collect(Collectors.toList()); + List deletedRoleIds = this.findAllByNetStringId(net.getStringId()).stream().filter(processRole -> !processRole.isGlobal()).map(ProcessRole::get_id).collect(Collectors.toList()); Set deletedRoleStringIds = deletedRoleIds.stream().map(ProcessResourceId::toString).collect(Collectors.toSet()); Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 842283deb5..ffcff4f62b 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -56,6 +56,8 @@ public class UserServiceImpl implements UserService { private AbstractUser systemUser; + private RealmService realmService; + @Getter private PaginationProperties paginationProperties; @@ -112,6 +114,11 @@ public void setPaginationProperties(PaginationProperties paginationProperties) { this.paginationProperties = paginationProperties; } + @Autowired + public void setRealmService(RealmService realmService) { + this.realmService = realmService; + } + @Override public AbstractUser saveUser(AbstractUser user, String realmId) { user.setRealmId(realmId); @@ -542,15 +549,21 @@ public void removeRoleOfDeletedPetriNet(PetriNet petriNet) { @Override public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { - String defaultRealmCollection = collectionNameProvider.getDefaultRealmCollection(); Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Collection roleIds = petriNetRoles.stream().filter(r -> !r.isGlobal()).map(ProcessRole::get_id).collect(Collectors.toSet()); - Page users; + Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); + Page realms; do { - users = searchUsersByRoleIds(roleIds, defaultRealmCollection, pageable); - users.getContent().forEach(u -> removeRoles(u, petriNetRoles)); - pageable = pageable.next(); - } while (users.hasNext()); + realms = realmService.getSmallRealm(realmPageable); + Page users; + for (Realm realm : realms.getContent()) { + do { + users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); + users.getContent().forEach(u -> removeRoles(u, petriNetRoles)); + pageable = pageable.next(); + } while (users.hasNext()); + } + } while (realms.hasNext()); } @Override From f05b60eec7dfd48c5de6022251308b2c4768d845 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 3 Dec 2025 13:01:09 +0100 Subject: [PATCH 3/8] [NAE-2288] Delete of process retains global role from user - removed unnecessary method call for removing roles from user - the processRoleService.deleteRolesOfNet does the same thing - added filter for deletable process roles, so global roles will be ignored --- .../application/engine/petrinet/service/PetriNetService.java | 1 - .../application/engine/auth/service/UserServiceImpl.java | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java index a468461636..3e7d45cb4b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java @@ -545,7 +545,6 @@ public void deletePetriNet(String processId, LoggedUser loggedUser, boolean forc PetriNet petriNet = petriNetOptional.get(); log.info("[{}]: Initiating deletion of Petri net {} version {}", processId, petriNet.getIdentifier(), petriNet.getVersion().toString()); - userService.removeRoleOfDeletedPetriNet(petriNet); workflowService.deleteInstancesOfPetriNet(petriNet, force); processRoleService.deleteRolesOfNet(petriNet, loggedUser); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index ffcff4f62b..05a329af96 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -550,7 +550,8 @@ public void removeRoleOfDeletedPetriNet(PetriNet petriNet) { @Override public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); - Collection roleIds = petriNetRoles.stream().filter(r -> !r.isGlobal()).map(ProcessRole::get_id).collect(Collectors.toSet()); + Set nonGlobalPetriNetRoles = petriNetRoles.stream().filter(r -> !r.isGlobal()).collect(Collectors.toSet()); + Collection roleIds = nonGlobalPetriNetRoles.stream().map(ProcessRole::get_id).collect(Collectors.toSet()); Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Page realms; do { @@ -559,7 +560,7 @@ public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { for (Realm realm : realms.getContent()) { do { users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); - users.getContent().forEach(u -> removeRoles(u, petriNetRoles)); + users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); pageable = pageable.next(); } while (users.hasNext()); } From 39b5a8f5b6c2ac2a095007e95bd7072da4f41d89 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Wed, 3 Dec 2025 13:26:24 +0100 Subject: [PATCH 4/8] - removed commented code --- .../engine/petrinet/service/ProcessRoleService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java index 15d54946c3..0c0f67233b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java @@ -147,10 +147,6 @@ protected void assignRolesToActor(Collection oldActorRoles, Collect Set rolesNewToUser = getRolesNewToActor(userOldRoles, requestedRoles); Set rolesRemovedFromUser = getRolesRemovedFromActor(userOldRoles, requestedRoles); -// String idOfPetriNetContainingRole = getProcessIdRoleBelongsTo(rolesNewToUser, rolesRemovedFromUser); -// if (!isGlobalFromFirstRole(rolesNewToUser) && !isGlobalFromFirstRole(rolesRemovedFromUser) && idOfPetriNetContainingRole == null) { -// return; -// } oldActorRoles.clear(); oldActorRoles.addAll(updateRequestedRoles(userOldRoles, rolesNewToUser, rolesRemovedFromUser)); From 5bd7dbf576d0e32e11052d29a1a9ea5ab9cf4a6a Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Mon, 8 Dec 2025 19:50:52 +0100 Subject: [PATCH 5/8] Refactor pagination logic in removeRoleOfDeletedPetriNet. Moved pageable initialization inside the loop to ensure correct pagination during user and realm processing. This prevents potential inconsistencies and aligns the logic with dynamic pagination requirements. --- .../application/engine/auth/service/UserServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 05a329af96..4c147d262f 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -549,7 +549,6 @@ public void removeRoleOfDeletedPetriNet(PetriNet petriNet) { @Override public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { - Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Set nonGlobalPetriNetRoles = petriNetRoles.stream().filter(r -> !r.isGlobal()).collect(Collectors.toSet()); Collection roleIds = nonGlobalPetriNetRoles.stream().map(ProcessRole::get_id).collect(Collectors.toSet()); Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); @@ -558,12 +557,14 @@ public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { realms = realmService.getSmallRealm(realmPageable); Page users; for (Realm realm : realms.getContent()) { + Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); do { users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); pageable = pageable.next(); } while (users.hasNext()); } + realmPageable = realmPageable.next(); } while (realms.hasNext()); } From d2b5d0ce081982c694990a4253df058086d1c7c9 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Tue, 9 Dec 2025 08:44:38 +0100 Subject: [PATCH 6/8] Refactor user role removal logic in UserServiceImpl Simplified and streamlined the logic for removing roles from users by revising the iteration over user pages. This ensures more efficient role removal and eliminates redundant operations. --- .../application/engine/auth/service/UserServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 4c147d262f..060159ede8 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -555,9 +555,14 @@ public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { Page realms; do { realms = realmService.getSmallRealm(realmPageable); - Page users; for (Realm realm : realms.getContent()) { Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); + Page users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable);; + while (users.hasContent()) { + users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); + users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); + } + do { users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); From 70acdc0deddd248da4031bab3208f9f4d25cfdf3 Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Tue, 9 Dec 2025 08:53:55 +0100 Subject: [PATCH 7/8] Refactor redundant user role removal loops Removed unnecessary do-while loops for user role processing in `UserServiceImpl` and `ProcessRoleService`. Simplified the logic by adopting cleaner and more efficient while-loop constructs for better readability and maintainability. --- .../engine/petrinet/service/ProcessRoleService.java | 13 +++++-------- .../engine/auth/service/UserServiceImpl.java | 6 ------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java index 0c0f67233b..972e9aeee4 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java @@ -479,14 +479,11 @@ public void deleteGlobalRole(String roleId, LoggedUser loggedUser) { realms = realmService.getSmallRealm(realmPageable); realms.forEach(realm -> { Pageable usersPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); - Page users; - do { - users = this.userService.findAllByProcessRoles(Set.of(processRole.get_id()), realm.getName(), usersPageable); - for (AbstractUser user : users) { - removeRoleFromUser(user, processRole, loggedUser); - } - usersPageable = usersPageable.next(); - } while (users.hasNext()); + Page users = userService.findAllByProcessRoles(Set.of(processRole.get_id()), realm.getName(), usersPageable); + while (users.hasContent()) { + users.getContent().forEach(u -> removeRoleFromUser(u, processRole, loggedUser)); + users = userService.findAllByProcessRoles(Set.of(processRole.get_id()), realm.getName(), usersPageable); + } }); realmPageable = realmPageable.next(); } while (realms.hasNext()); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 060159ede8..2fba0d3fe5 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -562,12 +562,6 @@ public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); } - - do { - users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); - users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); - pageable = pageable.next(); - } while (users.hasNext()); } realmPageable = realmPageable.next(); } while (realms.hasNext()); From 37e7130f076033dddfca80a44bfba9c4e9699b2c Mon Sep 17 00:00:00 2001 From: renczesstefan Date: Tue, 9 Dec 2025 09:45:28 +0100 Subject: [PATCH 8/8] Refactor pageable initialization in user and role services Moved pageable object initialization outside of loops to avoid redundant creations and improve code clarity. This change ensures better readability and reduces unnecessary object instantiations during user and role processing. --- .../engine/petrinet/service/ProcessRoleService.java | 2 +- .../application/engine/auth/service/UserServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java index 972e9aeee4..ba674eeb70 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java @@ -474,11 +474,11 @@ public void deleteGlobalRole(String roleId, LoggedUser loggedUser) { } log.info("Initiating deletion of global role with import ID [{}] and object ID [{}]", processRole.getImportId(), processRole.getStringId()); Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); + Pageable usersPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Page realms; do { realms = realmService.getSmallRealm(realmPageable); realms.forEach(realm -> { - Pageable usersPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Page users = userService.findAllByProcessRoles(Set.of(processRole.get_id()), realm.getName(), usersPageable); while (users.hasContent()) { users.getContent().forEach(u -> removeRoleFromUser(u, processRole, loggedUser)); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 2fba0d3fe5..79db788c1b 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -552,12 +552,12 @@ public void removeRoleOfDeletedPetriNet(Set petriNetRoles) { Set nonGlobalPetriNetRoles = petriNetRoles.stream().filter(r -> !r.isGlobal()).collect(Collectors.toSet()); Collection roleIds = nonGlobalPetriNetRoles.stream().map(ProcessRole::get_id).collect(Collectors.toSet()); Pageable realmPageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); + Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); Page realms; do { realms = realmService.getSmallRealm(realmPageable); for (Realm realm : realms.getContent()) { - Pageable pageable = PageRequest.of(0, paginationProperties.getBackendPageSize()); - Page users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable);; + Page users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable); while (users.hasContent()) { users.getContent().forEach(u -> removeRoles(u, nonGlobalPetriNetRoles)); users = searchUsersByRoleIds(roleIds, collectionNameProvider.getCollectionNameForRealm(realm.getName()), pageable);