Functions/Public/Get-GitHubBetaProjectItem.ps1
function Get-GitHubBetaProjectItem { <# .SYNOPSIS EXPERIMENTAL: Gets the items in a GitHub project (Beta). #> [CmdletBinding()] param( [Parameter(Mandatory)] [string] $ProjectNodeId, # Optional base URL of the GitHub API, for example "https://ghe.mycompany.com/api/v3/" (including the trailing slash). # Defaults to "https://api.github.com" [Uri] $BaseUri = [Uri]::new('https://api.github.com'), [Security.SecureString] $Token ) process { # Paginate in reverse, to get the most recent items first. $before = $null do { Write-Verbose "Requesting previous page (paginating backwards)" $result = Invoke-GitHubGraphQlApi ` -Headers @{ 'GraphQL-Features' = 'projects_next_graphql' } ` -Query 'query($projectId: ID!, $before: String) { node(id: $projectId) { ... on ProjectNext { items(last: 100, before: $before) { pageInfo { hasPreviousPage startCursor } nodes { id title createdAt updatedAt fieldValues(first: 20) { nodes { value projectField { name } } } content { ...on Issue { __typename number state repository { owner { login } name nameWithOwner } } ...on PullRequest { __typename number state repository { owner { login } name nameWithOwner } } } } } } } }' ` -Variables @{ projectId = $ProjectNodeId before = $before } ` -BaseUri $BaseUri ` -Token $Token $nodes = $result.node.items.nodes [array]::Reverse($nodes) | Out-Null foreach ($node in $nodes) { # Expose fields as ergonomic name=>value hashtable $fieldHashTable = @{ } foreach ($field in $node.fieldValues.nodes) { $fieldHashTable[$field.projectField.name] = $field.value } Add-Member -InputObject $node -NotePropertyName 'Fields' -NotePropertyValue $fieldHashTable $node } $before = $result.node.items.pageInfo.startCursor } while ($result.node.items.pageInfo.hasPreviousPage) } } |