using System; using System.Runtime.Serialization; using GitHub.Core.WebApi; using GitHub.Services.WebApi; using Newtonsoft.Json; namespace GitHub.Build.WebApi { /// /// Represents a reference to a definition. /// [DataContract] [KnownType(typeof(BuildDefinition))] [KnownType(typeof(BuildDefinitionReference))] [JsonConverter(typeof(DefinitionReferenceJsonConverter))] #pragma warning disable 618 public class DefinitionReference : ShallowReference, ISecuredObject #pragma warning restore 618 { /// /// The ID of the referenced definition. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public new Int32 Id { get { return base.Id; } set { base.Id = value; } } /// /// The name of the referenced definition. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public new String Name { get { return base.Name; } set { base.Name = value; } } /// /// The REST URL of the definition. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public new String Url { get { return base.Url; } set { base.Url = value; } } /// /// The definition's URI. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public Uri Uri { get; set; } /// /// The folder path of the definition. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public String Path { get; set; } /// /// The type of the definition. /// [DataMember(IsRequired = false, EmitDefaultValue = false)] public DefinitionType Type { get; set; } /// /// A value that indicates whether builds can be queued against this definition. /// [DataMember(IsRequired = false, EmitDefaultValue = true)] public DefinitionQueueStatus QueueStatus { get; set; } /// /// The definition revision number. /// [DataMember(EmitDefaultValue = false)] public Int32? Revision { get; set; } /// /// The date this version of the definition was created. /// [DataMember(EmitDefaultValue = false)] public DateTime CreatedDate { get; set; } /// /// A reference to the project. /// [DataMember(EmitDefaultValue = false, Order = 1000)] public TeamProjectReference Project { get; set; } #region ISecuredObject implementation Guid ISecuredObject.NamespaceId => Security.BuildNamespaceId; Int32 ISecuredObject.RequiredPermissions => m_requiredPermissions; String ISecuredObject.GetToken() { if (!String.IsNullOrEmpty(m_nestingSecurityToken)) { return m_nestingSecurityToken; } return GetToken(this.Project, this.Path, this.Id); } internal void SetRequiredPermissions( Int32 newValue) { m_requiredPermissions = newValue; } internal void SetNestingSecurityToken( String tokenValue) { // For anything more detailed than a DefinitionReference, // we don't let you use a nesting security token. if (this is BuildDefinitionReference) { // Debug.Fail("Nesting security tokens is not allowed for anything more detailed than a DefinitionReference"); m_nestingSecurityToken = String.Empty; return; } m_nestingSecurityToken = tokenValue; } internal static String GetToken( TeamProjectReference project, String path, Int32 definitionId) { return GetToken(project?.Id, path, definitionId); } internal static String GetToken( Guid? projectId, String path, Int32 definitionId) { return String.Concat(projectId?.ToString("D") ?? String.Empty, Security.GetSecurityTokenPath(path ?? String.Empty), definitionId); } private Int32 m_requiredPermissions = BuildPermissions.ViewBuildDefinition; private String m_nestingSecurityToken = String.Empty; #endregion } }