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()); + } }