Add 'DNS Account Settings > Internal Views'

This commit is contained in:
2025-07-31 12:10:39 +02:00
parent 7e6607ae56
commit c5d0073e6d
14 changed files with 1127 additions and 4 deletions

View File

@@ -86,5 +86,104 @@ namespace AMWD.Net.Api.Cloudflare.Dns
return client.GetAsync<DnsAccountSettings>($"/accounts/{accountId}/dns_settings", null, cancellationToken);
}
#region Views
/// <summary>
/// Create Internal DNS View for an account.
/// </summary>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="request">The request.</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<InternalDnsView>> CreateInternalDnsView(this ICloudflareClient client, CreateInternalDnsViewRequest request, CancellationToken cancellationToken = default)
{
request.AccountId.ValidateCloudflareId();
if (string.IsNullOrWhiteSpace(request.Name))
throw new ArgumentNullException(nameof(request.Name));
if (request.Name.Length > 255)
throw new ArgumentOutOfRangeException(nameof(request.Name), request.Name, "The Name length must be between 1 and 255 characters.");
var req = new InternalModifyInternalDnsViewRequest
{
Name = request.Name,
Zones = request.ZoneIds
};
return client.PostAsync<InternalDnsView, InternalModifyInternalDnsViewRequest>($"/accounts/{request.AccountId}/dns_settings/views", req, null, cancellationToken);
}
/// <summary>
/// Delete an existing Internal DNS View.
/// </summary>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="accountId">The account identifier.</param>
/// <param name="viewId">The view identifier.</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<Identifier>> DeleteInternalDnsView(this ICloudflareClient client, string accountId, string viewId, CancellationToken cancellationToken = default)
{
accountId.ValidateCloudflareId();
viewId.ValidateCloudflareId();
return client.DeleteAsync<Identifier>($"/accounts/{accountId}/dns_settings/views/{viewId}", null, cancellationToken);
}
/// <summary>
/// Update an existing Internal DNS View.
/// </summary>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="request">The request.</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<InternalDnsView>> UpdateInternalDnsView(this ICloudflareClient client, UpdateInternalDnsViewRequest request, CancellationToken cancellationToken = default)
{
request.AccountId.ValidateCloudflareId();
request.ViewId.ValidateCloudflareId();
if (string.IsNullOrWhiteSpace(request.Name))
throw new ArgumentNullException(nameof(request.Name));
if (request.Name.Length > 255)
throw new ArgumentOutOfRangeException(nameof(request.Name), request.Name, "The Name length must be between 1 and 255 characters.");
var req = new InternalModifyInternalDnsViewRequest
{
Name = request.Name,
Zones = request.ZoneIds
};
return client.PatchAsync<InternalDnsView, InternalModifyInternalDnsViewRequest>($"/accounts/{request.AccountId}/dns_settings/views/{request.ViewId}", req, cancellationToken);
}
/// <summary>
/// Get DNS Internal View.
/// </summary>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="accountId">The account identifier.</param>
/// <param name="viewId">The view identifier.</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<InternalDnsView>> InternalDnsViewDetails(this ICloudflareClient client, string accountId, string viewId, CancellationToken cancellationToken = default)
{
accountId.ValidateCloudflareId();
viewId.ValidateCloudflareId();
return client.GetAsync<InternalDnsView>($"/accounts/{accountId}/dns_settings/views/{viewId}", null, cancellationToken);
}
/// <summary>
/// List DNS Internal Views for an Account.
/// </summary>
/// <param name="client">The <see cref="ICloudflareClient"/> instance.</param>
/// <param name="accountId">The account identifier.</param>
/// <param name="options">Filter options (optional).</param>
/// <param name="cancellationToken">A cancellation token used to propagate notification that this operation should be canceled.</param>
public static Task<CloudflareResponse<IReadOnlyCollection<InternalDnsView>>> ListInternalDnsViews(this ICloudflareClient client, string accountId, ListInternalDnsViewsFilter? options = null, CancellationToken cancellationToken = default)
{
accountId.ValidateCloudflareId();
return client.GetAsync<IReadOnlyCollection<InternalDnsView>>($"/accounts/{accountId}/dns_settings/views", options, cancellationToken);
}
#endregion Views
}
}

View File

