Skip to content

Add support for link type between issues #964

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion src/main/java/org/gitlab4j/api/IssuesApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.gitlab4j.api.models.IssueLink;
import org.gitlab4j.api.models.IssuesStatistics;
import org.gitlab4j.api.models.IssuesStatisticsFilter;
import org.gitlab4j.api.models.LinkType;
import org.gitlab4j.api.models.MergeRequest;
import org.gitlab4j.api.models.Participant;
import org.gitlab4j.api.models.TimeStats;
Expand Down Expand Up @@ -889,10 +890,31 @@ public Stream<Issue> getIssueLinksStream(Object projectIdOrPath, Long issueIid)
*/
public IssueLink createIssueLink(Object projectIdOrPath, Long issueIid,
Object targetProjectIdOrPath, Long targetIssueIid) throws GitLabApiException {
return createIssueLink(projectIdOrPath, issueIid, targetProjectIdOrPath, targetIssueIid, null);
}

/**
* Creates a two-way relation between two issues. User must be allowed to update both issues in order to succeed.
*
* <p>NOTE: Only available in GitLab Starter, GitLab Bronze, and higher tiers.</p>
*
* <pre><code>GitLab Endpoint: POST /projects/:id/issues/:issue_iid/links</code></pre>
*
* @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance
* @param issueIid the internal ID of a project's issue
* @param targetProjectIdOrPath the project in the form of an Long(ID), String(path), or Project instance of the target project
* @param targetIssueIid the internal ID of a target project’s issue
* @param linkType the type of the relation (optional), defaults to {@link LinkType#RELATES_TO}.
* @return an instance of IssueLink holding the link relationship
* @throws GitLabApiException if any exception occurs
*/
public IssueLink createIssueLink(Object projectIdOrPath, Long issueIid,
Object targetProjectIdOrPath, Long targetIssueIid, LinkType linkType) throws GitLabApiException {

GitLabApiForm formData = new GitLabApiForm()
.withParam("target_project_id", getProjectIdOrPath(targetProjectIdOrPath), true)
.withParam("target_issue_iid", targetIssueIid, true);
.withParam("target_issue_iid", targetIssueIid, true)
.withParam("link_type", linkType, false);

Response response = post(Response.Status.OK, formData.asMap(),
"projects", getProjectIdOrPath(projectIdOrPath), "issues", issueIid, "links");
Expand Down
340 changes: 340 additions & 0 deletions src/main/java/org/gitlab4j/api/models/AbstractIssue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,340 @@

package org.gitlab4j.api.models;

import java.util.Date;
import java.util.List;

import org.gitlab4j.api.Constants.IssueState;
import org.gitlab4j.api.utils.JacksonJson;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.node.IntNode;
import com.fasterxml.jackson.databind.node.LongNode;
import com.fasterxml.jackson.databind.node.TextNode;
import com.fasterxml.jackson.databind.node.ValueNode;

public abstract class AbstractIssue {

public static class TaskCompletionStatus {

private Integer count;
private Integer completedCount;

public Integer getCount() {
return count;
}

public void setCount(Integer count) {
this.count = count;
}

public Integer getCompletedCount() {
return completedCount;
}

public void setCompletedCount(Integer completedCount) {
this.completedCount = completedCount;
}

@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}

private Assignee assignee;
private List<Assignee> assignees;
private Author author;
private Boolean confidential;
private Date createdAt;
private Date updatedAt;
private Date closedAt;
private User closedBy;
private String description;
private Date dueDate;

@JsonProperty("id")
private ValueNode actualId;
@JsonIgnore
private String externalId;
@JsonIgnore
private Long id;

private Long iid;
private List<String> labels;
private Milestone milestone;
private Long projectId;
private IssueState state;
private String title;
private Integer userNotesCount;
private String webUrl;
private Integer weight;
private Boolean discussionLocked;
private TimeStats timeStats;

private Integer upvotes;
private Integer downvotes;
private Integer mergeRequestsCount;
private Boolean hasTasks;
private String taskStatus;
private TaskCompletionStatus taskCompletionStatus;

public Assignee getAssignee() {
return assignee;
}

public void setAssignee(Assignee assignee) {
this.assignee = assignee;
}

public List<Assignee> getAssignees() {
return assignees;
}

public void setAssignees(List<Assignee> assignees) {
this.assignees = assignees;
}

public Author getAuthor() {
return author;
}

public void setAuthor(Author author) {
this.author = author;
}

public Boolean getConfidential() {
return confidential;
}

public void setConfidential(Boolean confidential) {
this.confidential = confidential;
}

public Date getCreatedAt() {
return createdAt;
}

public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Date getDueDate() {
return dueDate;
}

public void setDueDate(Date dueDate) {
this.dueDate = dueDate;
}

public ValueNode getActualId() {
return actualId;
}

public void setActualId(ValueNode id) {
actualId = id;
if (actualId instanceof TextNode) {
externalId = actualId.asText();
} else if (actualId instanceof IntNode || actualId instanceof LongNode) {
this.id = actualId.asLong();
}
}

public Long getId() {
return (id);
}

public void setId(Long id) {
this.id = id;
if (id != null) {
actualId = new LongNode(id);
externalId = null;
}
}

public String getExternalId() {
return (externalId);
}

public void setExternalId(String externalId) {
this.externalId = externalId;
if (externalId != null) {
actualId = new TextNode(externalId);
id = null;
}
}

public Long getIid() {
return iid;
}

public void setIid(Long iid) {
this.iid = iid;
}

public List<String> getLabels() {
return labels;
}

public void setLabels(List<String> labels) {
this.labels = labels;
}

public Milestone getMilestone() {
return milestone;
}

public void setMilestone(Milestone milestone) {
this.milestone = milestone;
}

public Long getProjectId() {
return projectId;
}

public void setProjectId(Long projectId) {
this.projectId = projectId;
}

public IssueState getState() {
return state;
}

public void setState(IssueState state) {
this.state = state;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public Date getUpdatedAt() {
return updatedAt;
}

public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}

public Date getClosedAt() {
return closedAt;
}

public void setClosedAt(Date closedAt) {
this.closedAt = closedAt;
}

public User getClosedBy() {
return closedBy;
}

public void setClosedBy(User closedBy) {
this.closedBy = closedBy;
}

public Integer getUserNotesCount() {
return userNotesCount;
}

public void setUserNotesCount(Integer userNotesCount) {
this.userNotesCount = userNotesCount;
}

public String getWebUrl() {
return webUrl;
}

public void setWebUrl(String webUrl) {
this.webUrl = webUrl;
}

public Integer getWeight() {
return weight;
}

public void setWeight(Integer weight) {
this.weight = weight;
}

public Boolean getDiscussionLocked() {
return discussionLocked;
}

public void setDiscussionLocked(Boolean discussionLocked) {
this.discussionLocked = discussionLocked;
}

public TimeStats getTimeStats() {
return timeStats;
}

public void setTimeStats(TimeStats timeStats) {
this.timeStats = timeStats;
}

public Integer getUpvotes() {
return upvotes;
}

public void setUpvotes(Integer upvotes) {
this.upvotes = upvotes;
}

public Integer getDownvotes() {
return downvotes;
}

public void setDownvotes(Integer downvotes) {
this.downvotes = downvotes;
}

public Integer getMergeRequestsCount() {
return mergeRequestsCount;
}

public void setMergeRequestsCount(Integer mergeRequestsCount) {
this.mergeRequestsCount = mergeRequestsCount;
}

public Boolean getHasTasks() {
return hasTasks;
}

public void setHasTasks(Boolean hasTasks) {
this.hasTasks = hasTasks;
}

public String getTaskStatus() {
return taskStatus;
}

public void setTaskStatus(String taskStatus) {
this.taskStatus = taskStatus;
}

public TaskCompletionStatus getTaskCompletionStatus() {
return taskCompletionStatus;
}

public void setTaskCompletionStatus(TaskCompletionStatus taskCompletionStatus) {
this.taskCompletionStatus = taskCompletionStatus;
}

@Override
public String toString() {
return (JacksonJson.toJsonString(this));
}
}
Loading