github.com/ungtb10d/cli/v2@v2.0.0-20221110210412-98537dd9d6a1/api/queries_org.go (about)

     1  package api
     2  
     3  import (
     4  	"github.com/ungtb10d/cli/v2/internal/ghrepo"
     5  	"github.com/shurcooL/githubv4"
     6  )
     7  
     8  // OrganizationProjects fetches all open projects for an organization
     9  func OrganizationProjects(client *Client, repo ghrepo.Interface) ([]RepoProject, error) {
    10  	type responseData struct {
    11  		Organization struct {
    12  			Projects struct {
    13  				Nodes    []RepoProject
    14  				PageInfo struct {
    15  					HasNextPage bool
    16  					EndCursor   string
    17  				}
    18  			} `graphql:"projects(states: [OPEN], first: 100, orderBy: {field: NAME, direction: ASC}, after: $endCursor)"`
    19  		} `graphql:"organization(login: $owner)"`
    20  	}
    21  
    22  	variables := map[string]interface{}{
    23  		"owner":     githubv4.String(repo.RepoOwner()),
    24  		"endCursor": (*githubv4.String)(nil),
    25  	}
    26  
    27  	var projects []RepoProject
    28  	for {
    29  		var query responseData
    30  		err := client.Query(repo.RepoHost(), "OrganizationProjectList", &query, variables)
    31  		if err != nil {
    32  			return nil, err
    33  		}
    34  
    35  		projects = append(projects, query.Organization.Projects.Nodes...)
    36  		if !query.Organization.Projects.PageInfo.HasNextPage {
    37  			break
    38  		}
    39  		variables["endCursor"] = githubv4.String(query.Organization.Projects.PageInfo.EndCursor)
    40  	}
    41  
    42  	return projects, nil
    43  }
    44  
    45  type OrgTeam struct {
    46  	ID   string
    47  	Slug string
    48  }
    49  
    50  // OrganizationTeams fetches all the teams in an organization
    51  func OrganizationTeams(client *Client, repo ghrepo.Interface) ([]OrgTeam, error) {
    52  	type responseData struct {
    53  		Organization struct {
    54  			Teams struct {
    55  				Nodes    []OrgTeam
    56  				PageInfo struct {
    57  					HasNextPage bool
    58  					EndCursor   string
    59  				}
    60  			} `graphql:"teams(first: 100, orderBy: {field: NAME, direction: ASC}, after: $endCursor)"`
    61  		} `graphql:"organization(login: $owner)"`
    62  	}
    63  
    64  	variables := map[string]interface{}{
    65  		"owner":     githubv4.String(repo.RepoOwner()),
    66  		"endCursor": (*githubv4.String)(nil),
    67  	}
    68  
    69  	var teams []OrgTeam
    70  	for {
    71  		var query responseData
    72  		err := client.Query(repo.RepoHost(), "OrganizationTeamList", &query, variables)
    73  		if err != nil {
    74  			return nil, err
    75  		}
    76  
    77  		teams = append(teams, query.Organization.Teams.Nodes...)
    78  		if !query.Organization.Teams.PageInfo.HasNextPage {
    79  			break
    80  		}
    81  		variables["endCursor"] = githubv4.String(query.Organization.Teams.PageInfo.EndCursor)
    82  	}
    83  
    84  	return teams, nil
    85  }