diff --git a/src/main/java/org/gitlab4j/api/ProjectApi.java b/src/main/java/org/gitlab4j/api/ProjectApi.java index 626181e73..87611da26 100644 --- a/src/main/java/org/gitlab4j/api/ProjectApi.java +++ b/src/main/java/org/gitlab4j/api/ProjectApi.java @@ -2075,6 +2075,7 @@ public ProjectHook addHook(Object projectIdOrPath, String url, ProjectHook enabl .withParam("repository_update_events", enabledHooks.getRepositoryUpdateEvents(), false) .withParam("deployment_events", enabledHooks.getDeploymentEvents(), false) .withParam("releases_events", enabledHooks.getReleasesEvents(), false) + .withParam("deployment_events", enabledHooks.getDeploymentEvents(), false) .withParam("token", secretToken, false); Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "hooks"); return (response.readEntity(ProjectHook.class)); @@ -2146,14 +2147,20 @@ public ProjectHook modifyHook(ProjectHook hook) throws GitLabApiException { GitLabApiForm formData = new GitLabApiForm() .withParam("url", hook.getUrl(), true) .withParam("push_events", hook.getPushEvents(), false) + .withParam("push_events_branch_filter", hook.getPushEventsBranchFilter(), false) .withParam("issues_events", hook.getIssuesEvents(), false) + .withParam("confidential_issues_events", hook.getConfidentialIssuesEvents(), false) .withParam("merge_requests_events", hook.getMergeRequestsEvents(), false) .withParam("tag_push_events", hook.getTagPushEvents(), false) .withParam("note_events", hook.getNoteEvents(), false) + .withParam("confidential_note_events", hook.getConfidentialNoteEvents(), false) .withParam("job_events", hook.getJobEvents(), false) .withParam("pipeline_events", hook.getPipelineEvents(), false) .withParam("wiki_page_events", hook.getWikiPageEvents(), false) .withParam("enable_ssl_verification", hook.getEnableSslVerification(), false) + .withParam("repository_update_events", hook.getRepositoryUpdateEvents(), false) + .withParam("releases_events", hook.getReleasesEvents(), false) + .withParam("deployment_events", hook.getDeploymentEvents(), false) .withParam("token", hook.getToken(), false); Response response = put(Response.Status.OK, formData.asMap(), "projects", hook.getProjectId(), "hooks", hook.getId()); diff --git a/src/main/java/org/gitlab4j/api/webhook/DeploymentEvent.java b/src/main/java/org/gitlab4j/api/webhook/DeploymentEvent.java new file mode 100644 index 000000000..9436a4934 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/webhook/DeploymentEvent.java @@ -0,0 +1,124 @@ +package org.gitlab4j.api.webhook; + +import org.gitlab4j.api.models.User; +import org.gitlab4j.api.utils.JacksonJson; + +public class DeploymentEvent extends AbstractEvent { + + public static final String X_GITLAB_EVENT = "Deployment Hook"; + public static final String OBJECT_KIND = "deployment"; + + private String status; + private String statusChangedAt; + private Integer deployableId; + private String deployableUrl; + private String environment; + private EventProject project; + private String shortSha; + private User user; + private String userUrl; + private String commitUrl; + private String commitTitle; + + public String getObjectKind() { + return (OBJECT_KIND); + } + + public void setObjectKind(String objectKind) { + if (!OBJECT_KIND.equals(objectKind)) + throw new RuntimeException("Invalid object_kind (" + objectKind + "), must be '" + OBJECT_KIND + "'"); + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatusChangedAt() { + return statusChangedAt; + } + + public void setStatusChangedAt(String statusChangedAt) { + this.statusChangedAt = statusChangedAt; + } + + public Integer getDeployableId() { + return deployableId; + } + + public void setDeployableId(Integer deployableId) { + this.deployableId = deployableId; + } + + public String getDeployableUrl() { + return deployableUrl; + } + + public void setDeployableUrl(String deployableUrl) { + this.deployableUrl = deployableUrl; + } + + public String getEnvironment() { + return environment; + } + + public void setEnvironment(String environment) { + this.environment = environment; + } + + public EventProject getProject() { + return project; + } + + public void setProject(EventProject project) { + this.project = project; + } + + public String getShortSha() { + return shortSha; + } + + public void setShortSha(String shortSha) { + this.shortSha = shortSha; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public String getUserUrl() { + return userUrl; + } + + public void setUserUrl(String userUrl) { + this.userUrl = userUrl; + } + + public String getCommitUrl() { + return commitUrl; + } + + public void setCommitUrl(String commitUrl) { + this.commitUrl = commitUrl; + } + + public String getCommitTitle() { + return commitTitle; + } + + public void setCommitTitle(String commitTitle) { + this.commitTitle = commitTitle; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/src/main/java/org/gitlab4j/api/webhook/Event.java b/src/main/java/org/gitlab4j/api/webhook/Event.java index 2238ef945..e95090cec 100644 --- a/src/main/java/org/gitlab4j/api/webhook/Event.java +++ b/src/main/java/org/gitlab4j/api/webhook/Event.java @@ -17,7 +17,9 @@ @JsonSubTypes.Type(value = PipelineEvent.class, name = PipelineEvent.OBJECT_KIND), @JsonSubTypes.Type(value = PushEvent.class, name = PushEvent.OBJECT_KIND), @JsonSubTypes.Type(value = TagPushEvent.class, name = TagPushEvent.OBJECT_KIND), - @JsonSubTypes.Type(value = WikiPageEvent.class, name = WikiPageEvent.OBJECT_KIND) + @JsonSubTypes.Type(value = WikiPageEvent.class, name = WikiPageEvent.OBJECT_KIND), + @JsonSubTypes.Type(value = DeploymentEvent.class, name = DeploymentEvent.OBJECT_KIND), + @JsonSubTypes.Type(value = ReleaseEvent.class, name = ReleaseEvent.OBJECT_KIND) }) public interface Event { String getObjectKind(); diff --git a/src/main/java/org/gitlab4j/api/webhook/EventReleaseAssets.java b/src/main/java/org/gitlab4j/api/webhook/EventReleaseAssets.java new file mode 100644 index 000000000..964bf2945 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/webhook/EventReleaseAssets.java @@ -0,0 +1,41 @@ +package org.gitlab4j.api.webhook; + +import org.gitlab4j.api.utils.JacksonJson; + +import java.util.List; + +public class EventReleaseAssets { + + private Integer count; + private List links; + private List sources; + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public List getLinks() { + return links; + } + + public void setLinks(List links) { + this.links = links; + } + + public List getSources() { + return sources; + } + + public void setSources(List sources) { + this.sources = sources; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/src/main/java/org/gitlab4j/api/webhook/EventReleaseLink.java b/src/main/java/org/gitlab4j/api/webhook/EventReleaseLink.java new file mode 100644 index 000000000..59dedb4a7 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/webhook/EventReleaseLink.java @@ -0,0 +1,56 @@ +package org.gitlab4j.api.webhook; + +import org.gitlab4j.api.utils.JacksonJson; + +public class EventReleaseLink { + private Integer id; + private Boolean external; + private String linkType; + private String name; + private String url; + + public Integer getId() { + return id; + } + + public void setId(final Integer id) { + this.id = id; + } + + public Boolean getExternal() { + return external; + } + + public void setExternal(final Boolean external) { + this.external = external; + } + + public String getLinkType() { + return linkType; + } + + public void setLinkType(final String linkType) { + this.linkType = linkType; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(final String url) { + this.url = url; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/src/main/java/org/gitlab4j/api/webhook/EventReleaseSource.java b/src/main/java/org/gitlab4j/api/webhook/EventReleaseSource.java new file mode 100644 index 000000000..15862481c --- /dev/null +++ b/src/main/java/org/gitlab4j/api/webhook/EventReleaseSource.java @@ -0,0 +1,29 @@ +package org.gitlab4j.api.webhook; + +import org.gitlab4j.api.utils.JacksonJson; + +public class EventReleaseSource { + private String format; + private String url; + + public String getFormat() { + return format; + } + + public void setFormat(final String format) { + this.format = format; + } + + public String getUrl() { + return url; + } + + public void setUrl(final String url) { + this.url = url; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/src/main/java/org/gitlab4j/api/webhook/ReleaseEvent.java b/src/main/java/org/gitlab4j/api/webhook/ReleaseEvent.java new file mode 100644 index 000000000..19da884ca --- /dev/null +++ b/src/main/java/org/gitlab4j/api/webhook/ReleaseEvent.java @@ -0,0 +1,123 @@ +package org.gitlab4j.api.webhook; + +import org.gitlab4j.api.utils.JacksonJson; + +public class ReleaseEvent extends AbstractEvent { + + public static final String X_GITLAB_EVENT = "Release Hook"; + public static final String OBJECT_KIND = "release"; + + private Integer id; + private String createdAt; + private String description; + private String name; + private String releasedAt; + private String tag; + private EventProject project; + private String url; + private String action; + private EventReleaseAssets assets; + private EventCommit commit; + + public String getObjectKind() { + return (OBJECT_KIND); + } + + public void setObjectKind(String objectKind) { + if (!OBJECT_KIND.equals(objectKind)) + throw new RuntimeException("Invalid object_kind (" + objectKind + "), must be '" + OBJECT_KIND + "'"); + } + + public Integer getId() { + return id; + } + + public void setId(final Integer id) { + this.id = id; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(final String createdAt) { + this.createdAt = createdAt; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getReleasedAt() { + return releasedAt; + } + + public void setReleasedAt(final String releasedAt) { + this.releasedAt = releasedAt; + } + + public String getTag() { + return tag; + } + + public void setTag(final String tag) { + this.tag = tag; + } + + public EventProject getProject() { + return project; + } + + public void setProject(final EventProject project) { + this.project = project; + } + + public String getUrl() { + return url; + } + + public void setUrl(final String url) { + this.url = url; + } + + public String getAction() { + return action; + } + + public void setAction(final String action) { + this.action = action; + } + + public EventReleaseAssets getAssets() { + return assets; + } + + public void setAssets(final EventReleaseAssets assets) { + this.assets = assets; + } + + public EventCommit getCommit() { + return commit; + } + + public void setCommit(final EventCommit commit) { + this.commit = commit; + } + + @Override + public String toString() { + return (JacksonJson.toJsonString(this)); + } +} diff --git a/src/main/java/org/gitlab4j/api/webhook/WebHookListener.java b/src/main/java/org/gitlab4j/api/webhook/WebHookListener.java index b6c437d68..d8d32ff40 100644 --- a/src/main/java/org/gitlab4j/api/webhook/WebHookListener.java +++ b/src/main/java/org/gitlab4j/api/webhook/WebHookListener.java @@ -78,4 +78,23 @@ default void onTagPushEvent(TagPushEvent tagPushEvent) { */ default void onWikiPageEvent(WikiPageEvent wikiEvent) { } + + + + /** + * This method is called when a WebHook deployment event has been received. + * + * @param deploymentEvent the DeploymentEvent instance + */ + default void onDeploymentEvent(DeploymentEvent deploymentEvent) { + } + + + /** + * This method is called when a WebHook release event has been received. + * + * @param releaseEvent the ReleaseEvent instance + */ + default void onReleaseEvent(ReleaseEvent releaseEvent) { + } } diff --git a/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java b/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java index 2cd3d4b18..000f95fc4 100644 --- a/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java +++ b/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java @@ -36,7 +36,7 @@ public WebHookManager() { /** * Create a HookManager to handle GitLab webhook events which will be verified * against the specified secretToken. - * + * * @param secretToken the secret token to verify against */ public WebHookManager(String secretToken) { @@ -64,7 +64,7 @@ public void setSecretToken(String secretToken) { /** * Parses and verifies an Event instance from the HTTP request and * fires it off to the registered listeners. - * + * * @param request the HttpServletRequest to read the Event instance from * @throws GitLabApiException if the parsed event is not supported */ @@ -106,6 +106,8 @@ public Event handleRequest(HttpServletRequest request) throws GitLabApiException case PushEvent.X_GITLAB_EVENT: case TagPushEvent.X_GITLAB_EVENT: case WikiPageEvent.X_GITLAB_EVENT: + case DeploymentEvent.X_GITLAB_EVENT: + case ReleaseEvent.X_GITLAB_EVENT: break; default: @@ -154,7 +156,7 @@ public Event handleRequest(HttpServletRequest request) throws GitLabApiException /** * Verifies the provided Event and fires it off to the registered listeners. - * + * * @param event the Event instance to handle * @throws GitLabApiException if the event is not supported */ @@ -172,6 +174,8 @@ public void handleEvent(Event event) throws GitLabApiException { case PushEvent.OBJECT_KIND: case TagPushEvent.OBJECT_KIND: case WikiPageEvent.OBJECT_KIND: + case ReleaseEvent.OBJECT_KIND: + case DeploymentEvent.OBJECT_KIND: fireEvent(event); break; @@ -205,7 +209,7 @@ public void removeListener(WebHookListener listener) { /** * Fire the event to the registered listeners. - * + * * @param event the Event instance to fire to the registered event listeners * @throws GitLabApiException if the event is not supported */ @@ -248,6 +252,14 @@ public void fireEvent(Event event) throws GitLabApiException { fireWikiPageEvent((WikiPageEvent) event); break; + case ReleaseEvent.OBJECT_KIND: + fireReleaseEvent((ReleaseEvent) event); + break; + + case DeploymentEvent.OBJECT_KIND: + fireDeploymentEvent((DeploymentEvent) event); + break; + default: String message = "Unsupported event object_kind, object_kind=" + event.getObjectKind(); LOGGER.warning(message); @@ -308,4 +320,16 @@ protected void fireWikiPageEvent(WikiPageEvent wikiPageEvent) { listener.onWikiPageEvent(wikiPageEvent); } } + + protected void fireDeploymentEvent(DeploymentEvent deploymentEvent) { + for (WebHookListener listener : webhookListeners) { + listener.onDeploymentEvent(deploymentEvent); + } + } + + protected void fireReleaseEvent(ReleaseEvent releaseEvent) { + for (WebHookListener listener : webhookListeners) { + listener.onReleaseEvent(releaseEvent); + } + } }