Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Resend/Domain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public class Domain
/// Validation status.
/// </summary>
[JsonPropertyName( "status" )]
public ValidationStatus Status { get; set; }
public DomainStatus Status { get; set; }

/// <summary>
/// Moment when the domain was created.
Expand Down
2 changes: 1 addition & 1 deletion src/Resend/DomainRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ public class DomainRecord
/// Validation status of individual DNS record.
/// </summary>
[JsonPropertyName( "status" )]
public ValidationStatus Status { get; set; }
public DomainRecordStatus Status { get; set; }
}
49 changes: 49 additions & 0 deletions src/Resend/DomainRecordStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System.Text.Json.Serialization;

namespace Resend;

/// <summary />
/// <see href="https://resend.com/docs/dashboard/domains/introduction#understand-a-domain-status" />
/// <see href="https://github.com/resend/resend-node/blob/canary/src/domains/interfaces/domain.ts" />
[JsonConverter( typeof( JsonStringEnumValueConverter<DomainRecordStatus> ) )]
public enum DomainRecordStatus
{
/// <summary>
/// Record validation hasn't been explicitly requested.
/// </summary>
[JsonStringValue( "not_started" )]
NotStarted,

/// <summary>
/// Record validation has been started and is currently executing.
/// </summary>
[JsonStringValue( "pending" )]
Pending,

/// <summary>
/// Record validation has failed: Resend was unable to detect the
/// necessary DNS record within 72h.
/// </summary>
[JsonStringValue( "failed" )]
Failed,

/// <summary>
/// Previously verified DNS record no longer resolves.
/// </summary>
/// <remarks>
/// For a previously verified record, Resend will periodically check for the DNS
/// record required for verification. If at some point, Resend is unable to detect
/// the record, the status would change to “<see cref="TemporaryFailure" />”. Resend will
/// recheck for the DNS record for 72 hours, and if it’s unable to detect the
/// record, the record status would change to “<see cref="Failed" />”. If it’s able to detect
/// the record, the record status would change to “<see cref="Verified"/>”.
/// </remarks>
[JsonStringValue( "temporary_failure" )]
TemporaryFailure,

/// <summary>
/// DNS record is successfully verified.
/// </summary>
[JsonStringValue( "verified" )]
Verified,
}
56 changes: 56 additions & 0 deletions src/Resend/DomainStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using System.Text.Json.Serialization;

namespace Resend;

/// <summary />
/// <see href="https://resend.com/docs/dashboard/domains/introduction#understand-a-domain-status" />
/// <see href="https://github.com/resend/resend-node/blob/canary/src/domains/interfaces/domain.ts" />
[JsonConverter( typeof( JsonStringEnumValueConverter<DomainStatus> ) )]
public enum DomainStatus
{
/// <summary>
/// Domain has been created, but validation hasn't been explicitly requested.
/// </summary>
/// <remarks>
/// Validation can be initiated by calling the <see cref="IResend.DomainVerifyAsync(Guid, CancellationToken)"/>
/// method.
/// </remarks>
[JsonStringValue( "not_started" )]
NotStarted,

/// <summary>
/// Validation has been started and is currently executing.
/// </summary>
/// <remarks>
/// May take up to 72h to conclude.
/// </remarks>
[JsonStringValue( "pending" )]
Pending,

/// <summary>
/// Validation has failed: Resend was unable to detect necessary DNS
/// records within 72h.
/// </summary>
[JsonStringValue( "failed" )]
Failed,

/// <summary>
/// Domain is successfully verified for sending in Resend.
/// </summary>
[JsonStringValue( "verified" )]
Verified,

/// <summary>
/// Domain is partially verified: some capabilities (for example,
/// sending) are verified while others are still pending.
/// </summary>
[JsonStringValue( "partially_verified" )]
PartiallyVerified,

/// <summary>
/// Domain is partially failed: some capabilities are verified while
/// others have failed validation.
/// </summary>
[JsonStringValue( "partially_failed" )]
PartiallyFailed,
}
54 changes: 53 additions & 1 deletion tests/Resend.Tests/DomainTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,59 @@ public void Domain_deserializes_tracking_caa_record()
Assert.Equal( "0 issue \"amazon.com\"", trackingCaa.Value );
Assert.Equal( "CAA", trackingCaa.RecordType );
Assert.Equal( "Auto", trackingCaa.TimeToLive );
Assert.Equal( ValidationStatus.Verified, trackingCaa.Status );
Assert.Equal( DomainRecordStatus.Verified, trackingCaa.Status );
}


