package im.tox.upsourcebot.resources; import com.google.common.collect.ImmutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import im.tox.upsourcebot.client.GitHubConnector; import im.tox.upsourcebot.core.payloads.IssueCommentWebhook; import im.tox.upsourcebot.core.payloads.IssueWebhook; import im.tox.upsourcebot.core.payloads.PullRequestWebhook; import im.tox.upsourcebot.filters.GitHubHMAC; @Path("/github-webhook/") @Consumes(MediaType.APPLICATION_JSON) @GitHubHMAC public class GitHubWebhookResource { private static final Logger LOGGER = LoggerFactory.getLogger(GitHubWebhookResource.class); private GitHubConnector gitHubConnector; private ImmutableList<String> repoNames; public GitHubWebhookResource(GitHubConnector gitHubConnector, ImmutableList<String> repoNames) { this.gitHubConnector = gitHubConnector; this.repoNames = repoNames; } @POST @Path("/issue") public Response receiveHook(IssueWebhook payload) { switch (payload.getAction()) { case "opened": case "assigned": case "unassigned": case "labeled": case "unlabeled": case "closed": case "reopened": break; default: LOGGER.error("GitHub Issue payload format changed"); return Response.status(Response.Status.NOT_IMPLEMENTED).build(); } return Response.accepted().build(); } @POST @Path("/pull-request") public Response receiveHook(PullRequestWebhook payload) { String repoName = payload.getRepository().getFullName(); if (!repoNames.contains(repoName)) { LOGGER.error("Repository {} is not configured.", repoName); return Response.status(Response.Status.BAD_REQUEST).build(); } switch (payload.getAction()) { case "opened": gitHubConnector .assignAndGreet(repoName, payload.getSender().getLogin(), payload.getNumber()); // Handle creation // Fall through to synchronize case "synchronize": break; case "assigned": case "unassigned": case "labeled": case "unlabeled": case "closed": case "reopened": break; default: LOGGER.error("GitHub Pull request payload format changed"); return Response.status(Response.Status.NOT_IMPLEMENTED).build(); } return Response.accepted().build(); } @POST @Path("/issue-comment") public Response receiveHook(IssueCommentWebhook payload) { String repoName = payload.getRepository().getFullName(); if (!repoNames.contains(repoName)) { LOGGER.error("Repository {} is not configured.", repoName); return Response.status(Response.Status.BAD_REQUEST).build(); } if (payload.getAction().equals("created")) { } else { LOGGER.error("GitHub issue comment payload format changed"); return Response.status(Response.Status.NOT_IMPLEMENTED).build(); } return Response.accepted().build(); } }