diff --git a/src/Qwiq.Core/IExternalLink.cs b/src/Qwiq.Core/IExternalLink.cs new file mode 100644 index 00000000..da8b50a8 --- /dev/null +++ b/src/Qwiq.Core/IExternalLink.cs @@ -0,0 +1,11 @@ +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq +{ + public interface IExternalLink : ILink + { + string LinkedArtifactUri { get; } + + string ArtifactLinkTypeName { get; } + } +} diff --git a/src/Qwiq.Core/LinkMapper.cs b/src/Qwiq.Core/LinkMapper.cs index 756d1a0c..138eaa35 100644 --- a/src/Qwiq.Core/LinkMapper.cs +++ b/src/Qwiq.Core/LinkMapper.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Microsoft.Qwiq.Exceptions; using Microsoft.Qwiq.Proxies; using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; @@ -9,36 +10,46 @@ internal class LinkMapper { public Tfs.Link Map(ILink link, Tfs.WorkItem item) { - if (link.BaseType == BaseLinkType.RelatedLink) + switch (link.BaseType) { - var relatedLink = (IRelatedLink)link; - var linkTypeEnd = LinkTypeEndMapper.Map(item.Store, relatedLink.LinkTypeEnd); - return new Tfs.RelatedLink(linkTypeEnd, relatedLink.RelatedWorkItemId); - } - if (link.BaseType == BaseLinkType.Hyperlink) - { - var hyperlink = (IHyperlink) link; - return new Tfs.Hyperlink(hyperlink.Location); + case BaseLinkType.RelatedLink: + var relatedLink = (IRelatedLink)link; + var linkTypeEnd = LinkTypeEndMapper.Map(item.Store, relatedLink.LinkTypeEnd); + return new Tfs.RelatedLink(linkTypeEnd, relatedLink.RelatedWorkItemId); + + case BaseLinkType.Hyperlink: + var hyperlink = (IHyperlink)link; + return new Tfs.Hyperlink(hyperlink.Location); + + case BaseLinkType.ExternalLink: + var externalLink = (IExternalLink)link; + var registeredLinkType = RegisteredLinkTypeMapper.Map(item.Store, externalLink.ArtifactLinkTypeName); + return new Tfs.ExternalLink(registeredLinkType, externalLink.LinkedArtifactUri); + + default: + throw new ArgumentException("Unknown link type", nameof(link)); } - throw new ArgumentException("Unknown link type", nameof(link)); } public ILink Map(Tfs.Link link) { - if (link.BaseType == Tfs.BaseLinkType.RelatedLink) + switch (link.BaseType) { - var relatedLink = (Tfs.RelatedLink) link; - return ExceptionHandlingDynamicProxyFactory.Create(new RelatedLinkProxy(relatedLink)); + case Tfs.BaseLinkType.RelatedLink: + var relatedLink = (Tfs.RelatedLink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new RelatedLinkProxy(relatedLink)); - } - if (link.BaseType == Tfs.BaseLinkType.Hyperlink) - { - var hyperlink = (Tfs.Hyperlink) link; - return ExceptionHandlingDynamicProxyFactory.Create(new HyperlinkProxy(hyperlink)); - } + case Tfs.BaseLinkType.Hyperlink: + var hyperlink = (Tfs.Hyperlink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new HyperlinkProxy(hyperlink)); + + case Tfs.BaseLinkType.ExternalLink: + var externalLink = (Tfs.ExternalLink)link; + return ExceptionHandlingDynamicProxyFactory.Create(new ExternalLinkProxy(externalLink)); - throw new ArgumentException("Unknown link type", nameof(link)); + default: + throw new ArgumentException("Unknown link type", nameof(link)); + } } } } - diff --git a/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs new file mode 100644 index 00000000..b5798467 --- /dev/null +++ b/src/Qwiq.Core/Proxies/ExternalLinkProxy.cs @@ -0,0 +1,24 @@ +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq.Proxies +{ + public class ExternalLinkProxy : LinkProxy, IExternalLink + { + private readonly Tfs.ExternalLink externalLink; + + internal ExternalLinkProxy(Tfs.ExternalLink externalLink) : base(externalLink) + { + this.externalLink = externalLink; + } + + public string LinkedArtifactUri + { + get { return this.externalLink.LinkedArtifactUri; } + } + + public string ArtifactLinkTypeName + { + get { return this.externalLink.ArtifactLinkType.Name; } + } + } +} diff --git a/src/Qwiq.Core/Qwiq.Core.csproj b/src/Qwiq.Core/Qwiq.Core.csproj index 584bba9f..17c328db 100644 --- a/src/Qwiq.Core/Qwiq.Core.csproj +++ b/src/Qwiq.Core/Qwiq.Core.csproj @@ -259,6 +259,7 @@ + @@ -292,6 +293,7 @@ + @@ -314,6 +316,7 @@ + diff --git a/src/Qwiq.Core/RegisteredLinkTypeMapper.cs b/src/Qwiq.Core/RegisteredLinkTypeMapper.cs new file mode 100644 index 00000000..0dfa3345 --- /dev/null +++ b/src/Qwiq.Core/RegisteredLinkTypeMapper.cs @@ -0,0 +1,13 @@ +using System.Linq; +using Tfs = Microsoft.TeamFoundation.WorkItemTracking.Client; + +namespace Microsoft.Qwiq +{ + internal static class RegisteredLinkTypeMapper + { + public static Tfs.RegisteredLinkType Map(Tfs.WorkItemStore store, string linkTypeName) + => store.RegisteredLinkTypes + .OfType() + .FirstOrDefault(x => x.Name == linkTypeName); + } +}