diff --git a/src/main/java/org/gitlab4j/api/GroupApi.java b/src/main/java/org/gitlab4j/api/GroupApi.java index 3404e888..0ec9798c 100644 --- a/src/main/java/org/gitlab4j/api/GroupApi.java +++ b/src/main/java/org/gitlab4j/api/GroupApi.java @@ -16,25 +16,8 @@ import javax.ws.rs.core.Response; import org.gitlab4j.api.GitLabApi.ApiVersion; -import org.gitlab4j.api.models.AccessLevel; -import org.gitlab4j.api.models.AccessRequest; -import org.gitlab4j.api.models.AuditEvent; -import org.gitlab4j.api.models.Badge; -import org.gitlab4j.api.models.CustomAttribute; -import org.gitlab4j.api.models.Group; -import org.gitlab4j.api.models.GroupAccessToken; -import org.gitlab4j.api.models.GroupFilter; -import org.gitlab4j.api.models.GroupParams; -import org.gitlab4j.api.models.GroupProjectsFilter; +import org.gitlab4j.api.models.*; import org.gitlab4j.api.models.ImpersonationToken.Scope; -import org.gitlab4j.api.models.Iteration; -import org.gitlab4j.api.models.IterationFilter; -import org.gitlab4j.api.models.LdapGroupLink; -import org.gitlab4j.api.models.Member; -import org.gitlab4j.api.models.Project; -import org.gitlab4j.api.models.SamlGroupLink; -import org.gitlab4j.api.models.Variable; -import org.gitlab4j.api.models.Visibility; import org.gitlab4j.api.utils.ISO8601; /** @@ -2440,4 +2423,19 @@ public GroupAccessToken rotateGroupAccessToken(Object groupIdOrPath, Long tokenI public void revokeGroupAccessToken(Object groupIdOrPath, Long tokenId) throws GitLabApiException { delete(Response.Status.NO_CONTENT, null, "groups", getGroupIdOrPath(groupIdOrPath), "access_tokens", tokenId); } + + /** + * Add a group hook + * + *
GitLab Endpoint: POST /groups/:id/hooks
+ * + * @param groupIdOrPath the group in the form of an Long(ID), String(path), or Group instance + * @param webHookParams webhook creation options + * @throws GitLabApiException if any exception occurs + */ + public Webhook addWebhook(Object groupIdOrPath, WebHookParams webHookParams) throws GitLabApiException { + Response response = post( + Response.Status.CREATED, webHookParams.getForm(), "groups", getGroupIdOrPath(groupIdOrPath), "hooks"); + return (response.readEntity(Webhook.class)); + } } diff --git a/src/main/java/org/gitlab4j/api/models/WebHookParams.java b/src/main/java/org/gitlab4j/api/models/WebHookParams.java new file mode 100644 index 00000000..e35033d7 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/models/WebHookParams.java @@ -0,0 +1,183 @@ +package org.gitlab4j.api.models; + +import java.io.Serializable; + +import org.gitlab4j.api.GitLabApiForm; + +public class WebHookParams implements Serializable { + private static final long serialVersionUID = 1L; + + private String url; + private String name; + private String description; + private Boolean pushEvents; + private String pushEventsBranchFilter; + private String branchFilterStrategy; + private Boolean issuesEvents; + private Boolean confidentialIssuesEvents; + private Boolean mergeRequestsEvents; + private Boolean tagPushEvents; + private Boolean noteEvents; + private Boolean confidentialNoteEvents; + private Boolean jobEvents; + private Boolean pipelineEvents; + private Boolean wikiPageEvents; + private Boolean deploymentEvents; + private Boolean featureFlagEvents; + private Boolean releasesEvents; + private Boolean subgroupEvents; + private Boolean memberEvents; + private Boolean enableSslVerification; + private String token; + private Boolean resourceAccessTokenEvents; + private String customWebhookTemplate; + + public GitLabApiForm getForm() { + + return new GitLabApiForm() + .withParam("url", url, true) + .withParam("name", name) + .withParam("description", description) + .withParam("push_events", pushEvents) + .withParam("push_events_branch_filter", pushEventsBranchFilter) + .withParam("branch_filter_strategy", branchFilterStrategy) + .withParam("issues_events", issuesEvents) + .withParam("confidential_issues_events", confidentialIssuesEvents) + .withParam("merge_requests_events", mergeRequestsEvents) + .withParam("tag_push_events", tagPushEvents) + .withParam("note_events", noteEvents) + .withParam("confidential_note_events", confidentialNoteEvents) + .withParam("job_events", jobEvents) + .withParam("pipeline_events", pipelineEvents) + .withParam("wiki_page_events", wikiPageEvents) + .withParam("deployment_events", deploymentEvents) + .withParam("feature_flag_events", featureFlagEvents) + .withParam("releases_events", releasesEvents) + .withParam("subgroup_events", subgroupEvents) + .withParam("member_events", memberEvents) + .withParam("enable_ssl_verification", enableSslVerification) + .withParam("token", token) + .withParam("resource_access_token_events", resourceAccessTokenEvents) + .withParam("custom_webhook_template", customWebhookTemplate); + } + + public WebHookParams setBranchFilterStrategy(String branchFilterStrategy) { + this.branchFilterStrategy = branchFilterStrategy; + return this; + } + + public WebHookParams setUrl(String url) { + this.url = url; + return this; + } + + public WebHookParams setName(String name) { + this.name = name; + return this; + } + + public WebHookParams setDescription(String description) { + this.description = description; + return this; + } + + public WebHookParams setPushEvents(Boolean pushEvents) { + this.pushEvents = pushEvents; + return this; + } + + public WebHookParams setPushEventsBranchFilter(String pushEventsBranchFilter) { + this.pushEventsBranchFilter = pushEventsBranchFilter; + return this; + } + + public WebHookParams setIssuesEvents(Boolean issuesEvents) { + this.issuesEvents = issuesEvents; + return this; + } + + public WebHookParams setConfidentialIssuesEvents(Boolean confidentialIssuesEvents) { + this.confidentialIssuesEvents = confidentialIssuesEvents; + return this; + } + + public WebHookParams setMergeRequestsEvents(Boolean mergeRequestsEvents) { + this.mergeRequestsEvents = mergeRequestsEvents; + return this; + } + + public WebHookParams setTagPushEvents(Boolean tagPushEvents) { + this.tagPushEvents = tagPushEvents; + return this; + } + + public WebHookParams setNoteEvents(Boolean noteEvents) { + this.noteEvents = noteEvents; + return this; + } + + public WebHookParams setConfidentialNoteEvents(Boolean confidentialNoteEvents) { + this.confidentialNoteEvents = confidentialNoteEvents; + return this; + } + + public WebHookParams setJobEvents(Boolean jobEvents) { + this.jobEvents = jobEvents; + return this; + } + + public WebHookParams setPipelineEvents(Boolean pipelineEvents) { + this.pipelineEvents = pipelineEvents; + return this; + } + + public WebHookParams setWikiPageEvents(Boolean wikiPageEvents) { + this.wikiPageEvents = wikiPageEvents; + return this; + } + + public WebHookParams setDeploymentEvents(Boolean deploymentEvents) { + this.deploymentEvents = deploymentEvents; + return this; + } + + public WebHookParams setFeatureFlagEvents(Boolean featureFlagEvents) { + this.featureFlagEvents = featureFlagEvents; + return this; + } + + public WebHookParams setReleasesEvents(Boolean releasesEvents) { + this.releasesEvents = releasesEvents; + return this; + } + + public WebHookParams setSubgroupEvents(Boolean subgroupEvents) { + this.subgroupEvents = subgroupEvents; + return this; + } + + public WebHookParams setMemberEvents(Boolean memberEvents) { + this.memberEvents = memberEvents; + return this; + } + + public WebHookParams setEnableSslVerification(Boolean enableSslVerification) { + this.enableSslVerification = enableSslVerification; + return this; + } + + public WebHookParams setToken(String token) { + this.token = token; + return this; + } + + public WebHookParams setResourceAccessTokenEvents(Boolean resourceAccessTokenEvents) { + this.resourceAccessTokenEvents = resourceAccessTokenEvents; + return this; + } + + public WebHookParams setCustomWebhookTemplate(String customWebhookTemplate) { + this.customWebhookTemplate = customWebhookTemplate; + return this; + } +} diff --git a/src/main/java/org/gitlab4j/api/models/Webhook.java b/src/main/java/org/gitlab4j/api/models/Webhook.java new file mode 100644 index 00000000..4fdb2b95 --- /dev/null +++ b/src/main/java/org/gitlab4j/api/models/Webhook.java @@ -0,0 +1,252 @@ +package org.gitlab4j.api.models; + +import java.io.Serializable; +import java.util.Date; + +public class Webhook implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + private String url; + private String name; + private String description; + private Long groupId; + private Boolean pushEvents; + private String pushEventsBranchFilter; + private String branchFilterStrategy; + private Boolean issuesEvents; + private Boolean confidentialIssuesEvents; + private Boolean mergeRequestsEvents; + private Boolean tagPushEvents; + private Boolean noteEvents; + private Boolean confidentialNoteEvents; + private Boolean jobEvents; + private Boolean pipelineEvents; + private Boolean wikiPageEvents; + private Boolean deploymentEvents; + private Boolean featureFlagEvents; + private Boolean releasesEvents; + private Boolean subgroupEvents; + private Boolean memberEvents; + private Boolean enableSslVerification; + private Boolean repositoryUpdateEvents; + private Date createdAt; + private Boolean resourceAccessTokenEvents; + private String customWebhookTemplate; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Boolean getPushEvents() { + return pushEvents; + } + + public void setPushEvents(Boolean pushEvents) { + this.pushEvents = pushEvents; + } + + public String getPushEventsBranchFilter() { + return pushEventsBranchFilter; + } + + public void setPushEventsBranchFilter(String pushEventsBranchFilter) { + this.pushEventsBranchFilter = pushEventsBranchFilter; + } + + public String getBranchFilterStrategy() { + return branchFilterStrategy; + } + + public void setBranchFilterStrategy(String branchFilterStrategy) { + this.branchFilterStrategy = branchFilterStrategy; + } + + public Boolean getIssuesEvents() { + return issuesEvents; + } + + public void setIssuesEvents(Boolean issuesEvents) { + this.issuesEvents = issuesEvents; + } + + public Boolean getConfidentialIssuesEvents() { + return confidentialIssuesEvents; + } + + public void setConfidentialIssuesEvents(Boolean confidentialIssuesEvents) { + this.confidentialIssuesEvents = confidentialIssuesEvents; + } + + public Boolean getMergeRequestsEvents() { + return mergeRequestsEvents; + } + + public void setMergeRequestsEvents(Boolean mergeRequestsEvents) { + this.mergeRequestsEvents = mergeRequestsEvents; + } + + public Boolean getTagPushEvents() { + return tagPushEvents; + } + + public void setTagPushEvents(Boolean tagPushEvents) { + this.tagPushEvents = tagPushEvents; + } + + public Boolean getNoteEvents() { + return noteEvents; + } + + public void setNoteEvents(Boolean noteEvents) { + this.noteEvents = noteEvents; + } + + public Boolean getConfidentialNoteEvents() { + return confidentialNoteEvents; + } + + public void setConfidentialNoteEvents(Boolean confidentialNoteEvents) { + this.confidentialNoteEvents = confidentialNoteEvents; + } + + public Boolean getJobEvents() { + return jobEvents; + } + + public void setJobEvents(Boolean jobEvents) { + this.jobEvents = jobEvents; + } + + public Boolean getPipelineEvents() { + return pipelineEvents; + } + + public void setPipelineEvents(Boolean pipelineEvents) { + this.pipelineEvents = pipelineEvents; + } + + public Boolean getWikiPageEvents() { + return wikiPageEvents; + } + + public void setWikiPageEvents(Boolean wikiPageEvents) { + this.wikiPageEvents = wikiPageEvents; + } + + public Boolean getDeploymentEvents() { + return deploymentEvents; + } + + public void setDeploymentEvents(Boolean deploymentEvents) { + this.deploymentEvents = deploymentEvents; + } + + public Boolean getFeatureFlagEvents() { + return featureFlagEvents; + } + + public void setFeatureFlagEvents(Boolean featureFlagEvents) { + this.featureFlagEvents = featureFlagEvents; + } + + public Boolean getReleasesEvents() { + return releasesEvents; + } + + public void setReleasesEvents(Boolean releasesEvents) { + this.releasesEvents = releasesEvents; + } + + public Boolean getSubgroupEvents() { + return subgroupEvents; + } + + public void setSubgroupEvents(Boolean subgroupEvents) { + this.subgroupEvents = subgroupEvents; + } + + public Boolean getMemberEvents() { + return memberEvents; + } + + public void setMemberEvents(Boolean memberEvents) { + this.memberEvents = memberEvents; + } + + public Boolean getEnableSslVerification() { + return enableSslVerification; + } + + public void setEnableSslVerification(Boolean enableSslVerification) { + this.enableSslVerification = enableSslVerification; + } + + public Boolean getRepositoryUpdateEvents() { + return repositoryUpdateEvents; + } + + public void setRepositoryUpdateEvents(Boolean repositoryUpdateEvents) { + this.repositoryUpdateEvents = repositoryUpdateEvents; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Boolean getResourceAccessTokenEvents() { + return resourceAccessTokenEvents; + } + + public void setResourceAccessTokenEvents(Boolean resourceAccessTokenEvents) { + this.resourceAccessTokenEvents = resourceAccessTokenEvents; + } + + public String getCustomWebhookTemplate() { + return customWebhookTemplate; + } + + public void setCustomWebhookTemplate(String customWebhookTemplate) { + this.customWebhookTemplate = customWebhookTemplate; + } +} diff --git a/src/test/java/org/gitlab4j/api/TestGroupApi.java b/src/test/java/org/gitlab4j/api/TestGroupApi.java index c4e236dc..d2955609 100644 --- a/src/test/java/org/gitlab4j/api/TestGroupApi.java +++ b/src/test/java/org/gitlab4j/api/TestGroupApi.java @@ -25,6 +25,8 @@ import org.gitlab4j.api.models.GroupParams; import org.gitlab4j.api.models.Member; import org.gitlab4j.api.models.User; +import org.gitlab4j.api.models.WebHookParams; +import org.gitlab4j.api.models.Webhook; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -358,4 +360,41 @@ public void updateGroup() throws GitLabApiException { assertEquals(testGroup.getId(), optional.get().getId()); assertEquals(description, optional.get().getDescription()); } + + @Test + public void addGroupHook() throws GitLabApiException { + // Given + WebHookParams webHookParams = new WebHookParams(); + webHookParams + .setUrl("") + .setName("My Webhook") + .setDescription("") + .setBranchFilterStrategy("") + .setConfidentialIssuesEvents(true) + .setIssuesEvents(true) + .setConfidentialNoteEvents(true) + .setEnableSslVerification(true) + .setFeatureFlagEvents(true) + .setPushEvents(true) + .setJobEvents(true) + .setToken("token") + .setSubgroupEvents(true) + .setWikiPageEvents(true) + .setTagPushEvents(true) + .setReleasesEvents(true) + .setMemberEvents(true) + .setResourceAccessTokenEvents(true) + .setDeploymentEvents(true) + .setPipelineEvents(true) + .setNoteEvents(true) + .setMergeRequestsEvents(true) + .setPushEventsBranchFilter("wildcard") + .setCustomWebhookTemplate("{\"event\":\"{{object_kind}}\"}"); + + // When + Webhook createdWebhook = gitLabApi.getGroupApi().addWebhook(testGroup.getId(), webHookParams); + + // Then + assertEquals("My Webhook", createdWebhook.getName()); + } }