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