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
}
}