Search code examples
azureazure-devopsazure-devops-rest-apiworkitemwiql

Azure DevOps Wiql API add fields to Response workItems


I'm looking a way (or Query) to add the workItem Fields on the response of this query:

{
  "query": "Select [System.Id], [System.Title] From WorkItems Where [System.WorkItemType] = 'Task' OR [System.WorkItemType] = 'Bug'"
}

Current Response:

{
    "queryType": "flat",
    "queryResultType": "workItem",
    "asOf": "2020-08-17T15:13:32.75Z",
    "columns": [
        {
            "referenceName": "System.Id",
            "name": "ID",
            "url": "https://dev.azure.com/.../_apis/wit/fields/System.Id"
        },
        {
            "referenceName": "System.Title",
            "name": "Title",
            "url": "https://dev.azure.com/..._apis/wit/fields/System.Title"
        }
    ],
    "workItems": [
        {
            "id": 27,
            "url": "https://dev.azure.com/.../_apis/wit/workItems/27"
        },
        {
            "id": 44,
            "url": "https://dev.azure.com/.../_apis/wit/workItems/44"
        }
]
}

I need to expand Fields on each workItem found like i would be doing a GET workitems API request, even if its possible to ?$expand=relations

This would be my expected output on WorkItems Expected Response:

{
    "queryType": "flat",
    "queryResultType": "workItem",
    "asOf": "2020-08-17T15:13:32.75Z",
    "columns": [
        {
            "referenceName": "System.Id",
            "name": "ID",
            "url": "https://dev.azure.com/.../_apis/wit/fields/System.Id"
        },
        {
            "referenceName": "System.Title",
            "name": "Title",
            "url": "https://dev.azure.com/.../_apis/wit/fields/System.Title"
        }
    ],
    "workItems": [
{
    "id": 27,
    "rev": 22,
    "fields": {
        "System.AreaPath": "Cloud",
        "System.TeamProject": "Cloud",
        "System.IterationPath": "Cloud\\Sprint 6",
        "System.WorkItemType": "Task",
        "System.State": "Closed",
        "System.Reason": "Completed",
        "System.AssignedTo": {...},
        "System.CreatedDate": "2020-02-24T15:52:08.867Z",
        "System.CreatedBy": {...},
        "System.ChangedDate": "2020-06-24T14:48:26.593Z",
        "System.ChangedBy": {...},
        "System.CommentCount": 6,
        "System.Title": "Add XCAL import support to AAT3 framework and GUI",
        "Microsoft.VSTS.Common.StateChangeDate": "2020-06-24T14:48:26.593Z",
        "Microsoft.VSTS.Common.ActivatedDate": "2020-06-03T00:47:20.397Z",
        "Microsoft.VSTS.Common.ActivatedBy": {...},
        "Microsoft.VSTS.Common.ClosedDate": "2020-06-24T14:48:26.593Z",
        "Microsoft.VSTS.Common.ClosedBy": {...},
        "Microsoft.VSTS.Common.Priority": 2,
        "Microsoft.VSTS.Common.ValueArea": "Business",
        "WEF_DA224280DD46429CA75C96DC1082D816_Kanban.Column": "New",
        "WEF_DA224280DD46429CA75C96DC1082D816_Kanban.Column.Done": false,
        "System.Description": "...",
        "System.Parent": 45
    },
    "relations": [...],
    "_links": {...},
    "url": "...workItems/27"
},
        {
            "id": 44,
              ...
        }
]
}

Solution

  • I am afraid that the WIQL Rest API couldn't return the detailed work item information.

    But you could use the WIQL Get the work item ids and send the ids to Work item -List. In this case, you could get the work item information.

    Here is a PowerShell Script sample:

    $token = "PAT"
    
    $url="https://dev.azure.com/Organizationname/_apis/wit/wiql?api-version=5.1"
    
    $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
    
    $JSON = @'
    {
       "query": "SELECT [System.Id], [System.WorkItemType],  [System.State],[System.AreaPath],[System.Tags],[System.CommentCount],[System.ChangedDate] FROM workitems WHERE[System.Id] IN(@follows) AND [System.TeamProject] = 'Azure' AND [System.State] <> '' ORDER BY [System.ChangedDate] DESC"
    }
    '@
    
    $response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $JSON -ContentType application/json
    
    $listOfTasks = New-Object Collections.Generic.List[String]
    ForEach( $workitem in $response.workItems ) {
      $listOfTasks.Add($workitem.id)
    
    }
    $listOfTasks = $listOfTasks -join ','
    $listOfTasks
    
    $url1="https://dev.azure.com/Organizationname/ProjectName/_apis/wit/workitems?ids=$listOfTasks" +"&" + "`$expand" + "=all&api-version=5.1"
    
    $response1 = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method Get 
    
    Write-Host "result = $($response1 | ConvertTo-Json -Depth 100)"
    

    Explaination:

    The first part is to get the workitem id output by wiql.

    The second part is to add work item id list to work item list api to obtain specific information of all work items.

    Here is the result:

    enter image description here