/// <summary />
[Fact]
public void Domain_deserializes_partially_verified_status()
{
const string json = """
{
"id": "fd61172c-cafc-40f5-b049-b45947779a29",
"name": "resend.com",
"status": "partially_verified",
"created_at": "2023-06-21T06:10:36.144Z",
"region": "us-east-1",
"click_tracking": true,
"tracking_subdomain": "track",
"capabilities": {
"sending": "enabled",
"receiving": "disabled"
},
"records": []
}
""";

var domain = JsonSerializer.Deserialize<Domain>( json );
Assert.NotNull( domain );
Assert.Equal( DomainStatus.PartiallyVerified, domain!.Status );
}


/// <summary />
[Fact]
public void Domain_deserializes_partially_failed_status()
{
const string json = """
{
"id": "fd61172c-cafc-40f5-b049-b45947779a29",
"name": "resend.com",
"status": "partially_failed",
"created_at": "2023-06-21T06:10:36.144Z",
"region": "us-east-1",
"capabilities": {
"sending": "enabled",
"receiving": "enabled"
},
"records": []
}
""";

var domain = JsonSerializer.Deserialize<Domain>( json );
Assert.NotNull( domain );
Assert.Equal( DomainStatus.PartiallyFailed, domain!.Status );
}


Expand Down
12 changes: 6 additions & 6 deletions tools/Resend.ApiServer/Controllers/DomainController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public Domain DomainAdd( [FromBody] DomainAddData request )
Id = Guid.NewGuid(),
Name = "example.com",
Region = DeliveryRegion.UsEast1,
Status = ValidationStatus.NotStarted,
Status = DomainStatus.NotStarted,
MomentCreated = DateTime.UtcNow,
Records = new List<DomainRecord>()
{
Expand All @@ -39,7 +39,7 @@ public Domain DomainAdd( [FromBody] DomainAddData request )
RecordType = "TXT",
Name = "bounces",
TimeToLive = "Auto",
Status = ValidationStatus.NotStarted,
Status = DomainRecordStatus.NotStarted,
Value = "feedback-smtp.us-east-1.amazonses.com",
},
},
Expand All @@ -59,7 +59,7 @@ public Domain DomainRetrieve( [FromRoute] Guid id )
Id = id,
Name = "example.com",
Region = DeliveryRegion.UsEast1,
Status = ValidationStatus.NotStarted,
Status = DomainStatus.NotStarted,
MomentCreated = DateTime.UtcNow,
Records = new List<DomainRecord>()
{
Expand All @@ -69,7 +69,7 @@ public Domain DomainRetrieve( [FromRoute] Guid id )
RecordType = "TXT",
Name = "bounces",
TimeToLive = "Auto",
Status = ValidationStatus.NotStarted,
Status = DomainRecordStatus.NotStarted,
Value = "feedback-smtp.us-east-1.amazonses.com",
},
},
Expand Down Expand Up @@ -123,15 +123,15 @@ public ListOf<Domain> DomainList()
Id = Guid.NewGuid(),
Name = "example.com",
Region = DeliveryRegion.UsEast1,
Status = ValidationStatus.NotStarted,
Status = DomainStatus.NotStarted,
MomentCreated = DateTime.UtcNow,
},
new Domain()
{
Id = Guid.NewGuid(),
Name = "amazing.com",
Region = DeliveryRegion.EuWest1,
Status = ValidationStatus.Pending,
Status = DomainStatus.Pending,
MomentCreated = DateTime.UtcNow,
}
},
Expand Down
Loading