Skip to content

Commit 419570a

Browse files
authored
Merge pull request #698 from bwaldvogel/extend-userApi-memberships
Add UserApi.getMemberships() to list projects and groups a user is member of
2 parents 69c15a3 + 5ccdca2 commit 419570a

File tree

7 files changed

+174
-29
lines changed

7 files changed

+174
-29
lines changed

.editorconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
root = true
2+
3+
[*]
4+
insert_final_newline = true
5+
6+
[*.java]
7+
indent_size = 4
8+
indent_style = space
9+
trim_trailing_whitespace = true

src/main/java/org/gitlab4j/api/UserApi.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.gitlab4j.api.models.Email;
1717
import org.gitlab4j.api.models.ImpersonationToken;
1818
import org.gitlab4j.api.models.ImpersonationToken.Scope;
19+
import org.gitlab4j.api.models.Membership;
20+
import org.gitlab4j.api.models.Memberships;
1921
import org.gitlab4j.api.models.SshKey;
2022
import org.gitlab4j.api.models.User;
2123
import org.gitlab4j.api.utils.EmailChecker;
@@ -522,7 +524,7 @@ public User createUser(User user, CharSequence password, Integer projectsLimit)
522524
* Either password or resetPassword should be specified (resetPassword takes priority).</p>
523525
*
524526
* <pre><code>GitLab Endpoint: POST /users</code></pre>
525-
*
527+
*
526528
* <p>The following properties of the provided User instance can be set during creation:<pre><code> email (required) - Email
527529
* username (required) - Username
528530
* name (required) - Name
@@ -1211,4 +1213,21 @@ public void deleteEmail(final Long emailId) throws GitLabApiException {
12111213
public void deleteEmail(final Object userIdOrUsername, final Long emailId) throws GitLabApiException {
12121214
delete(Response.Status.NO_CONTENT, null, "users", getUserIdOrUsername(userIdOrUsername), "emails", emailId);
12131215
}
1216+
1217+
/**
1218+
* Lists all projects and groups a user is a member of. (admin only)
1219+
*
1220+
* <pre><code>GitLab Endpoint: GET /users/:id/memberships</code></pre>
1221+
*
1222+
* @param userId the ID of the user to get the memberships for
1223+
* @return the list of memberships of the given user
1224+
* @throws GitLabApiException if any exception occurs
1225+
* @since GitLab 12.8
1226+
*/
1227+
public List<Membership> getMemberships(Integer userId) throws GitLabApiException {
1228+
GitLabApiForm formData = new GitLabApiForm();
1229+
Response response = get(Response.Status.OK, formData.asMap(), "users", userId, "memberships");
1230+
return (response.readEntity(Memberships.class));
1231+
}
1232+
12141233
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.gitlab4j.api.models;
2+
3+
import org.gitlab4j.api.utils.JacksonJson;
4+
5+
public class Membership {
6+
7+
private Integer sourceId;
8+
private String sourceName;
9+
private MembershipSourceType sourceType;
10+
private AccessLevel accessLevel;
11+
12+
public Integer getSourceId() {
13+
return sourceId;
14+
}
15+
16+
public void setSourceId(Integer sourceId) {
17+
this.sourceId = sourceId;
18+
}
19+
20+
public String getSourceName() {
21+
return sourceName;
22+
}
23+
24+
public void setSourceName(String sourceName) {
25+
this.sourceName = sourceName;
26+
}
27+
28+
public MembershipSourceType getSourceType() {
29+
return sourceType;
30+
}
31+
32+
public void setSourceType(MembershipSourceType sourceType) {
33+
this.sourceType = sourceType;
34+
}
35+
36+
public AccessLevel getAccessLevel() {
37+
return accessLevel;
38+
}
39+
40+
public void setAccessLevel(AccessLevel accessLevel) {
41+
this.accessLevel = accessLevel;
42+
}
43+
44+
@Override
45+
public String toString() {
46+
return (JacksonJson.toJsonString(this));
47+
}
48+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.gitlab4j.api.models;
2+
3+
import org.gitlab4j.api.utils.JacksonJsonEnumHelper;
4+
5+
import com.fasterxml.jackson.annotation.JsonCreator;
6+
import com.fasterxml.jackson.annotation.JsonValue;
7+
8+
public enum MembershipSourceType {
9+
10+
PROJECT,
11+
12+
/** Representing a group */
13+
NAMESPACE;
14+
15+
private static JacksonJsonEnumHelper<MembershipSourceType> enumHelper = new JacksonJsonEnumHelper<>(MembershipSourceType.class);
16+
17+
@JsonCreator
18+
public static MembershipSourceType forValue(String value) {
19+
return enumHelper.forValue(value);
20+
}
21+
22+
@JsonValue
23+
public String toValue() {
24+
return (enumHelper.toString(this));
25+
}
26+
27+
@Override
28+
public String toString() {
29+
return (enumHelper.toString(this));
30+
}
31+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.gitlab4j.api.models;
2+
3+
import java.util.ArrayList;
4+
5+
public class Memberships extends ArrayList<Membership> {
6+
private static final long serialVersionUID = 1L;
7+
}

src/test/java/org/gitlab4j/api/PropertyConstants.java

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,32 @@
22

33
public interface PropertyConstants {
44

5-
public static final String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
6-
public static final String TEST_PROPERTIES_FILENAME = "test-gitlab4j.properties";
5+
String TEST_PROJECT_SUBDIRECTORY_PATH = "src/main/docs/test-project.txt";
76

8-
// The following are keys used to look up values in the test propertiues file
9-
public static final String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
10-
public static final String ADMIN_USERNAME_KEY = "TEST_ADMIN_USERNAME";
11-
public static final String ACCESS_TOKEN_KEY = "TEST_ACCESS_TOKEN";
12-
public static final String BLOCK_USERNAME_KEY = "TEST_BLOCK_USERNAME";
13-
public static final String GROUP_KEY = "TEST_GROUP";
14-
public static final String GROUP_MEMBER_USERNAME_KEY = "TEST_GROUP_MEMBER_USERNAME";
15-
public static final String GROUP_PROJECT_KEY = "TEST_GROUP_PROJECT";
16-
public static final String HEALTH_CHECK_TOKEN_KEY = "TEST_HEALTH_CHECK_TOKEN";
17-
public static final String HOST_URL_KEY = "TEST_HOST_URL";
18-
public static final String LOGIN_PASSWORD_KEY = "TEST_LOGIN_PASSWORD";
19-
public static final String LOGIN_USERNAME_KEY = "TEST_LOGIN_USERNAME";
20-
public static final String NAMESPACE_KEY = "TEST_NAMESPACE";
21-
public static final String PRIVATE_TOKEN_KEY = "TEST_PRIVATE_TOKEN";
22-
public static final String PROJECT_NAME_KEY = "TEST_PROJECT_NAME";
23-
public static final String PROXY_PASSWORD_KEY = "TEST_PROXY_PASSWORD";
24-
public static final String PROXY_URI_KEY = "TEST_PROXY_URI";
25-
public static final String PROXY_USERNAME_KEY = "TEST_PROXY_USERNAME";
26-
public static final String SUB_GROUP_KEY = "TEST_SUB_GROUP";
27-
public static final String SUDO_AS_USERNAME_KEY = "TEST_SUDO_AS_USERNAME";
28-
public static final String TEST_REQUEST_ACCESS_USERNAME_KEY = "TEST_REQUEST_ACCESS_USERNAME";
29-
public static final String USERNAME_KEY = "TEST_USERNAME";
30-
public static final String XFER_NAMESPACE_KEY = "TEST_XFER_NAMESPACE";
31-
public static final String EXTERNAL_PROVIDER_KEY = "TEST_EXTERNAL_PROVIDER";
32-
public static final String EXTERNAL_UID_KEY = "TEST_EXTERNAL_UID";
33-
public static final String EXTERNAL_USERNAME_KEY = "TEST_EXTERNAL_USERNAME";
7+
// The following are keys used to look up values in the test properties file
8+
String ADMIN_PASSWORD_KEY = "TEST_ADMIN_PASSWORD";
9+
String ADMIN_USERNAME_KEY = "TEST_ADMIN_USERNAME";
10+
String ACCESS_TOKEN_KEY = "TEST_ACCESS_TOKEN";
11+
String BLOCK_USERNAME_KEY = "TEST_BLOCK_USERNAME";
12+
String GROUP_KEY = "TEST_GROUP";
13+
String GROUP_MEMBER_USERNAME_KEY = "TEST_GROUP_MEMBER_USERNAME";
14+
String GROUP_PROJECT_KEY = "TEST_GROUP_PROJECT";
15+
String HEALTH_CHECK_TOKEN_KEY = "TEST_HEALTH_CHECK_TOKEN";
16+
String HOST_URL_KEY = "TEST_HOST_URL";
17+
String LOGIN_PASSWORD_KEY = "TEST_LOGIN_PASSWORD";
18+
String LOGIN_USERNAME_KEY = "TEST_LOGIN_USERNAME";
19+
String NAMESPACE_KEY = "TEST_NAMESPACE";
20+
String PRIVATE_TOKEN_KEY = "TEST_PRIVATE_TOKEN";
21+
String PROJECT_NAME_KEY = "TEST_PROJECT_NAME";
22+
String PROXY_PASSWORD_KEY = "TEST_PROXY_PASSWORD";
23+
String PROXY_URI_KEY = "TEST_PROXY_URI";
24+
String PROXY_USERNAME_KEY = "TEST_PROXY_USERNAME";
25+
String SUB_GROUP_KEY = "TEST_SUB_GROUP";
26+
String SUDO_AS_USERNAME_KEY = "TEST_SUDO_AS_USERNAME";
27+
String TEST_REQUEST_ACCESS_USERNAME_KEY = "TEST_REQUEST_ACCESS_USERNAME";
28+
String USERNAME_KEY = "TEST_USERNAME";
29+
String XFER_NAMESPACE_KEY = "TEST_XFER_NAMESPACE";
30+
String EXTERNAL_PROVIDER_KEY = "TEST_EXTERNAL_PROVIDER";
31+
String EXTERNAL_UID_KEY = "TEST_EXTERNAL_UID";
32+
String EXTERNAL_USERNAME_KEY = "TEST_EXTERNAL_USERNAME";
3433
}

src/test/java/org/gitlab4j/api/TestUserApi.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818

1919
import javax.ws.rs.core.Response;
2020

21+
import org.gitlab4j.api.models.AccessLevel;
2122
import org.gitlab4j.api.models.Email;
2223
import org.gitlab4j.api.models.ImpersonationToken;
2324
import org.gitlab4j.api.models.ImpersonationToken.Scope;
25+
import org.gitlab4j.api.models.Membership;
26+
import org.gitlab4j.api.models.MembershipSourceType;
2427
import org.gitlab4j.api.models.SshKey;
2528
import org.gitlab4j.api.models.User;
2629
import org.gitlab4j.api.models.Version;
@@ -447,4 +450,33 @@ public void testEmails() throws GitLabApiException {
447450
found = emails.stream().filter(e -> e.getEmail().equals(TEST_USER_EMAIL)).findAny().orElse(null);
448451
assertNull(found);
449452
}
453+
454+
@Test
455+
public void testGetMemberships() throws GitLabApiException {
456+
User currentUser = gitLabApi.getUserApi().getCurrentUser();
457+
assertNotNull(currentUser);
458+
List<Membership> memberships = gitLabApi.getUserApi().getMemberships(currentUser.getId());
459+
assertNotNull(memberships);
460+
assertEquals(3, memberships.size());
461+
462+
Membership membership1 = memberships.get(0);
463+
assertMembershipEquals(membership1, 1, "test-project", MembershipSourceType.PROJECT, AccessLevel.MAINTAINER);
464+
465+
Membership membership2 = memberships.get(1);
466+
assertMembershipEquals(membership2, 4, "Test Group", MembershipSourceType.NAMESPACE, AccessLevel.OWNER);
467+
468+
Membership membership3 = memberships.get(2);
469+
assertMembershipEquals(membership3, 5, "subgroup", MembershipSourceType.NAMESPACE, AccessLevel.OWNER);
470+
}
471+
472+
private void assertMembershipEquals(Membership actualMembership,
473+
int expectedSourceId,
474+
String expectedSourceName,
475+
MembershipSourceType expectedSourceType,
476+
AccessLevel expectedAccessLevel) {
477+
assertEquals(expectedSourceId, actualMembership.getSourceId().intValue());
478+
assertEquals(expectedSourceName, actualMembership.getSourceName());
479+
assertEquals(expectedSourceType, actualMembership.getSourceType());
480+
assertEquals(expectedAccessLevel, actualMembership.getAccessLevel());
481+
}
450482
}

0 commit comments

Comments
 (0)