curl -i -X POST \
-H "Content-Type:text/yaml" \
-H "Authorization:Bearer access-token-here" \
-d \
'AssetType: Story
function tally(root, prop) { | |
if (!root[prop]) root[prop] = 0; | |
root[prop]++; | |
} | |
function hasItems(array) { | |
return array && array.length > 0; | |
} | |
function tallyBy(state, key, length) { |
import {test, assetApiPost} from '../../lib/asset-api-helper'; | |
const types = ['yaml', 'json']; | |
for(const type of types) { | |
test(`Update Description scalar Attribute on two Stories matching a where clause by Scope OIDToken (${type})`, async t => { | |
const setupCommand = ` | |
AssetType: Scope | |
Name: Test - Update Description scalar Scope | |
Parent: Scope:0 |
<?xml version="1.0" encoding="UTF-8"?> | |
<Assets total="11166" pageSize="2147483647" pageStart="0"> | |
<Asset href="/GVC-Sandbox/rest-1.v1/Data/Epic/3286021" id="Epic:3286021"> | |
<Attribute name="Name">MTT General requirments</Attribute> | |
</Asset> | |
<Asset href="/GVC-Sandbox/rest-1.v1/Data/Epic/3220348" id="Epic:3220348"> | |
<Attribute name="Name">GIT - a new SCM</Attribute> | |
</Asset> | |
<Asset href="/GVC-Sandbox/rest-1.v1/Data/Epic/3394297" id="Epic:3394297"> | |
<Attribute name="Name">Sun Estate Refresh (Vienna)  Sun Maintenance</Attribute> |
using System; | |
using System.Collections.Generic; | |
using System.Diagnostics; | |
using System.Globalization; | |
using System.IO; | |
using System.Linq; | |
using System.Net; | |
using System.Net.Http; | |
using System.Net.Http.Headers; | |
using System.Reflection; |
V1Connector connector = V1Connector | |
.WithInstanceUrl("<Server Base URI>") | |
.WithUserAgentHeader("AppName", "1.0") | |
.WithAccessToken("1.rWM8lKLk+PnyFxkEWVX5Kl2u6Jk=") | |
.Build(); | |
IServices services = new Services(connector); | |
Oid projectId = services.GetOid("Scope:1012"); | |
IAssetType storyType = services.Meta.GetAssetType("Story"); |
These are evolving notes demonstrating a new Bulk API for VersionOne Lifecycle to support Create, Update, and Execute Operation commands built upon the powerful and intuitive query.v1 syntax.
{ | |
"AssetType": "Epic", | |
"Scope": "zoozoo's Project", | |
"Description": "Beginners writing games with HTML5 and JavaScript of today (ES5) must master challenging recursion, asynchronous game loops, and callback hell. See how ES2015 and ES2016's powerful new features simplify all of this, reducing the cognitive burden for beginners and seasoned pros!", | |
"Name": "ES2015 and Beyond", | |
"Subs": [ | |
{ | |
"AssetType": "Story", | |
"Name": "Powered up JavaScript", | |
"Description": "Learn about how ES2015 and beyond will powerup your code!", |
https://docs.google.com/presentation/d/1YTtCXa_xoLU7CWCMoR2hxTwRmce1R99WTfIonKhb2eA/edit#slide=id.g241e8433b8_0_97 |
To process a Bulk API request in the most efficient and reliable manner, we need to be able to break it into multiple steps and process it on the background as a "Job", essentially. This Job will be capable of surviving App Domain failures or restarts. This means that if it has, for example, 1,000 discrete commands to process (creating assets, updating existing assets, executing operations against existing assets), it will resume where it left off when the application restarts and the Job processor notices that it is not finished.
Eventually, the entire process will look roughly like this:
- Ingest the entire payload, convert it from YAML, XML, Excel or whatever into an easiest-to-work with Json.NET structure (Currently it's converting JSON into Yaml!)
- Persist this to DB, return a URI to caller that indicates where to request status updates for the Bulk Job
- On background, begin breaking down the payload into a linear and finite list of projected commands of the following types:
- Creat