From 6dd4373fd8e0f2894a3417c877ac3867fe97649a Mon Sep 17 00:00:00 2001
From: Benedikt Waldvogel
Date: Tue, 4 May 2021 12:05:47 +0200
Subject: [PATCH 1/5] Introduce .editorconfig file with basic code formatting
rules
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Many IDEs (such as IntelliJ IDEA) and editors already use the .editorconfig file if available.
For most popular editors there’s a plugin that adds EditorConfig support.
See https://editorconfig.org/ for more details.
---
.editorconfig | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100644 .editorconfig
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..46b471a5a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+insert_final_newline = true
+
+[*.java]
+indent_size = 4
+indent_style = space
+trim_trailing_whitespace = true
From c9b5a8d60372a75aad5f6328c2b11cce46c8f47f Mon Sep 17 00:00:00 2001
From: Benedikt Waldvogel
Date: Tue, 4 May 2021 12:06:10 +0200
Subject: [PATCH 2/5] Remove unused constant in PropertyConstants
---
src/test/java/org/gitlab4j/api/PropertyConstants.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/test/java/org/gitlab4j/api/PropertyConstants.java b/src/test/java/org/gitlab4j/api/PropertyConstants.java
index 5067c074c..a8c741df9 100644
--- a/src/test/java/org/gitlab4j/api/PropertyConstants.java
+++ b/src/test/java/org/gitlab4j/api/PropertyConstants.java
@@ -3,7 +3,6 @@
public interface PropertyConstants {
public static final String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
- public static final String TEST_PROPERTIES_FILENAME = "test-gitlab4j.properties";
// The following are keys used to look up values in the test propertiues file
public static final String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
From 4397653135cff7534020aac4419010284d043134 Mon Sep 17 00:00:00 2001
From: Benedikt Waldvogel
Date: Tue, 4 May 2021 12:06:35 +0200
Subject: [PATCH 3/5] Remove unnecessary 'public static final' in
PropertyConstants
---
.../org/gitlab4j/api/PropertyConstants.java | 52 +++++++++----------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/src/test/java/org/gitlab4j/api/PropertyConstants.java b/src/test/java/org/gitlab4j/api/PropertyConstants.java
index a8c741df9..9c5d22122 100644
--- a/src/test/java/org/gitlab4j/api/PropertyConstants.java
+++ b/src/test/java/org/gitlab4j/api/PropertyConstants.java
@@ -2,32 +2,32 @@
public interface PropertyConstants {
- public static final String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
+ String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
// The following are keys used to look up values in the test propertiues file
- public static final String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
- public static final String ADMIN_USERNAME_KEY = "TEST_ADMIN_USERNAME";
- public static final String ACCESS_TOKEN_KEY = "TEST_ACCESS_TOKEN";
- public static final String BLOCK_USERNAME_KEY = "TEST_BLOCK_USERNAME";
- public static final String GROUP_KEY = "TEST_GROUP";
- public static final String GROUP_MEMBER_USERNAME_KEY = "TEST_GROUP_MEMBER_USERNAME";
- public static final String GROUP_PROJECT_KEY = "TEST_GROUP_PROJECT";
- public static final String HEALTH_CHECK_TOKEN_KEY = "TEST_HEALTH_CHECK_TOKEN";
- public static final String HOST_URL_KEY = "TEST_HOST_URL";
- public static final String LOGIN_PASSWORD_KEY = "TEST_LOGIN_PASSWORD";
- public static final String LOGIN_USERNAME_KEY = "TEST_LOGIN_USERNAME";
- public static final String NAMESPACE_KEY = "TEST_NAMESPACE";
- public static final String PRIVATE_TOKEN_KEY = "TEST_PRIVATE_TOKEN";
- public static final String PROJECT_NAME_KEY = "TEST_PROJECT_NAME";
- public static final String PROXY_PASSWORD_KEY = "TEST_PROXY_PASSWORD";
- public static final String PROXY_URI_KEY = "TEST_PROXY_URI";
- public static final String PROXY_USERNAME_KEY = "TEST_PROXY_USERNAME";
- public static final String SUB_GROUP_KEY = "TEST_SUB_GROUP";
- public static final String SUDO_AS_USERNAME_KEY = "TEST_SUDO_AS_USERNAME";
- public static final String TEST_REQUEST_ACCESS_USERNAME_KEY = "TEST_REQUEST_ACCESS_USERNAME";
- public static final String USERNAME_KEY = "TEST_USERNAME";
- public static final String XFER_NAMESPACE_KEY = "TEST_XFER_NAMESPACE";
- public static final String EXTERNAL_PROVIDER_KEY = "TEST_EXTERNAL_PROVIDER";
- public static final String EXTERNAL_UID_KEY = "TEST_EXTERNAL_UID";
- public static final String EXTERNAL_USERNAME_KEY = "TEST_EXTERNAL_USERNAME";
+ String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
+ String ADMIN_USERNAME_KEY = "TEST_ADMIN_USERNAME";
+ String ACCESS_TOKEN_KEY = "TEST_ACCESS_TOKEN";
+ String BLOCK_USERNAME_KEY = "TEST_BLOCK_USERNAME";
+ String GROUP_KEY = "TEST_GROUP";
+ String GROUP_MEMBER_USERNAME_KEY = "TEST_GROUP_MEMBER_USERNAME";
+ String GROUP_PROJECT_KEY = "TEST_GROUP_PROJECT";
+ String HEALTH_CHECK_TOKEN_KEY = "TEST_HEALTH_CHECK_TOKEN";
+ String HOST_URL_KEY = "TEST_HOST_URL";
+ String LOGIN_PASSWORD_KEY = "TEST_LOGIN_PASSWORD";
+ String LOGIN_USERNAME_KEY = "TEST_LOGIN_USERNAME";
+ String NAMESPACE_KEY = "TEST_NAMESPACE";
+ String PRIVATE_TOKEN_KEY = "TEST_PRIVATE_TOKEN";
+ String PROJECT_NAME_KEY = "TEST_PROJECT_NAME";
+ String PROXY_PASSWORD_KEY = "TEST_PROXY_PASSWORD";
+ String PROXY_URI_KEY = "TEST_PROXY_URI";
+ String PROXY_USERNAME_KEY = "TEST_PROXY_USERNAME";
+ String SUB_GROUP_KEY = "TEST_SUB_GROUP";
+ String SUDO_AS_USERNAME_KEY = "TEST_SUDO_AS_USERNAME";
+ String TEST_REQUEST_ACCESS_USERNAME_KEY = "TEST_REQUEST_ACCESS_USERNAME";
+ String USERNAME_KEY = "TEST_USERNAME";
+ String XFER_NAMESPACE_KEY = "TEST_XFER_NAMESPACE";
+ String EXTERNAL_PROVIDER_KEY = "TEST_EXTERNAL_PROVIDER";
+ String EXTERNAL_UID_KEY = "TEST_EXTERNAL_UID";
+ String EXTERNAL_USERNAME_KEY = "TEST_EXTERNAL_USERNAME";
}
From 883999bcd477f482411b54e24f562aaf64570e92 Mon Sep 17 00:00:00 2001
From: Benedikt Waldvogel
Date: Tue, 4 May 2021 12:06:48 +0200
Subject: [PATCH 4/5] Fix typo in a comment
---
src/test/java/org/gitlab4j/api/PropertyConstants.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/org/gitlab4j/api/PropertyConstants.java b/src/test/java/org/gitlab4j/api/PropertyConstants.java
index 9c5d22122..6081d990a 100644
--- a/src/test/java/org/gitlab4j/api/PropertyConstants.java
+++ b/src/test/java/org/gitlab4j/api/PropertyConstants.java
@@ -4,7 +4,7 @@ public interface PropertyConstants {
String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
- // The following are keys used to look up values in the test propertiues file
+ // The following are keys used to look up values in the test properties file
String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
String ADMIN_USERNAME_KEY = "TEST_ADMIN_USERNAME";
String ACCESS_TOKEN_KEY = "TEST_ACCESS_TOKEN";
From 5ccdca2ce0642253759d894824c7384b4dee38c1 Mon Sep 17 00:00:00 2001
From: Benedikt Waldvogel
Date: Tue, 4 May 2021 12:25:47 +0200
Subject: [PATCH 5/5] Add UserApi.getMemberships() to list projects and groups
a user is member of
---
src/main/java/org/gitlab4j/api/UserApi.java | 21 +++++++-
.../org/gitlab4j/api/models/Membership.java | 48 +++++++++++++++++++
.../api/models/MembershipSourceType.java | 31 ++++++++++++
.../org/gitlab4j/api/models/Memberships.java | 7 +++
.../java/org/gitlab4j/api/TestUserApi.java | 32 +++++++++++++
5 files changed, 138 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/org/gitlab4j/api/models/Membership.java
create mode 100644 src/main/java/org/gitlab4j/api/models/MembershipSourceType.java
create mode 100644 src/main/java/org/gitlab4j/api/models/Memberships.java
diff --git a/src/main/java/org/gitlab4j/api/UserApi.java b/src/main/java/org/gitlab4j/api/UserApi.java
index f734e5441..b312d3968 100644
--- a/src/main/java/org/gitlab4j/api/UserApi.java
+++ b/src/main/java/org/gitlab4j/api/UserApi.java
@@ -16,6 +16,8 @@
import org.gitlab4j.api.models.Email;
import org.gitlab4j.api.models.ImpersonationToken;
import org.gitlab4j.api.models.ImpersonationToken.Scope;
+import org.gitlab4j.api.models.Membership;
+import org.gitlab4j.api.models.Memberships;
import org.gitlab4j.api.models.SshKey;
import org.gitlab4j.api.models.User;
import org.gitlab4j.api.utils.EmailChecker;
@@ -522,7 +524,7 @@ public User createUser(User user, CharSequence password, Integer projectsLimit)
* Either password or resetPassword should be specified (resetPassword takes priority).
*
* GitLab Endpoint: POST /users
- *
+ *
* The following properties of the provided User instance can be set during creation:
email (required) - Email
* username (required) - Username
* name (required) - Name
@@ -1211,4 +1213,21 @@ public void deleteEmail(final Long emailId) throws GitLabApiException {
public void deleteEmail(final Object userIdOrUsername, final Long emailId) throws GitLabApiException {
delete(Response.Status.NO_CONTENT, null, "users", getUserIdOrUsername(userIdOrUsername), "emails", emailId);
}
+
+ /**
+ * Lists all projects and groups a user is a member of. (admin only)
+ *
+ * GitLab Endpoint: GET /users/:id/memberships
+ *
+ * @param userId the ID of the user to get the memberships for
+ * @return the list of memberships of the given user
+ * @throws GitLabApiException if any exception occurs
+ * @since GitLab 12.8
+ */
+ public List getMemberships(Integer userId) throws GitLabApiException {
+ GitLabApiForm formData = new GitLabApiForm();
+ Response response = get(Response.Status.OK, formData.asMap(), "users", userId, "memberships");
+ return (response.readEntity(Memberships.class));
+ }
+
}
diff --git a/src/main/java/org/gitlab4j/api/models/Membership.java b/src/main/java/org/gitlab4j/api/models/Membership.java
new file mode 100644
index 000000000..6175fe4f5
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/models/Membership.java
@@ -0,0 +1,48 @@
+package org.gitlab4j.api.models;
+
+import org.gitlab4j.api.utils.JacksonJson;
+
+public class Membership {
+
+ private Integer sourceId;
+ private String sourceName;
+ private MembershipSourceType sourceType;
+ private AccessLevel accessLevel;
+
+ public Integer getSourceId() {
+ return sourceId;
+ }
+
+ public void setSourceId(Integer sourceId) {
+ this.sourceId = sourceId;
+ }
+
+ public String getSourceName() {
+ return sourceName;
+ }
+
+ public void setSourceName(String sourceName) {
+ this.sourceName = sourceName;
+ }
+
+ public MembershipSourceType getSourceType() {
+ return sourceType;
+ }
+
+ public void setSourceType(MembershipSourceType sourceType) {
+ this.sourceType = sourceType;
+ }
+
+ public AccessLevel getAccessLevel() {
+ return accessLevel;
+ }
+
+ public void setAccessLevel(AccessLevel accessLevel) {
+ this.accessLevel = accessLevel;
+ }
+
+ @Override
+ public String toString() {
+ return (JacksonJson.toJsonString(this));
+ }
+}
diff --git a/src/main/java/org/gitlab4j/api/models/MembershipSourceType.java b/src/main/java/org/gitlab4j/api/models/MembershipSourceType.java
new file mode 100644
index 000000000..8f651f29d
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/models/MembershipSourceType.java
@@ -0,0 +1,31 @@
+package org.gitlab4j.api.models;
+
+import org.gitlab4j.api.utils.JacksonJsonEnumHelper;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum MembershipSourceType {
+
+ PROJECT,
+
+ /** Representing a group */
+ NAMESPACE;
+
+ private static JacksonJsonEnumHelper enumHelper = new JacksonJsonEnumHelper<>(MembershipSourceType.class);
+
+ @JsonCreator
+ public static MembershipSourceType forValue(String value) {
+ return enumHelper.forValue(value);
+ }
+
+ @JsonValue
+ public String toValue() {
+ return (enumHelper.toString(this));
+ }
+
+ @Override
+ public String toString() {
+ return (enumHelper.toString(this));
+ }
+}
diff --git a/src/main/java/org/gitlab4j/api/models/Memberships.java b/src/main/java/org/gitlab4j/api/models/Memberships.java
new file mode 100644
index 000000000..beb9ec55b
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/models/Memberships.java
@@ -0,0 +1,7 @@
+package org.gitlab4j.api.models;
+
+import java.util.ArrayList;
+
+public class Memberships extends ArrayList {
+ private static final long serialVersionUID = 1L;
+}
diff --git a/src/test/java/org/gitlab4j/api/TestUserApi.java b/src/test/java/org/gitlab4j/api/TestUserApi.java
index e9e3f889c..35f929880 100644
--- a/src/test/java/org/gitlab4j/api/TestUserApi.java
+++ b/src/test/java/org/gitlab4j/api/TestUserApi.java
@@ -18,9 +18,12 @@
import javax.ws.rs.core.Response;
+import org.gitlab4j.api.models.AccessLevel;
import org.gitlab4j.api.models.Email;
import org.gitlab4j.api.models.ImpersonationToken;
import org.gitlab4j.api.models.ImpersonationToken.Scope;
+import org.gitlab4j.api.models.Membership;
+import org.gitlab4j.api.models.MembershipSourceType;
import org.gitlab4j.api.models.SshKey;
import org.gitlab4j.api.models.User;
import org.gitlab4j.api.models.Version;
@@ -447,4 +450,33 @@ public void testEmails() throws GitLabApiException {
found = emails.stream().filter(e -> e.getEmail().equals(TEST_USER_EMAIL)).findAny().orElse(null);
assertNull(found);
}
+
+ @Test
+ public void testGetMemberships() throws GitLabApiException {
+ User currentUser = gitLabApi.getUserApi().getCurrentUser();
+ assertNotNull(currentUser);
+ List memberships = gitLabApi.getUserApi().getMemberships(currentUser.getId());
+ assertNotNull(memberships);
+ assertEquals(3, memberships.size());
+
+ Membership membership1 = memberships.get(0);
+ assertMembershipEquals(membership1, 1, "test-project", MembershipSourceType.PROJECT, AccessLevel.MAINTAINER);
+
+ Membership membership2 = memberships.get(1);
+ assertMembershipEquals(membership2, 4, "Test Group", MembershipSourceType.NAMESPACE, AccessLevel.OWNER);
+
+ Membership membership3 = memberships.get(2);
+ assertMembershipEquals(membership3, 5, "subgroup", MembershipSourceType.NAMESPACE, AccessLevel.OWNER);
+ }
+
+ private void assertMembershipEquals(Membership actualMembership,
+ int expectedSourceId,
+ String expectedSourceName,
+ MembershipSourceType expectedSourceType,
+ AccessLevel expectedAccessLevel) {
+ assertEquals(expectedSourceId, actualMembership.getSourceId().intValue());
+ assertEquals(expectedSourceName, actualMembership.getSourceName());
+ assertEquals(expectedSourceType, actualMembership.getSourceType());
+ assertEquals(expectedAccessLevel, actualMembership.getAccessLevel());
+ }
}