How can I efficiently list all work item type states via ADO REST API?

I am trying to list all work item type states for an organisation (visible to the authenticated user) via REST API. It seemed more efficient to list all processes (https://learn.microsoft.com/en-us/rest/api/azure/devops/core/processes/list?view=azure-devops-rest-4.1) and then use the endpoint to list all work item types of those processes together with the states (https://learn.microsoft.com/en-us/rest/api/azure/devops/processes/work-item-types/list?view=azure-devops-rest-4.1&tabs=HTTP). However, I am missing some custom states in the response.

When I list all projects (https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/list?view=azure-devops-rest-4.1&tabs=HTTP), then all work item types of those projects (https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-item-types/list?view=azure-devops-rest-4.1&tabs=HTTP) and then all states of those types (https://learn.microsoft.com/en-us/rest/api/azure/devops/wit/work-item-type-states/list?view=azure-devops-rest-4.1&tabs=HTTP), there is everything. But that is sooo many requests.

Can someone explain, why is the first approach not working? Every projet should be associated with a process. Or not? Do you know a better way to get all those states as efficiently as possible?

Thanks in advance. :)

Upvotes: 1

Views: 1341

Answers (1)

Andy Li-MSFT
Andy Li-MSFT

Reputation: 30422

As we can see from the official documentation : Work Item Type States - List, it's in project level not the organization level. So, we need to get the states by project scope.

GET https://dev.azure.com/{organization}/{project}/_apis/wit/workitemtypes/{type}/states?api-version=4.1-preview.1

We can write a script to retrieve the projects and work item types in a loop, then get the states of each work item type.

UPDATE:

We can use States - List REST API to return a list of all state definitions in a work item type of the process.

Below PowerShell script for your reference to return the states from a specific process:

Param(
   [string]$orgurl = "https://dev.azure.com/{org}", 
   [string]$processname = "Your-Process-Name",
   [string]$user = "",
   [string]$token = "PAT"
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

#Get Process ID
$processesurl = "$orgurl/_apis/process/processes?api-version=6.0"
$processes = (Invoke-RestMethod -Uri $processesurl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}).value | where {$_.name -eq $processname }
$processesid = $processes.id 

#List Work item types and witRefName 
$witsurl = "$orgurl/_apis/work/processes/$processesid/workitemtypes?api-version=6.0"
$witRefNames = (Invoke-RestMethod -Uri $witsurl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}).value.referenceName #| where {$_.name -eq $processname }

#List WIT states
foreach ($witRefName in $witRefNames){
    $statesurl = "$orgurl/_apis/work/processes/$processesid/workItemTypes/$witRefName/states?api-version=6.0"
    $states = (Invoke-RestMethod -Uri $statesurl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}).value.name 
   
    Write-Host "==================================================================================="
    Write-Host "$witRefName - States:" $states
    Write-Host "==================================================================================="
    echo `n 
}

enter image description here

If you want to retrieve all states from all processes, then you can get the processes and loop them in the script.

Upvotes: 2

Related Questions