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 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/PropertyConstants.java b/src/test/java/org/gitlab4j/api/PropertyConstants.java index 5067c074c..6081d990a 100644 --- a/src/test/java/org/gitlab4j/api/PropertyConstants.java +++ b/src/test/java/org/gitlab4j/api/PropertyConstants.java @@ -2,33 +2,32 @@ 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"; + 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"; + // 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"; + 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"; } 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()); + } }