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