140 lines
4.8 KiB
Go
140 lines
4.8 KiB
Go
// Copyright 2025 The go-github AUTHORS. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package github
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// SubIssueService handles communication with the sub-issue related
|
|
// methods of the GitHub API.
|
|
//
|
|
// Sub-issues help you group and manage your issues with a parent/child relationship.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/rest/issues/sub-issues
|
|
type SubIssueService service
|
|
|
|
// SubIssue represents a GitHub sub-issue on a repository.
|
|
// Note: As far as the GitHub API is concerned, every pull request is an issue,
|
|
// but not every issue is a pull request. Some endpoints, events, and webhooks
|
|
// may also return pull requests via this struct. If PullRequestLinks is nil,
|
|
// this is an issue, and if PullRequestLinks is not nil, this is a pull request.
|
|
// The IsPullRequest helper method can be used to check that.
|
|
type SubIssue Issue
|
|
|
|
func (i SubIssue) String() string {
|
|
return Stringify(i)
|
|
}
|
|
|
|
// SubIssueListByIssueOptions specifies the optional parameters to the
|
|
// SubIssueService.ListByIssue method.
|
|
type SubIssueListByIssueOptions struct {
|
|
IssueListByRepoOptions
|
|
}
|
|
|
|
// SubIssueRequest represents a request to add, remove, or reprioritize sub-issues.
|
|
type SubIssueRequest struct {
|
|
SubIssueID int64 `json:"sub_issue_id"` // Required: The ID of the sub-issue
|
|
AfterID *int64 `json:"after_id,omitempty"` // Optional: Position after this sub-issue ID
|
|
BeforeID *int64 `json:"before_id,omitempty"` // Optional: Position before this sub-issue ID
|
|
ReplaceParent *bool `json:"replace_parent,omitempty"` // Optional: Whether to replace the existing parent
|
|
}
|
|
|
|
// Remove a sub-issue from the specified repository.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/rest/issues/sub-issues#remove-sub-issue
|
|
//
|
|
//meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/sub_issue
|
|
func (s *SubIssueService) Remove(ctx context.Context, owner, repo string, issueNumber int64, subIssue SubIssueRequest) (*SubIssue, *Response, error) {
|
|
u := fmt.Sprintf("repos/%v/%v/issues/%v/sub_issue", owner, repo, issueNumber)
|
|
|
|
req, err := s.client.NewRequest("DELETE", u, subIssue)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
si := new(SubIssue)
|
|
resp, err := s.client.Do(ctx, req, si)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return si, resp, nil
|
|
}
|
|
|
|
// ListByIssue lists all sub-issues for the specified issue.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/rest/issues/sub-issues#list-sub-issues
|
|
//
|
|
//meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/sub_issues
|
|
func (s *SubIssueService) ListByIssue(ctx context.Context, owner, repo string, issueNumber int64, opts *IssueListOptions) ([]*SubIssue, *Response, error) {
|
|
u := fmt.Sprintf("repos/%v/%v/issues/%v/sub_issues", owner, repo, issueNumber)
|
|
u, err := addOptions(u, opts)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
req, err := s.client.NewRequest("GET", u, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var subIssues []*SubIssue
|
|
resp, err := s.client.Do(ctx, req, &subIssues)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return subIssues, resp, nil
|
|
}
|
|
|
|
// Add adds a sub-issue to the specified issue.
|
|
//
|
|
// The sub-issue to be added must belong to the same repository owner as the parent issue.
|
|
// To replace the existing parent of a sub-issue, set replaceParent to true.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/rest/issues/sub-issues#add-sub-issue
|
|
//
|
|
//meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/sub_issues
|
|
func (s *SubIssueService) Add(ctx context.Context, owner, repo string, issueNumber int64, subIssue SubIssueRequest) (*SubIssue, *Response, error) {
|
|
u := fmt.Sprintf("repos/%v/%v/issues/%v/sub_issues", owner, repo, issueNumber)
|
|
req, err := s.client.NewRequest("POST", u, subIssue)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
si := new(SubIssue)
|
|
resp, err := s.client.Do(ctx, req, si)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return si, resp, nil
|
|
}
|
|
|
|
// Reprioritize changes a sub-issue's priority to a different position in the parent list.
|
|
//
|
|
// Either afterId or beforeId must be specified to determine the new position of the sub-issue.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/rest/issues/sub-issues#reprioritize-sub-issue
|
|
//
|
|
//meta:operation PATCH /repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority
|
|
func (s *SubIssueService) Reprioritize(ctx context.Context, owner, repo string, issueNumber int64, subIssue SubIssueRequest) (*SubIssue, *Response, error) {
|
|
u := fmt.Sprintf("repos/%v/%v/issues/%v/sub_issues/priority", owner, repo, issueNumber)
|
|
req, err := s.client.NewRequest("PATCH", u, subIssue)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
si := new(SubIssue)
|
|
resp, err := s.client.Do(ctx, req, si)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return si, resp, nil
|
|
}
|