public static beginGetWorkDetails()

in backlogs-panel/src/workdetailsdata.ts [27:107]


    public static beginGetWorkDetails(projectId: string, teamId: string, ids: number[]): IPromise<IModel> {
        let context = VSS.getWebContext();        

        let workClient = Tfs_Work_WebApi.getClient();
        let witClient = TFS_Wit_Client.getClient();

        let taskTypes: string[] = ["Task"];
        let bugTypes: string[] = ["Bug"];

        return workClient.getTeamSettings({ project: null, team: null, projectId: projectId, teamId: teamId }).then(teamSettings => {
            let childTypes: string[] = taskTypes;
            if (teamSettings.bugsBehavior === Tfs_Work_Contracts.BugsBehavior.AsTasks) {
                childTypes = childTypes.concat(bugTypes);
            }

            let wiql = `SELECT [System.Id] FROM WorkItemLinks WHERE (Source.[System.Id] in (${ids.join(",")})) and ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward') AND (Target.[System.WorkItemType] in ('${childTypes.join("','")}')) ORDER BY [System.State] mode(Recursive)`;

            return witClient.queryByWiql({ query: wiql }, projectId).then(queryResult => {
                let allWorkItemIds: number[] = [];
                queryResult.workItemRelations.forEach(element => {
                    allWorkItemIds.push(element.target.id);
                });

                return witClient.getWorkItems(allWorkItemIds, null, null, TFS_Wit_Contracts.WorkItemExpand.Relations).then(workItems => {
                    let notStarted = 0;
                    let inProgress = 0;
                    let completed = 0;
                    let displayNames = {};
                    let pullRequestLookup = {};
                    let pullRequests: IPullrequest[] = [];
                    let promises: IPromise<VCContracts.GitPullRequest>[] = [];

                    workItems.forEach(element => {
                        let assignedTo = element.fields["System.AssignedTo"];
                        if (!!assignedTo) {
                            displayNames[assignedTo] = true;
                        }

                        if(element && element.relations){
                            element.relations.forEach(relation => {
                                if (relation.rel === "ArtifactLink" && relation.attributes["name"] === "Pull Request") {
                                    let splitURI = decodeURIComponent(relation.url).split('/');
                                    // eg. "vstfs:", "", "", "Git", "PullRequestId", "aff28a9e-c113-4df5-b233-aac79b0b2bd5", "337492b2-c0f2-4067-a47f-56569b237a50", "1"
                                    if (splitURI.length === 8) {
                                        var promise = Git_RestClient.getClient().getPullRequest(splitURI[6], parseInt(splitURI[7]), splitURI[5]).then(pullRequestRaw => {
                                            var pullRequest: IPullrequest = {
                                                id: pullRequestRaw.pullRequestId,
                                                name: pullRequestRaw.title,
                                                lastUpdated: pullRequestRaw.creationDate,
                                                user: IdentityHelper.parseIdentityName(pullRequestRaw.createdBy.displayName, pullRequestRaw.createdBy.uniqueName),
                                                uri: `${context.host.uri}${splitURI[5]}/_git/${splitURI[6]}/pullrequest/${splitURI[7]}`,
                                                status: WorkDetailsData._computePullRequestState(pullRequestRaw)
                                            };

                                            displayNames[pullRequestRaw.createdBy.displayName + " <" + pullRequestRaw.createdBy.uniqueName + ">"] = true;
                                            
                                            if(!pullRequestLookup[pullRequestRaw.pullRequestId]) {
                                                pullRequestLookup[pullRequestRaw.pullRequestId] = true;
                                                pullRequests.push(pullRequest);
                                            }

                                        });
                                        promises.push(promise);
                                    }
                                }
                            });
                        }
                    });

                    let usernames = Object.keys(displayNames);
                    return Q.allSettled(promises).then(() => {
                        return <IModel>{
                            workItemIds: ids,
                            identities: IdentityHelper.parseUniquefiedIdentityNames(usernames),
                            pullRequests: pullRequests
                        };
                    });
                });
            });
        });
    }