diff --git a/src/main/java/org/kohsuke/github/GHMembership.java b/src/main/java/org/kohsuke/github/GHMembership.java new file mode 100644 index 000000000..2847e1891 --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHMembership.java @@ -0,0 +1,84 @@ +package org.kohsuke.github; + +import java.io.IOException; +import java.net.URL; +import java.util.Locale; + +/** + * Represents a membership of a user in an organization. + * + * @author Kohsuke Kawaguchi + * @see GHMyself#listOrgMemberships() + */ +public class GHMembership /* extends GHObject --- but it doesn't have id, created_at, etc. */ { + GitHub root; + + String url; + String state; + String role; + GHUser user; + GHOrganization organization; + + public URL getUrl() { + return GitHub.parseURL(url); + } + + public State getState() { + return Enum.valueOf(State.class, state.toUpperCase(Locale.ENGLISH)); + } + + public Role getRole() { + return Enum.valueOf(Role.class, role.toUpperCase(Locale.ENGLISH)); + } + + public GHUser getUser() { + return user; + } + + public GHOrganization getOrganization() { + return organization; + } + + /** + * Accepts a pending invitation to an organization. + * + * @see GHMyself#getMembership(GHOrganization) + */ + public void activate() throws IOException { + root.retrieve().method("PATCH").with("state",State.ACTIVE).to(url,this); + } + + /*package*/ GHMembership wrap(GitHub root) { + this.root = root; + if (user!=null) user = root.getUser(user.wrapUp(root)); + if (organization!=null) organization.wrapUp(root); + return this; + } + + /*package*/ static void wrap(GHMembership[] page, GitHub root) { + for (GHMembership m : page) + m.wrap(root); + } + + /** + * Role of a user in an organization. + */ + public enum Role { + /** + * Organization owner. + */ + ADMIN, + /** + * Non-owner organization member. + */ + MEMBER; + } + + /** + * Whether a role is currently active or waiting for acceptance (pending) + */ + public enum State { + ACTIVE, + PENDING; + } +} diff --git a/src/main/java/org/kohsuke/github/GHMyself.java b/src/main/java/org/kohsuke/github/GHMyself.java index c7ae80dd7..cc05f03bc 100644 --- a/src/main/java/org/kohsuke/github/GHMyself.java +++ b/src/main/java/org/kohsuke/github/GHMyself.java @@ -178,6 +178,39 @@ public class GHMyself extends GHUser { return listRepositories(); } + /** + * List your organization memberships + */ + public PagedIterable listOrgMemberships() { + return listOrgMemberships(null); + } + + /** + * List your organization memberships + * + * @param state + * Filter by a specific state + */ + public PagedIterable listOrgMemberships(final GHMembership.State state) { + return new PagedIterable() { + public PagedIterator _iterator(int pageSize) { + return new PagedIterator(root.retrieve().with("state",state).asIterator("/user/memberships/orgs", GHMembership[].class, pageSize)) { + @Override + protected void wrapUp(GHMembership[] page) { + GHMembership.wrap(page,root); + } + }; + } + }; + } + + /** + * Gets your membership in a specific organization. + */ + public GHMembership getMembership(GHOrganization o) throws IOException { + return root.retrieve().to("/user/memberships/orgs/"+o.getLogin(),GHMembership.class).wrap(root); + } + // public void addEmails(Collection emails) throws IOException { //// new Requester(root,ApiVersion.V3).withCredential().to("/user/emails"); // root.retrieveWithAuth3() diff --git a/src/main/java/org/kohsuke/github/GHUser.java b/src/main/java/org/kohsuke/github/GHUser.java index 790f24ec2..77beb11b8 100644 --- a/src/main/java/org/kohsuke/github/GHUser.java +++ b/src/main/java/org/kohsuke/github/GHUser.java @@ -214,4 +214,9 @@ public class GHUser extends GHPerson { if (tail.length()>0 && !tail.startsWith("/")) tail='/'+tail; return "/users/" + login + tail; } + + /*package*/ GHUser wrapUp(GitHub root) { + super.wrapUp(root); + return this; + } } diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 2a54626f2..b50b2234e 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -340,7 +340,7 @@ public class GitHub { /** * Interns the given {@link GHUser}. */ - protected GHUser getUser(GHUser orig) throws IOException { + protected GHUser getUser(GHUser orig) { GHUser u = users.get(orig.getLogin()); if (u==null) { orig.root = this; diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 724678112..0a958418b 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -888,6 +888,21 @@ public class AppTest extends AbstractGitHubApiTestBase { a.delete(); } + @Test + public void listOrgMemberships() throws Exception { + GHMyself me = gitHub.getMyself(); + for (GHMembership m : me.listOrgMemberships()) { + assertThat(m.getUser(), is((GHUser)me)); + assertNotNull(m.getState()); + assertNotNull(m.getRole()); + + System.out.printf("%s %s %s\n", + m.getOrganization().getLogin(), + m.getState(), + m.getRole()); + } + } + private void kohsuke() { String login = getUser().getLogin(); Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2"));