diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/domain/UserTezzaResource.java b/backend/src/main/java/nl/contezza/gzac/tezza/domain/UserTezzaResource.java index e1ca7194171093fbfd0c71bb90d2a91df10e640f..8880d9bdfd00ef7cb893ff73218462cc3e08f40c 100644 --- a/backend/src/main/java/nl/contezza/gzac/tezza/domain/UserTezzaResource.java +++ b/backend/src/main/java/nl/contezza/gzac/tezza/domain/UserTezzaResource.java @@ -1,5 +1,7 @@ package nl.contezza.gzac.tezza.domain; +import java.util.Objects; + public class UserTezzaResource { private String userId; private String email; @@ -51,4 +53,19 @@ public class UserTezzaResource { + username + "]"; } + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + UserTezzaResource that = (UserTezzaResource) o; + return Objects.equals(userId, that.userId); + } + + @Override + public int hashCode() { + return Objects.hash(userId); + } + } diff --git a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java index 91eca1f202e6cff7889225410000e39ffb38df3b..6c8141d366c91f80b5aad6507be772849a048386 100644 --- a/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java +++ b/backend/src/main/java/nl/contezza/gzac/tezza/service/TezzaService.java @@ -44,6 +44,8 @@ import org.alfresco.extension.acs.model.ActionBodyExec; import org.alfresco.extension.acs.model.ActionDefinitionEntry; import org.alfresco.extension.acs.model.ActionDefinitionList; import org.alfresco.extension.acs.model.ActionExecResultEntry; +import org.alfresco.extension.acs.model.GroupMember; +import org.alfresco.extension.acs.model.GroupMemberEntry; import org.alfresco.extension.acs.model.GroupMemberPaging; import java.net.URI; @@ -52,9 +54,11 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -351,7 +355,7 @@ public class TezzaService { .getUsername())); } - public UserTezzaResource getUserByUsername(String username) { + public UserTezzaResource getUserByUsername(String username) throws NotFoundException { return userManagementService.findByRole(USER).stream() .filter(managedUser -> managedUser.getUsername().equals(username)) .findFirst() @@ -371,31 +375,84 @@ public class TezzaService { /** * Deze functie haald alle gebruikers op die bij een gegeven groep uit Alfresco - * horen. + * horen. Dit is de publieke functie, die verder de recursieve functie aanroept. * De gebruikers worden als UserTezzaResource teruggeleverd, voor gebruik binnen * Tezza GZAC. - * Als de groep niet gevonden kan worden bij Alfresco, wordt er een waarschuwing - * in het log geplaatst en returned het een lege lijst. * * @param groupId de GroupId van de Alfresco groep, zoals opgegeven in Alfresco * @return de lijst met gebruikers uit Alfresco */ + public List<UserTezzaResource> fetchUsersFromAlfresco(String groupId) { - GroupsApi groupsApi = getGroupsApi(); - try { - GroupMemberPaging groupPaging = groupsApi.listGroupMemberships(groupId, 0, 1000, null, - "(memberType='PERSON')", null); - if (groupPaging.getList().getEntries() != null) { - return groupPaging.getList().getEntries().stream() - .map(entry -> getUserByUsername(entry.getEntry().getId())).toList(); + return new ArrayList<>(fetchUsersFromAlfresco(groupId, new HashSet<>(), new HashSet<>())); + } + + /** + * Deze functie haald alle gebruikers op die bij een gegeven groep uit Alfresco + * horen. Dit is de recursieve functie voor het ophalen van gebruikers. + * + * Als vanuit Alfresco een gebruiker wordt terug gegeven wordt deze gematcht met + * een gebruiker uit Keycloak en toegevoegd aan de lijst. + * Als een groep wordt toegewezen, wordt deze functie recursief aangeroepen met + * de nieuwe groep naam + * De gebruikers worden als UserTezzaResource teruggeleverd, voor gebruik binnen + * Tezza GZAC. + * + * Als de groep niet gevonden kan worden bij Alfresco, wordt er een waarschuwing + * in het log geplaatst en returned het een lege lijst. + * Als een gebruiker niet in Keycloak gevonden kan worden, wordt dit in het log + * geregistreerd, en gaat de functie verder. + * + * @param groupId de GroupId van de Alfresco groep, zoals opgegeven in + * Alfresco + * @param userList de lijst met al opgehaalde gebruikers. Deze mag leeg + * zijn, maar niet null. + * @param processedGroups de lijst met al in de userList verwerkte groepen. Deze + * mag leeg zijn, maar niet null. + * @return + */ + private Set<UserTezzaResource> fetchUsersFromAlfresco(String groupId, Set<UserTezzaResource> userList, + Set<String> processedGroups) { + if (!processedGroups.contains(groupId)) { + processedGroups.add(groupId); + GroupsApi groupsApi = getGroupsApi(); + int skipCount = 0; + int maxItems = 1000; + try { + GroupMemberPaging groupPaging; + do { + groupPaging = groupsApi.listGroupMemberships(groupId, skipCount, maxItems, null, null, null); + if (groupPaging.getList().getEntries() != null) { + for (GroupMemberEntry entry : groupPaging.getList().getEntries()) { + if (entry.getEntry().getMemberType().equals(GroupMember.MemberTypeEnum.PERSON)) { + try { + userList.add(getUserByUsername(entry.getEntry().getId())); + } catch (NotFoundException e) { + logger.warn(e.getMessage()); + } + } else { + fetchUsersFromAlfresco(entry.getEntry().getId(), userList, processedGroups); + } + } + } + skipCount += maxItems; + } while (groupPaging.getList().getPagination().isHasMoreItems()); + } catch (ApiException e) { + logger.warn("Users of group " + groupId + " can't be retrieved from Alfresco!", e); } - } catch (ApiException e) { - logger.warn("Users of group " + groupId + " can't be retrieved from Alfresco!"); - logger.warn(e.getResponseBody()); } - return new ArrayList<>(); + return userList; } + /** + * Deze functie haalt alle gebruikers op van een groep. Eerst wordt gekeken of + * de groep bestaat in Keycloak om daar de gebruikers van op te halen. + * Als de groep niet in Keycloak bestaat, wordt geken of de groep in Alfresco + * bestaat. De gebruikers komen altijd uit Keycloak. + * + * @param groupId de naam van de groep + * @return de lijst met gebruikers + */ public List<UserTezzaResource> getUsersByGroup(String groupId) { if (roleRepository.findByKey(groupId) != null) { // Als een rol bekend is bij Keycloak, haal gebruikers uit keycloak @@ -413,8 +470,6 @@ public class TezzaService { } public Objecttype getObjectType(String objecttypeUrl) throws URISyntaxException { - // ObjecttypenApiPlugin plugin = null; - logger.debug("Get objecttype: " + objecttypeUrl); List<PluginConfiguration> pluginConfigurations = pluginService .getPluginConfigurations(new PluginConfigurationSearchParameters("objecttypenapi", null, null, null)); @@ -425,8 +480,6 @@ public class TezzaService { } ObjecttypenApiPlugin plugin = (ObjecttypenApiPlugin) pluginService .createInstance(pluginConfigurations.get(0).getId()); - logger.debug("plugin url: " + plugin.getUrl().toString()); - Objecttype objectType = plugin.getObjecttype(new URI(objecttypeUrl)); - return objectType; + return plugin.getObjecttype(new URI(objecttypeUrl)); } } \ No newline at end of file diff --git a/docs/src/docs/asciidoc/includes/_introduction.adoc b/docs/src/docs/asciidoc/includes/_introduction.adoc index b06c5b15353d8461380f09d06aab4b5bebed424d..340016086b55d46712f71f2360be83014e6feb2d 100644 --- a/docs/src/docs/asciidoc/includes/_introduction.adoc +++ b/docs/src/docs/asciidoc/includes/_introduction.adoc @@ -108,6 +108,12 @@ Dit haald de gegevens van een afgeronde taak op. Waarom: Voor een histories overzicht is het nodig om te zien wat de gegevens van een taak waren bij afronding. +*/api/v1/tezza/task/{taskId}/candidate-user* + +Dit haald alle Candidate users van een taak op. Hiervoor worden gebruikers die direct aan de taak zijn gekoppeld uit Keycloak. +Voor groupen die als candidate zijn gekoppeld wordt de lijst met gebruikers uit Keycloak of Alfresco gehaald. De service kijkt eerst of de groep in Keycloak bestaat, en geeft de gebruikers daarvan terug. Als deze niet bestaat in Keycloak, kijkt de service of de groep in Alfresco bestaat. Als dat het geval is, worden de gebruikers recursief opgehaald vanuit de Alfresco group en subgroepen. Gebruikers die in Alfresco gevonden worden, worden alleen teruggegeven als deze ook in Keycloak bestaan. + +Waarom: We moeten de groepen structuur van alfresco in GZAC kunnen gebruiken. + ==== Tezza Support Resource Dit bevat resources voor de support van formulieren en front-end configuratie binnen GZAC. @@ -116,6 +122,11 @@ Dit haalt alle gebruikers op uit de groep ROLE_USER. Hiervan worden enkel de ema Waarom: We moeten in een form een gebruiker kunnen aanwijzen voor toekomstige acties. +*/api/v1/tezza/group/{groupId}/users* + +Dit haalt alle gebruikers op van een bepaalde group. De service kijkt eerst of de groep in Keycloak bestaat, en geeft de gebruikers daarvan terug. Als deze niet bestaat in Keycloak, kijkt de service of de groep in Alfresco bestaat. Als dat het geval is, worden de gebruikers recursief opgehaald vanuit de Alfresco group en subgroepen. Gebruikers die in Alfresco gevonden worden, worden alleen teruggegeven als deze ook in Keycloak bestaan. + +Waarom: We moeten de groepen structuur van alfresco in GZAC kunnen gebruiken. + */api/v1/tezza/users/email/{email}* + Dit haalt een gebruiker op die voldoet aan de opgegeven email. Hiervan worden enkel de email, gebruikersnaam en volledige naam geretourneerd.