Co-authored-by: pshevche <pavel.shevchenko.95@gmail.com> Co-authored-by: Sam Coe <samcoe@users.noreply.github.com>
124 lines
3.3 KiB
Go
124 lines
3.3 KiB
Go
package api
|
|
|
|
import (
|
|
"github.com/cli/cli/v2/internal/ghrepo"
|
|
"github.com/shurcooL/githubv4"
|
|
)
|
|
|
|
// OrganizationProjects fetches all open projects for an organization.
|
|
func OrganizationProjects(client *Client, repo ghrepo.Interface) ([]RepoProject, error) {
|
|
type responseData struct {
|
|
Organization struct {
|
|
Projects struct {
|
|
Nodes []RepoProject
|
|
PageInfo struct {
|
|
HasNextPage bool
|
|
EndCursor string
|
|
}
|
|
} `graphql:"projects(states: [OPEN], first: 100, orderBy: {field: NAME, direction: ASC}, after: $endCursor)"`
|
|
} `graphql:"organization(login: $owner)"`
|
|
}
|
|
|
|
variables := map[string]interface{}{
|
|
"owner": githubv4.String(repo.RepoOwner()),
|
|
"endCursor": (*githubv4.String)(nil),
|
|
}
|
|
|
|
var projects []RepoProject
|
|
for {
|
|
var query responseData
|
|
err := client.Query(repo.RepoHost(), "OrganizationProjectList", &query, variables)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
projects = append(projects, query.Organization.Projects.Nodes...)
|
|
if !query.Organization.Projects.PageInfo.HasNextPage {
|
|
break
|
|
}
|
|
variables["endCursor"] = githubv4.String(query.Organization.Projects.PageInfo.EndCursor)
|
|
}
|
|
|
|
return projects, nil
|
|
}
|
|
|
|
// OrganizationProjectsV2 fetches all open projectsV2 for an organization.
|
|
func OrganizationProjectsV2(client *Client, repo ghrepo.Interface) ([]RepoProjectV2, error) {
|
|
type responseData struct {
|
|
Organization struct {
|
|
ProjectsV2 struct {
|
|
Nodes []RepoProjectV2
|
|
PageInfo struct {
|
|
HasNextPage bool
|
|
EndCursor string
|
|
}
|
|
} `graphql:"projectsV2(first: 100, orderBy: {field: TITLE, direction: ASC}, after: $endCursor, query: $query)"`
|
|
} `graphql:"organization(login: $owner)"`
|
|
}
|
|
|
|
variables := map[string]interface{}{
|
|
"owner": githubv4.String(repo.RepoOwner()),
|
|
"endCursor": (*githubv4.String)(nil),
|
|
"query": githubv4.String("is:open"),
|
|
}
|
|
|
|
var projectsV2 []RepoProjectV2
|
|
for {
|
|
var query responseData
|
|
err := client.Query(repo.RepoHost(), "OrganizationProjectV2List", &query, variables)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
projectsV2 = append(projectsV2, query.Organization.ProjectsV2.Nodes...)
|
|
|
|
if !query.Organization.ProjectsV2.PageInfo.HasNextPage {
|
|
break
|
|
}
|
|
variables["endCursor"] = githubv4.String(query.Organization.ProjectsV2.PageInfo.EndCursor)
|
|
}
|
|
|
|
return projectsV2, nil
|
|
}
|
|
|
|
type OrgTeam struct {
|
|
ID string
|
|
Slug string
|
|
}
|
|
|
|
// OrganizationTeams fetches all the teams in an organization
|
|
func OrganizationTeams(client *Client, repo ghrepo.Interface) ([]OrgTeam, error) {
|
|
type responseData struct {
|
|
Organization struct {
|
|
Teams struct {
|
|
Nodes []OrgTeam
|
|
PageInfo struct {
|
|
HasNextPage bool
|
|
EndCursor string
|
|
}
|
|
} `graphql:"teams(first: 100, orderBy: {field: NAME, direction: ASC}, after: $endCursor)"`
|
|
} `graphql:"organization(login: $owner)"`
|
|
}
|
|
|
|
variables := map[string]interface{}{
|
|
"owner": githubv4.String(repo.RepoOwner()),
|
|
"endCursor": (*githubv4.String)(nil),
|
|
}
|
|
|
|
var teams []OrgTeam
|
|
for {
|
|
var query responseData
|
|
err := client.Query(repo.RepoHost(), "OrganizationTeamList", &query, variables)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
teams = append(teams, query.Organization.Teams.Nodes...)
|
|
if !query.Organization.Teams.PageInfo.HasNextPage {
|
|
break
|
|
}
|
|
variables["endCursor"] = githubv4.String(query.Organization.Teams.PageInfo.EndCursor)
|
|
}
|
|
|
|
return teams, nil
|
|
}
|