Optimize user joining group or role

Closes #45689

Signed-off-by: Alexander Schwartz <alexander.schwartz@ibm.com>
This commit is contained in:
Alexander Schwartz 2026-02-17 11:32:57 +01:00 committed by GitHub
parent 3f62bb4d2b
commit 3f8b1c8e70
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -442,9 +442,21 @@ public class UserAdapter implements UserModel, JpaModel<UserEntity> {
joinGroup(group, null);
}
private boolean hasDirectGroup(GroupModel group) {
UserGroupMembershipEntity membership = em.createNamedQuery("userMemberOf", UserGroupMembershipEntity.class)
.setParameter("user", user)
.setParameter("groupId", group.getId())
.getSingleResultOrNull();
// Avoid keeping it in the persistence context, as the user might be detached for example in a bulk delete
if (membership != null) {
em.detach(membership);
}
return membership != null;
}
@Override
public void joinGroup(GroupModel group, MembershipMetadata metadata) {
if (RoleUtils.isDirectMember(getGroupsStream(), group)) return;
if (hasDirectGroup(group)) return;
joinGroupImpl(group, metadata);
}
@ -513,6 +525,19 @@ public class UserAdapter implements UserModel, JpaModel<UserEntity> {
RoleGrantedEvent.fire(role, this, session);
}
@Override
public boolean hasDirectRole(RoleModel role) {
UserRoleMappingEntity membership = em.createNamedQuery("userHasRole", UserRoleMappingEntity.class)
.setParameter("user", user)
.setParameter("roleId", role.getId())
.getSingleResultOrNull();
// Avoid keeping it in the persistence context, as the user might be detached for example in a bulk delete
if (membership != null) {
em.detach(membership);
}
return membership != null;
}
public void grantRoleImpl(RoleModel role) {
UserRoleMappingEntity entity = new UserRoleMappingEntity();
entity.setUser(getEntity());