如何获取给定 TFS Web 扩展中的文档集合列表?

How do I get a list of document collections in a given TFS web extension?

我正在尝试使用 Microsoft/vsts-node-api 从我的本地 TFS 2017 (U3) Web 扩展中获取文档列表。我可以通过以下方式获得扩展本身

import * as v from 'vso-node-api';
import * as xa from 'vso-node-api/ExtensionManagementApi';
import * as xi from 'vso-node-api/interfaces/ExtensionManagementInterfaces';
let serverUrl = process.argv[2];
let extensionId = process.argv[3];

async function getWebApi(serverUrl): Promise<vm.WebApi> {
    return new Promise<vm.WebApi>(async (resolve, reject) => {
        try {
            let token = getEnv('API_TOKEN'); // personal access token
            let authHandler = v.getPersonalAccessTokenHandler(token);

            let option = undefined;
            let webApi: v.WebApi = new v.WebApi(serverUrl, authHandler, option);
            let connData: lim.ConnectionData = await vsts.connect();
            console.log('Hello ' + connData.authenticatedUser.providerDisplayName);
            resolve(webApi);
        }
        catch (err) {
            reject(err);
        }
    });
}

let vsts: v.WebApi = await getWebApi(serverUrl);
let vstsX: xa.IExtensionManagementApi = await vsts.getExtensionManagementApi();
let extension: xi.InstalledExtension = 
            (await vstsX.getInstalledExtensions()).find(x => x.extensionId === extensionId);

现在我想获取该扩展中所有文档的列表。为此,我想首先我必须在该扩展中获取所有 'collections' 文档(不要与 TFS/VSTS 集合混淆)。我认为我想要的 API 方法是 queryCollectionsByName,它 returns 一个 ExtensionDataCollection 数组,我认为这是我想要的,但我不知道如何创建 ExtensionDataCollectionQuery 对象(它本身只是一个ExtensionDataCollection 的数组)它想要作为第一个参数。我不明白为什么它需要一个 ExtensionDataCollection 数组作为输入参数——我想要扩展中的所有 ExtensionDataCollections。

我试过这个:

let collectionQuery: xi.ExtensionDataCollectionQuery;

let dataCollection : xi.ExtensionDataCollection[] = 
            await vstsX.queryCollectionsByName(collectionQuery, extension.publisherName, extension.extensionName);

但是我明白了

Error: value cannot be null

这些文档对我来说似乎没有太大帮助,但也许我没有正确阅读它们:https://www.visualstudio.com/en-us/docs/integrate/extensions/reference/client/api/vss/references/sdk_interfaces/extensiondatacollectionquery

如何从 Web 扩展中获取文档集列表?

更新:REST URLs

换个方式问这个问题。

我可以用这个 URL 获得已安装扩展的列表: https://{account}.extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions

如果我知道 "Collection Name",我可以从集合中获取文档列表: https://{account}.extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extensionName}/Data/Scopes/Default/Current/Collections/{collectionName}/Documents/

我可以使用什么 URL 来获取给定扩展中的集合列表?我尝试了这个,这与我们获取扩展列表的方式类似,但我得到了 404: https://{account}.extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/{publisherName}/{extensionName}/Data/Scopes/Default/Current/Collections

这显然无法完成 - 您需要知道集合名称(以及扩展 ID 和发布者 ID)。

然后,可以像这样检索集合中的文档:

    let documentCollection = 
        await vstsX.getDocumentsByName(extension.publisherId, extension.extensionId, "Default", "Current", collectionName);

参考这里: https://github.com/Microsoft/vsts-node-api/issues/160

目前我遇到了同样的问题。愿有人帮忙。我编写了一个涵盖以下场景的 PowerShell 脚本:

  1. 创建文档

  2. 获取所有文档

  3. 修补文档

  4. 删除所有文件

范围类型:集合


作为 VSS SDK 的参考,请查看 Data storage


#VARIABLES TO SET
$Uri = "{devops url}"
$Collection = "{collection name}"
$PAT = "{personal access token}"
$Publisher = "{publisher of extension}"
$Extension = "{name of extension}"

#JSON FILE TO UPLOAD
$jsonFile = "{ 'A': { 'A1': 10, 'A2': 20 }, 'B': { 'B1': 30, 'B2': 40 } }"

#AUTHORIZATION HEADERS
$headers = @{
    "Authorization" = ('Basic {0}' -f [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PAT)")))
    "If-Match"      = ""
}


#CREATE DOCUMENT
$body = $jsonFile
$api = "api-version=3.1-preview.1"
$url = "$Uri/$Collection/_apis/ExtensionManagement/InstalledExtensions/$Publisher/$Extension/Data/Scopes/Default/Current/Collections/$Collection/Documents?$api"
$result = Invoke-RestMethod -Uri $url -Method POST -ContentType "application/json" -Headers $headers -Body $body -TimeoutSec $timeout -Verbose
Write-Host "[ps1] create document: $result" -ForegroundColor Green


#GET ALL DOCUMENTS
$url = "$Uri/$Collection/_apis/ExtensionManagement/InstalledExtensions/$Publisher/$Extension/Data/Scopes/Default/Current/Collections/$Collection/Documents?"
$result = Invoke-RestMethod -Uri $url -Method GET -ContentType "application/json" -Headers $headers -TimeoutSec $timeout -Verbose
Write-Host "[ps1] get all documents: $result" -ForegroundColor Yellow

foreach($item in $result){
    Write-Host "[ps1] A: $($item.value.A[0])" -ForegroundColor DarkGray
    #GET ETAG AND ID OF THE FIRST DOCUMENT
    $etag = $item.value.__etag[0]
    $id = $item.value.id[0]
    break;
}


#PATCH DOCUMENT
$json = $jsonFile | ConvertFrom-Json
$json.A.A1 = 15
$json | Add-Member @{"id"= $id}
$json | Add-Member @{"__etag"= $etag}
$body = $json | ConvertTo-Json
$api = "api-version=3.1-preview.1"
$url = "$Uri/$Collection/_apis/ExtensionManagement/InstalledExtensions/$Publisher/$Extension/Data/Scopes/Default/Current/Collections/$Collection/Documents?$api"
$patch = Invoke-RestMethod -Uri $url -Method PATCH -ContentType "application/json" -Headers $headers -Body $body -TimeoutSec $timeout -Verbose
Write-Host "[ps1] patch document: $patch" -ForegroundColor Yellow
Write-Host "[ps1] patched A: $($patch.A)" -ForegroundColor Gray


#REMOVE ALL DOCUMENTS
Write-Host "[ps1] documents to remove: $($result.count)"
for($i = 0; $i -lt $result.count; $i++){

    $id = $result.value[$i].id
    $api = "api-version=3.1-preview.1"
    $url = "$Uri/$Collection/_apis/ExtensionManagement/InstalledExtensions/$Publisher/$Extension/Data/Scopes/Default/Current/Collections/$Collection/Documents/$($result.value[$i].id)?$api"
    Invoke-RestMethod -Uri $url -Method DELETE -ContentType "application/json" -Headers $headers -TimeoutSec $timeout -Verbose
    Write-Host "[ps1] delete document: $id" -ForegroundColor Red
}