@@ -0,0 +1,153 @@
using System.Runtime.Serialization;
using Newtonsoft.Json.Converters;
namespace AMWD.Net.Api.Cloudflare.Dns
{
/// <summary>
/// Filter for listing internal DNS views.
/// </summary>
public class ListInternalDnsViewsFilter : IQueryParameterFilter
{
/// <summary>
/// Direction to order DNS views in.
/// </summary>
public SortDirection? Direction { get; set; }
/// <summary>
/// Whether to match all search requirements or at least one (any).
/// </summary>
/// <remarks>
/// <para>
/// If set to <see cref="FilterMatchType.All"/>, acts like a logical AND between filters.
/// <br/>
/// If set to <see cref="FilterMatchType.Any"/>, acts like a logical OR instead.
/// </para>
/// </remarks>
public FilterMatchType? Match { get; set; }
#region Name
/// <summary>
/// Substring of the DNS record Name.
/// Name filters are case-insensitive.
/// </summary>
public string? NameContains { get; set; }
/// <summary>
/// Suffix of the DNS record Name.
/// Name filters are case-insensitive.
/// </summary>
public string? NameEndsWith { get; set; }
/// <summary>
/// Exact value of the DNS record Name.
/// Name filters are case-insensitive.
/// </summary>
public string? NameExact { get; set; }
/// <summary>
/// Prefix of the DNS record Name.
/// Name filters are case-insensitive.
/// </summary>
public string? NameStartsWith { get; set; }
#endregion Name
/// <summary>
/// Field to order DNS views by.
/// </summary>
public InternalDnsViewsOrderBy? OrderBy { get; set; }
/// <summary>
/// Page number of paginated results.
/// </summary>
/// <value>1 &lt;= X</value>
public int? Page { get; set; }
/// <summary>
/// Number of DNS records per page.
/// </summary>
/// <value>1 &lt;= X &lt;= 5,000,000</value>
public int? PerPage { get; set; }
/// <summary>
/// A zone ID that exists in the zones list for the view.
/// </summary>
public string? ZoneId { get; set; }
/// <summary>
/// A zone name that exists in the zones list for the view.
/// </summary>
public string? ZoneName { get; set; }
/// <inheritdoc />
public IReadOnlyDictionary<string, string> GetQueryParameters()
{
var dict = new Dictionary<string, string>();
#pragma warning disable CS8602, CS8604 // There will be no null value below.
if (Direction.HasValue && Enum.IsDefined(typeof(SortDirection), Direction.Value))
dict.Add("direction", Direction.Value.GetEnumMemberValue());
if (Match.HasValue && Enum.IsDefined(typeof(FilterMatchType), Match.Value))
dict.Add("match", Match.Value.GetEnumMemberValue());
if (!string.IsNullOrWhiteSpace(NameContains))
dict.Add("name.contains", NameContains.Trim());
if (!string.IsNullOrWhiteSpace(NameEndsWith))
dict.Add("name.endswith", NameEndsWith.Trim());
if (!string.IsNullOrWhiteSpace(NameExact))
dict.Add("name.exact", NameExact.Trim());
if (!string.IsNullOrWhiteSpace(NameStartsWith))
dict.Add("name.startswith", NameStartsWith.Trim());
if (OrderBy.HasValue && Enum.IsDefined(typeof(InternalDnsViewsOrderBy), OrderBy.Value))
dict.Add("order", OrderBy.Value.GetEnumMemberValue());
if (Page.HasValue && Page.Value >= 1)
dict.Add("page", Page.Value.ToString());
if (PerPage.HasValue && PerPage.Value >= 1 && PerPage.Value <= 5_000_000)
dict.Add("per_page", PerPage.Value.ToString());
if (!string.IsNullOrWhiteSpace(ZoneId))
dict.Add("zone_id", ZoneId.Trim());
if (!string.IsNullOrWhiteSpace(ZoneName))
dict.Add("zone_name", ZoneName.Trim());
#pragma warning restore CS8602, CS8604
return dict;
}
}
/// <summary>
/// Possible fields to order internal DNS views by.
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public enum InternalDnsViewsOrderBy
{
/// <summary>
/// Order by name.
/// </summary>
[EnumMember(Value = "name")]
Name = 1,
/// <summary>
/// Order by creation date.
/// </summary>
[EnumMember(Value = "created_on")]
CreatedOn = 2,
/// <summary>
/// Order by last modified date.
/// </summary>
[EnumMember(Value = "modified_on")]
ModifiedOn = 3
}
}

