private static string ConvertRelease(AzureWorkItem azureNode)
        {
            // Release      : Dev16
            // Milestone    : 16.8
            //
            // --->
            //
            // VS 16.8

            var release = azureNode.Release;

            if (release != null)
            {
                if (release.StartsWith("Dev", StringComparison.OrdinalIgnoreCase))
                {
                    release = "VS";
                }
                else if (release.StartsWith("NET", StringComparison.OrdinalIgnoreCase) || release.StartsWith(".NET", StringComparison.OrdinalIgnoreCase))
                {
                    release = ".NET SDK";
                }
            }

            var milestone = azureNode.Milestone;

            var result = string.Join(" ", release, milestone).Trim();

            if (result.Length == 0)
            {
                return(null);
            }

            return(result);
        }
        private static string ConvertMilestone(AzureWorkItem azureNode)
        {
            // Milestone    : 16.8
            // Target       : Preview 2
            //
            // --->
            //
            // 16.8 P2

            var milestone = azureNode.Milestone;

            var target = azureNode.Target;

            if (target != null)
            {
                target = target.Replace(".NET", "", StringComparison.OrdinalIgnoreCase)
                         .Replace("Preview ", "P", StringComparison.OrdinalIgnoreCase)
                         .Replace("Preview", "P", StringComparison.OrdinalIgnoreCase);
            }

            var result = string.Join(" ", milestone, target).Trim();

            if (result.Length == 0)
            {
                return(null);
            }

            return(result);
        }
        private static TreeNode ConvertNode(AzureWorkItem azureNode)
        {
            var treeNode = new TreeNode
            {
                Id         = $"azdo#{azureNode.Id}",
                IsPrivate  = true,
                IsBottomUp = IsBottomUp(azureNode),
                CreatedAt  = azureNode.CreatedAt,
                CreatedBy  = azureNode.CreatedBy,
                IsClosed   = ConvertIsClosed(azureNode),
                Title      = azureNode.Title,
                Milestone  = ConvertMilestone(azureNode),
                Priority   = ConvertPriority(azureNode.Priority),
                Cost       = ConvertCost(azureNode.Cost),
                Teams      = ConvertTeams(azureNode.Tags),
                Assignees  = string.IsNullOrEmpty(azureNode.AssignedTo)
                                ? Array.Empty <string>()
                                : new[] { azureNode.AssignedTo },
                Labels      = CreateLabels(azureNode),
                Kind        = ConvertKind(azureNode.Type),
                ReleaseInfo = new TreeNodeStatus {
                    Release = ConvertRelease(azureNode),
                    Status  = azureNode.State
                },
                Url = azureNode.Url
            };

            return(treeNode);
        }
