From 0b32741d75bf20a6e3af3597e01083ae4e824199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= <37687109+DoubleDPro@users.noreply.github.com> Date: Wed, 29 Mar 2023 18:21:07 +0300 Subject: [PATCH] Add field iteration into IssueFilter (#913) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add iterationTitle in IssueFilter for filtration issues by this field Co-authored-by: 校褋邪褔械胁 袛屑懈褌褉懈泄 袛屑懈褌褉懈械胁懈褔 <92usachevdd@region.cbr.ru> --- src/main/java/org/gitlab4j/api/IssuesApi.java | 49 +++++++++++++++---- .../org/gitlab4j/api/models/IssueFilter.java | 21 +++++++- .../java/org/gitlab4j/api/TestIssuesApi.java | 10 ++++ 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/gitlab4j/api/IssuesApi.java b/src/main/java/org/gitlab4j/api/IssuesApi.java index 02c01fa8..2c8ee532 100644 --- a/src/main/java/org/gitlab4j/api/IssuesApi.java +++ b/src/main/java/org/gitlab4j/api/IssuesApi.java @@ -422,17 +422,46 @@ public class IssuesApi extends AbstractApi implements Constants { public Issue createIssue(Object projectIdOrPath, String title, String description, Boolean confidential, List<Long> assigneeIds, Long milestoneId, String labels, Date createdAt, Date dueDate, Long mergeRequestToResolveId, Long discussionToResolveId) throws GitLabApiException { + return (createIssue(projectIdOrPath, title, description, confidential, assigneeIds, milestoneId, labels, createdAt, dueDate, mergeRequestToResolveId, discussionToResolveId, null)); + } + + /** + * Create an issue for the project. + * + * <pre><code>GitLab Endpoint: POST /projects/:id/issues</code></pre> + * + * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance + * @param title the issue title of an issue, required + * @param description the description of an issue, optional + * @param confidential set the issue to be confidential, default is false, optional + * @param assigneeIds the IDs of the users to assign issue, optional + * @param milestoneId the ID of a milestone to assign issue, optional + * @param labels comma-separated label names for an issue, optional + * @param createdAt the date the issue was created at, optional + * @param dueDate the due date, optional + * @param mergeRequestToResolveId the IID of a merge request in which to resolve all issues. This will fill the issue with a default + * description and mark all discussions as resolved. When passing a description or title, these values will take precedence over the default values. Optional + * @param discussionToResolveId the ID of a discussion to resolve. This will fill in the issue with a default description and mark the discussion as resolved. + * Use in combination with merge_request_to_resolve_discussions_of. Optional + * @param iterationTitle the iteration title of an issue, optional + * @return an instance of Issue + * @throws GitLabApiException if any exception occurs + */ + public Issue createIssue(Object projectIdOrPath, String title, String description, Boolean confidential, List<Long> assigneeIds, Long milestoneId, String labels, + Date createdAt, Date dueDate, Long mergeRequestToResolveId, Long discussionToResolveId, String iterationTitle) throws GitLabApiException { + GitLabApiForm formData = new GitLabApiForm() - .withParam("title", title, true) - .withParam("description", description) - .withParam("confidential", confidential) - .withParam("assignee_ids", assigneeIds) - .withParam("milestone_id", milestoneId) - .withParam("labels", labels) - .withParam("created_at", createdAt) - .withParam("due_date", dueDate) - .withParam("merge_request_to_resolve_discussions_of", mergeRequestToResolveId) - .withParam("discussion_to_resolve", discussionToResolveId); + .withParam("title", title, true) + .withParam("description", description) + .withParam("confidential", confidential) + .withParam("assignee_ids", assigneeIds) + .withParam("milestone_id", milestoneId) + .withParam("labels", labels) + .withParam("created_at", createdAt) + .withParam("due_date", dueDate) + .withParam("merge_request_to_resolve_discussions_of", mergeRequestToResolveId) + .withParam("discussion_to_resolve", discussionToResolveId) + .withParam("iteration_title", iterationTitle); Response response = post(Response.Status.CREATED, formData, "projects", getProjectIdOrPath(projectIdOrPath), "issues"); return (response.readEntity(Issue.class)); } diff --git a/src/main/java/org/gitlab4j/api/models/IssueFilter.java b/src/main/java/org/gitlab4j/api/models/IssueFilter.java index 3dac607a..42c3cdd9 100644 --- a/src/main/java/org/gitlab4j/api/models/IssueFilter.java +++ b/src/main/java/org/gitlab4j/api/models/IssueFilter.java @@ -91,6 +91,11 @@ public class IssueFilter { */ private Date updatedBefore; + /** + * Return issues in current iteration. + */ + private String iterationTitle; + /*- properties -*/ public List<String> getIids() { @@ -213,6 +218,14 @@ public class IssueFilter { this.updatedBefore = updatedBefore; } + public String getIterationTitle() { + return iterationTitle; + } + + public void setIterationTitle(String iterationTitle) { + this.iterationTitle = iterationTitle; + } + /*- builder -*/ public IssueFilter withIids(List<String> iids) { this.iids = iids; @@ -289,6 +302,11 @@ public class IssueFilter { return (this); } + public IssueFilter withIterationTitle(String iterationTitle) { + this.iterationTitle = iterationTitle; + return (this); + } + /*- params generator -*/ @JsonIgnore public GitLabApiForm getQueryParams(int page, int perPage) { @@ -314,6 +332,7 @@ public class IssueFilter { .withParam("created_after", ISO8601.toString(createdAfter, false)) .withParam("created_before", ISO8601.toString(createdBefore, false)) .withParam("updated_after", ISO8601.toString(updatedAfter, false)) - .withParam("updated_before", ISO8601.toString(updatedBefore, false))); + .withParam("updated_before", ISO8601.toString(updatedBefore, false))) + .withParam("iteration_title", iterationTitle); } } diff --git a/src/test/java/org/gitlab4j/api/TestIssuesApi.java b/src/test/java/org/gitlab4j/api/TestIssuesApi.java index 04966dc7..7158fa5a 100644 --- a/src/test/java/org/gitlab4j/api/TestIssuesApi.java +++ b/src/test/java/org/gitlab4j/api/TestIssuesApi.java @@ -71,6 +71,7 @@ public class TestIssuesApi extends AbstractIntegrationTest { private static final String ISSUE_TITLE = "Test Issue Title"; private static final String ISSUE_DESCRIPTION = "This is a really nice description, not."; + private static final String ITERATION_TITLE = "iteration title"; private static final String TEST_GROUP = HelperUtils.getProperty(GROUP_KEY); private static Random randomNumberGenerator = new Random(); @@ -320,8 +321,10 @@ public class TestIssuesApi extends AbstractIntegrationTest { Issue issueOpen = gitLabApi.getIssuesApi().createIssue(projectId, getUniqueTitle(), ISSUE_DESCRIPTION); Issue issueClose = gitLabApi.getIssuesApi().createIssue(projectId, getUniqueTitle(), ISSUE_DESCRIPTION); + Issue issueInIteration = gitLabApi.getIssuesApi().createIssue(projectId, getUniqueTitle(), ISSUE_DESCRIPTION, null, null, null, null, null, null, null, null, ITERATION_TITLE); issueClose = gitLabApi.getIssuesApi().closeIssue(projectId, issueClose.getIid()); + final Long openIid = issueOpen.getIid(); IssueFilter openFilter = new IssueFilter().withState(IssueState.OPENED); List<Issue> opens = gitLabApi.getIssuesApi().getIssues(projectId, openFilter); @@ -333,5 +336,12 @@ public class TestIssuesApi extends AbstractIntegrationTest { List<Issue> closes = gitLabApi.getIssuesApi().getIssues(projectId, closeFilter); assertNotNull(closes); assertTrue(closes.stream().map(Issue::getIid).anyMatch(iid -> iid.equals(closedIid))); + + final Long issueInIterationIid = issueInIteration.getIid(); + IssueFilter issueInIterationFilter = new IssueFilter().withIterationTitle(ITERATION_TITLE); + List<Issue> issuesInIteration = gitLabApi.getIssuesApi().getIssues(projectId, issueInIterationFilter); + assertNotNull(issuesInIteration); + assertTrue(issuesInIteration.stream().map(Issue::getIid).anyMatch(iid -> iid.equals(issueInIterationIid))); + } } -- GitLab