Commit 5ccdca2c authored by Benedikt Waldvogel's avatar Benedikt Waldvogel
Browse files

Add UserApi.getMemberships() to list projects and groups a user is member of

parent 883999bc
...@@ -16,6 +16,8 @@ import org.gitlab4j.api.models.CustomAttribute; ...@@ -16,6 +16,8 @@ import org.gitlab4j.api.models.CustomAttribute;
import org.gitlab4j.api.models.Email; import org.gitlab4j.api.models.Email;
import org.gitlab4j.api.models.ImpersonationToken; import org.gitlab4j.api.models.ImpersonationToken;
import org.gitlab4j.api.models.ImpersonationToken.Scope; 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.SshKey;
import org.gitlab4j.api.models.User; import org.gitlab4j.api.models.User;
import org.gitlab4j.api.utils.EmailChecker; import org.gitlab4j.api.utils.EmailChecker;
...@@ -522,7 +524,7 @@ public class UserApi extends AbstractApi { ...@@ -522,7 +524,7 @@ public class UserApi extends AbstractApi {
* Either password or resetPassword should be specified (resetPassword takes priority).</p> * Either password or resetPassword should be specified (resetPassword takes priority).</p>
* *
* <pre><code>GitLab Endpoint: POST /users</code></pre> * <pre><code>GitLab Endpoint: POST /users</code></pre>
* *
* <p>The following properties of the provided User instance can be set during creation:<pre><code> email (required) - Email * <p>The following properties of the provided User instance can be set during creation:<pre><code> email (required) - Email
* username (required) - Username * username (required) - Username
* name (required) - Name * name (required) - Name
...@@ -1211,4 +1213,21 @@ public class UserApi extends AbstractApi { ...@@ -1211,4 +1213,21 @@ public class UserApi extends AbstractApi {
public void deleteEmail(final Object userIdOrUsername, 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); delete(Response.Status.NO_CONTENT, null, "users", getUserIdOrUsername(userIdOrUsername), "emails", emailId);
} }
/**
* Lists all projects and groups a user is a member of. (admin only)
*
* <pre><code>GitLab Endpoint: GET /users/:id/memberships</code></pre>
*
* @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<Membership> 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));
}
} }
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));
}
}
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<MembershipSourceType> 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));
}
}
package org.gitlab4j.api.models;
import java.util.ArrayList;
public class Memberships extends ArrayList<Membership> {
private static final long serialVersionUID = 1L;
}
...@@ -18,9 +18,12 @@ import java.util.Optional; ...@@ -18,9 +18,12 @@ import java.util.Optional;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import org.gitlab4j.api.models.AccessLevel;
import org.gitlab4j.api.models.Email; import org.gitlab4j.api.models.Email;
import org.gitlab4j.api.models.ImpersonationToken; import org.gitlab4j.api.models.ImpersonationToken;
import org.gitlab4j.api.models.ImpersonationToken.Scope; 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.SshKey;
import org.gitlab4j.api.models.User; import org.gitlab4j.api.models.User;
import org.gitlab4j.api.models.Version; import org.gitlab4j.api.models.Version;
...@@ -447,4 +450,33 @@ public class TestUserApi extends AbstractIntegrationTest { ...@@ -447,4 +450,33 @@ public class TestUserApi extends AbstractIntegrationTest {
found = emails.stream().filter(e -> e.getEmail().equals(TEST_USER_EMAIL)).findAny().orElse(null); found = emails.stream().filter(e -> e.getEmail().equals(TEST_USER_EMAIL)).findAny().orElse(null);
assertNull(found); assertNull(found);
} }
@Test
public void testGetMemberships() throws GitLabApiException {
User currentUser = gitLabApi.getUserApi().getCurrentUser();
assertNotNull(currentUser);
List<Membership> 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());
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment