diff --git a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java index 2290c948..fd33f358 100644 --- a/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java +++ b/src/main/java/net/hostsharing/hsadminng/rbac/rbacgrant/RbacGrantsDiagramService.java @@ -62,6 +62,8 @@ public class RbacGrantsDiagramService { @PersistenceContext private EntityManager em; + private Map> descendantsByUuid = new HashMap<>(); + public String allGrantsToCurrentUser(final EnumSet includes) { final var graph = new LimitedHashSet(); for ( UUID subjectUuid: context.currentSubjectsUuids() ) { @@ -102,7 +104,7 @@ public class RbacGrantsDiagramService { } private void traverseGrantsFrom(final Set graph, final UUID refUuid, final EnumSet option) { - final var grants = rawGrantRepo.findByDescendantUuid(refUuid); + final var grants = findDescendantsByUuid(refUuid); grants.forEach(g -> { if (!option.contains(USERS) && g.getAscendantIdName().startsWith("user:")) { return; @@ -114,6 +116,11 @@ public class RbacGrantsDiagramService { }); } + private List findDescendantsByUuid(final UUID refUuid) { + // TODO.impl: if that UUID already got processed, do we need to return anything at all? + return descendantsByUuid.computeIfAbsent(refUuid, uuid -> rawGrantRepo.findByDescendantUuid(uuid)); + } + private String toMermaidFlowchart(final HashSet graph, final EnumSet includes) { final var entities = includes.contains(DETAILS)