microsoft / azure-devops-extension-sdk

Client SDK for developing Azure DevOps extensions
MIT License
123 stars 38 forks source link

Cannot create documents via the Extension Data APIs (404) #26

Closed epignosisx closed 4 years ago

epignosisx commented 4 years ago

Hi folks. I'm trying to create a document using the Extensions Data API but I keep getting a 404 with the following response:

{"Message":"No HTTP resource was found that matches the request URI 'https://extmgmt.dev.azure.com/_apis/ExtensionManagement/InstalledExtensions/merge-a-bot/Data/Scopes/Default/Current/Collections/MergePolicies-Automerge/Documents'."}

Here is how my request looks like

POST: https://extmgmt.dev.azure.com/epignosisx/_apis/ExtensionManagement/InstalledExtensions/merge-a-bot/Data/Scopes/Default/Current/Collections/MergePolicies-Automerge/Documents

accept: application/json;api-version=3.2-preview.1;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
authorization: Bearer <omitted>
content-length: 95
content-type: application/json
origin: https://dev.azure.com
referer: https://dev.azure.com/epignosisx/Automerge/_apps/hub/alex-h.merge-a-bot.merge-policies-hub
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-site
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37
x-tfs-fedauthredirect: Suppress
x-tfs-session: 94314739-d0c3-4584-a122-ddd3af09b314
x-vss-reauthenticationaction: Suppress

{"strategy":"SpecificSourceAndTargetPolicy","repo":"Automerge","source":"asdf","target":"asdf"}

Here is the outcome in the Network Tab: image

This is how my code looks like:

export async function createPolicy(strategy: string, repo: string, source: string, target: string): Promise<void> {
    var context = SDK.getExtensionContext();
    var token = await SDK.getAccessToken();
    var dataService = await SDK.getService<IExtensionDataService>(CommonServiceIds.ExtensionDataService);
    var mng = await dataService.getExtensionDataManager(context.extensionId, token);
    var doc = await mng.createDocument("MergePolicies-" + repo, { strategy: strategy, repo: repo, source: source, target: target });
    console.log(doc);
}

and I'm making sure to initialize the SDK on page startup:

SDK.init().then(() => {
    ReactDOM.render(<App />, document.getElementById("root"));
})

Finally, I've been following this guide based on the old VSS and adapting it to the new SDK/API packages:

https://docs.microsoft.com/en-us/azure/devops/extend/develop/data-storage?view=azure-devops#create-a-document

Really appreciate your help here, I've run out of troubleshooting ideas.

epignosisx commented 4 years ago

Figured out the problem. The extension id is actually a concatenation of publisher id and extension id:

export async function createPolicy(strategy: string, repo: string, source: string, target: string): Promise<void> {
    var context = SDK.getExtensionContext();
    var token = await SDK.getAccessToken();
    var dataService = await SDK.getService<IExtensionDataService>(CommonServiceIds.ExtensionDataService);
    //var mng = await dataService.getExtensionDataManager(context.extensionId, token); <-- replaced by line below
    var mng = await dataService.getExtensionDataManager(context.extensionId + "." + context.extensionId, token);
    var doc = await mng.createDocument("MergePolicies-" + repo, { strategy: strategy, repo: repo, source: source, target: target });
    console.log(doc);
}
matt-psaltis-work commented 1 year ago

Couple of years later stumble on the same problem! Thanks for finding this @epignosisx

Heads up - extensionId is repeated twice so when your publisherId and extensionId are different it'll still be broken.

var mng = await dataService.getExtensionDataManager(context.publisherId + "." + context.extensionId, token);