From a9e35138db1a0273c753a21d59fe13534f3344ba Mon Sep 17 00:00:00 2001
From: Michael Breu <Michael.Breu@arctis.at>
Date: Fri, 2 Aug 2024 18:29:13 +0200
Subject: [PATCH] P;D

---
 .../repository/gitlab/GitLabRepository.java   |  3 +-
 .../security/oauth2/UserDetailsFetcher.java   | 40 +++++++++++++++----
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java
index 1fc707820..1ce65020f 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/gitlab/GitLabRepository.java
@@ -111,7 +111,6 @@ public class GitLabRepository {
   @Cacheable(cacheNames = FULLPATH_OF_GROUP_CACHE)
   public String getFullPathOfGroup(final Long groupId) throws GitLabApiException {
     final Group group = getAdminGitLabApi().getGroupApi().getGroup(groupId);
-    final String fullPath = group.getFullPath();
-    return fullPath;
+    return group.getFullPath();
   }
 }
diff --git a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
index f25b24c7d..9c4f010be 100644
--- a/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
+++ b/src/main/java/at/ac/uibk/gitsearch/security/oauth2/UserDetailsFetcher.java
@@ -12,6 +12,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.stream.Stream;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -123,14 +124,7 @@ public class UserDetailsFetcher {
       }
       userToken = requestGitLabUserToken(gitUser, gitLabApi);
 
-      List<Membership> memberships = gitLabApi.getUserApi().getMemberships(gitUser.getId());
-      for (Membership membership : memberships) {
-        if (MembershipSourceType.NAMESPACE.equals(membership.getSourceType())) {
-          final Long groupId = membership.getSourceId();
-          final String fullPath = gitLabRepository.getFullPathOfGroup(groupId);
-          authorities.add(fullPath);
-        }
-      }
+      getUserMemberships(gitLabApi, gitUser).forEach(gitAuthority -> authorities.add(gitAuthority));
 
       modified |= updateAttribute(gitUser.getAvatarUrl(), u.getImageUrl(), u::setImageUrl);
       modified |= updateAttribute(gitUser.getEmail(), u.getEmail(), u::setEmail);
@@ -151,6 +145,36 @@ public class UserDetailsFetcher {
     return new UserDetailsInfo(userToken, modified);
   }
 
+  /**
+   * returns the pathes of all groups the user belongs to
+   *
+   * @param gitLabApi
+   * @param gitUser
+   * @return
+   */
+  public Stream<String> getUserMemberships(GitLabApi gitLabApi, User gitUser) {
+    List<Membership> memberships;
+    try {
+      memberships = gitLabApi.getUserApi().getMemberships(gitUser.getId());
+    } catch (GitLabApiException e) {
+      logger.warn("Cannot read group path for {}", gitUser);
+      return Stream.empty();
+    }
+    return memberships
+      .stream()
+      .filter(membership -> MembershipSourceType.NAMESPACE.equals(membership.getSourceType()))
+      .map(membership -> membership.getSourceId()) // map to group id
+      .map(groupId -> {
+        try {
+          return gitLabRepository.getFullPathOfGroup(groupId);
+        } catch (GitLabApiException e) {
+          logger.warn("Cannot read group path for {}", groupId);
+          return null;
+        }
+      })
+      .filter(path -> path != null);
+  }
+
   private String generatePassword() {
     return RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz=%$-.");
   }
-- 
GitLab