示例#4
0
 public void AdicionarWorkItem(AzureWorkItem workItem)
 {
     _azureWorkItemRepository.Add(workItem);
 }
        private static bool ConvertIsClosed(AzureWorkItem azureNode)
        {
            var closedStates = new[] { "Cut", "Completed" };

            return(closedStates.Any(s => string.Equals(azureNode.State, s, StringComparison.OrdinalIgnoreCase)));
        }
        private static IReadOnlyList <TreeNodeLabel> CreateLabels(AzureWorkItem azureNode)
        {
            var result = new List <TreeNodeLabel>();
            var kind   = ConvertKind(azureNode.Type);
            var cost   = ConvertCost(azureNode.Cost);

            // Kind

            if (kind == TreeNodeKind.Epic)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = "Epic",
                    BackgroundColor = "c6415a",
                });
            }
            else if (kind == TreeNodeKind.UserStory)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = "User Story",
                    BackgroundColor = "0e8a16",
                });
            }

            // Priorities

            if (azureNode.Priority == 0)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Priority:0",
                    BackgroundColor = "b60205",
                });
            }
            else if (azureNode.Priority == 1)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Priority:1",
                    BackgroundColor = "d93f0b",
                });
            }
            else if (azureNode.Priority == 2)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Priority:2",
                    BackgroundColor = "e99695",
                });
            }
            else if (azureNode.Priority == 3)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Priority:3",
                    BackgroundColor = "f9d0c4",
                });
            }

            // Cost

            if (cost == TreeNodeCost.Small)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Cost:S",
                    BackgroundColor = "bfdadc",
                });
            }
            else if (cost == TreeNodeCost.Medium)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Cost:M",
                    BackgroundColor = "c2e0c6",
                });
            }
            else if (cost == TreeNodeCost.Large)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Cost:L",
                    BackgroundColor = "0e8a16",
                });
            }
            else if (cost == TreeNodeCost.ExtraLarge)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = $"Cost:XL",
                    BackgroundColor = "006b75",
                });
            }

            // Tags

            foreach (var tag in azureNode.Tags)
            {
                result.Add(new TreeNodeLabel
                {
                    Name            = tag,
                    BackgroundColor = "c5def5",
                });
            }

            return(result.ToArray());
        }
 private static bool IsBottomUp(AzureWorkItem azureNode)
 {
     return(azureNode.Tags.Any(t => string.Equals(t, ThemesOfDotNetConstants.LabelBottomUpWork, StringComparison.OrdinalIgnoreCase) ||
                               string.Equals(t, ThemesOfDotNetConstants.LabelContinuousImprovement, StringComparison.OrdinalIgnoreCase)));
 }
        private async Task <IReadOnlyList <AzureWorkItem> > GetWorkItemRootsAsync()
        {
            var azureDevOpsUrl = _configuration["AzureDevOpsUrl"];

            if (string.IsNullOrEmpty(azureDevOpsUrl))
            {
                return(new List <AzureWorkItem>());
            }

            var url              = new Uri(azureDevOpsUrl);
            var token            = _configuration["AzureDevOpsToken"];
            var connection       = new VssConnection(url, new VssBasicCredential(string.Empty, token));
            var client           = connection.GetClient <WorkItemTrackingHttpClient>();
            var itemQueryResults = await client.QueryByIdAsync(new Guid(_configuration["AzureDevOpsQueryId"]));

            var itemIds = itemQueryResults.WorkItemRelations.Select(rel => rel.Target)
                          .Concat(itemQueryResults.WorkItemRelations.Select(rel => rel.Source))
                          .Where(r => r != null)
                          .Select(r => r.Id)
                          .ToHashSet();

            var items = await GetWorkItemsAsync(client, itemIds);

            var workItemById = new Dictionary <int, AzureWorkItem>();

            foreach (var item in items)
            {
                var workItem = new AzureWorkItem();
                workItem.Id    = item.Id.Value;
                workItem.Type  = item.Fields["System.WorkItemType"].ToString();
                workItem.Title = item.Fields["System.Title"].ToString();
                workItem.State = item.Fields["System.State"].ToString();

                if (item.Fields.TryGetValue <long>("Microsoft.VSTS.Common.Priority", out var priority))
                {
                    workItem.Priority = priority;
                }

                if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.TshirtCosting", out var cost))
                {
                    workItem.Cost = cost;
                }

                if (item.Fields.TryGetValue <string>("Microsoft.eTools.Bug.Release", out var release))
                {
                    workItem.Release = release;
                }

                if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.Target", out var target))
                {
                    workItem.Target = target;
                }

                if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.Milestone", out var milestone))
                {
                    workItem.Milestone = milestone;
                }

                if (item.Fields.TryGetValue <IdentityRef>("System.AssignedTo", out var assignedTo))
                {
                    workItem.AssignedTo = GetAlias(assignedTo);
                }

                workItem.CreatedAt = (DateTime)item.Fields["System.CreatedDate"];
                workItem.CreatedBy = GetAlias((IdentityRef)item.Fields["System.CreatedBy"]);
                workItem.Url       = item.Links.Links.Where(l => l.Key == "html")
                                     .Select(l => l.Value)
                                     .OfType <ReferenceLink>()
                                     .Select(l => l.Href)
                                     .SingleOrDefault();

                if (item.Fields.TryGetValue <string>("System.Tags", out var tagText))
                {
                    workItem.Tags = tagText.Split(';');
                }
                else
                {
                    workItem.Tags = Array.Empty <string>();
                }

                workItemById.Add(workItem.Id, workItem);
            }

            foreach (var link in itemQueryResults.WorkItemRelations)
            {
                if (link.Source == null || link.Target == null)
                {
                    continue;
                }

                if (link.Rel != "System.LinkTypes.Hierarchy-Forward")
                {
                    continue;
                }

                var parentId = link.Source.Id;
                var childId  = link.Target.Id;

                if (workItemById.TryGetValue(childId, out var child) &&
                    workItemById.TryGetValue(parentId, out var parent))
                {
                    child.Parent = parent;
                    parent.Children.Add(child);
                }
            }

            return(workItemById.Values.OrderBy(v => v.Id)
                   .Where(n => n.Parent == null)
                   .ToArray());
        }