View File

@@ -0,0 +1,11 @@
namespace AMWD.Net.Api.Cloudflare.Dns.Internals
{
internal class InternalModifyInternalDnsViewRequest
{
[JsonProperty("name")]
public string? Name { get; set; }
[JsonProperty("zones")]
public IReadOnlyCollection<string>? Zones { get; set; }
}
}

View File

@@ -0,0 +1,49 @@
namespace AMWD.Net.Api.Cloudflare.Dns
{
/// <summary>
/// A Cloudflare internal DNS view.
/// </summary>
public class InternalDnsView
{
/// <summary>
/// Initializes a new instance of the <see cref="InternalDnsView"/> class.
/// </summary>
/// <param name="id">The identifier.</param>
/// <param name="name">The name of the view.</param>
public InternalDnsView(string id, string name)
{
Id = id;
Name = name;
}
/// <summary>
/// The identifier.
/// </summary>
[JsonProperty("id")]
public string Id { get; set; }
/// <summary>
/// When the view was created.
/// </summary>
[JsonProperty("created_time")]
public DateTime? CreatedTime { get; set; }
/// <summary>
/// When the view was last modified.
/// </summary>
[JsonProperty("modified_time")]
public DateTime? ModifiedTime { get; set; }
/// <summary>
/// The name of the view.
/// </summary>
[JsonProperty("name")]
public string Name { get; set; }
/// <summary>
/// The list of zones linked to this view.
/// </summary>
[JsonProperty("zones")]
public IReadOnlyCollection<string> ZoneIds { get; set; } = [];
}
}

View File

@@ -33,6 +33,11 @@ This package contains the feature set of the _DNS_ section of the Cloudflare API
- [Update DNS Settings](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/methods/edit/)
- [Show DNS Settings](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/methods/get/)
- [Create Internal DNS View](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/subresources/views/methods/create/)
- [Delete Internal DNS View](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/subresources/views/methods/delete/)
- [Update Internal DNS View](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/subresources/views/methods/edit/)
- [DNS Internal View Details](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/subresources/views/methods/get/)
- [List Internal DNS Views](https://developers.cloudflare.com/api/resources/dns/subresources/settings/subresources/account/subresources/views/methods/list/)
##### [Zone]

View File

@@ -0,0 +1,34 @@
namespace AMWD.Net.Api.Cloudflare.Dns
{
/// <summary>
/// Represents a request to create an internal DNS view.
/// </summary>
public class CreateInternalDnsViewRequest
{
/// <summary>
/// Initializes a new instance of the <see cref="CreateInternalDnsViewRequest"/> class.
/// </summary>
/// <param name="accountId">The account identifier.</param>
/// <param name="name">The name of the view.</param>
public CreateInternalDnsViewRequest(string accountId, string name)
{
AccountId = accountId;
Name = name;
}
/// <summary>
/// The account identifier.
/// </summary>
public string AccountId { get; set; }
/// <summary>
/// The name of the view.
/// </summary>
public string Name { get; set; }
/// <summary>
/// The list of zones linked to this view.
/// </summary>
public IReadOnlyCollection<string> ZoneIds { get; set; } = [];
}
}

View File

@@ -0,0 +1,25 @@
namespace AMWD.Net.Api.Cloudflare.Dns
{
/// <summary>
/// Represents a request to update an internal DNS view.
/// </summary>
public class UpdateInternalDnsViewRequest : CreateInternalDnsViewRequest
{
/// <summary>
/// Initializes a new instance of the <see cref="UpdateInternalDnsViewRequest"/> class.
/// </summary>
/// <param name="accountId">The account identifier.</param>
/// <param name="viewId">The view identifier.</param>
/// <param name="name">The name of the view.</param>
public UpdateInternalDnsViewRequest(string accountId, string viewId, string name)
: base(accountId, name)
{
ViewId = viewId;
}
/// <summary>
/// The view identifier.
/// </summary>
public string ViewId { get; set; }
}
}