diff --git a/src/Resend/IResend.cs b/src/Resend/IResend.cs index 3829657..512c18a 100644 --- a/src/Resend/IResend.cs +++ b/src/Resend/IResend.cs @@ -955,6 +955,15 @@ public interface IResend /// Segment. Task> SegmentRetrieveAsync( Guid segmentId, CancellationToken cancellationToken = default ); + /// + /// Updates a segment. + /// + /// Segment identifier. + /// Segment data. + /// Cancelation token. + /// Updated segment. + Task> SegmentUpdateAsync( Guid segmentId, SegmentData segment, CancellationToken cancellationToken = default ); + /// /// Deletes a segment. /// diff --git a/src/Resend/README.md b/src/Resend/README.md index eedbb22..1f224a0 100644 --- a/src/Resend/README.md +++ b/src/Resend/README.md @@ -20,7 +20,7 @@ The `ResendClient` supports the following objects (and methods): * Broadcast (List, Add, Retrieve, Update, Send, Schedule, Delete) * Audience (List, Add, Retrieve, Delete) * Contact (List, Add, Retrieve, Update, Delete) -* Segment (List, Create, Retrieve, Delete) +* Segment (List, Create, Retrieve, Update, Delete) * Topics (List, Create, Retrieve, Update, Delete) * Templates (List, Create, Retrieve, Update, Delete, Publish, Duplicate) * Webhooks (List, Create, Retrieve, Update, Delete) diff --git a/src/Resend/ResendClient.Segments.cs b/src/Resend/ResendClient.Segments.cs index fe6232d..4cf1a68 100644 --- a/src/Resend/ResendClient.Segments.cs +++ b/src/Resend/ResendClient.Segments.cs @@ -54,6 +54,17 @@ public partial class ResendClient } + /// + public Task> SegmentUpdateAsync( Guid segmentId, SegmentData segment, CancellationToken cancellationToken = default ) + { + var path = $"/segments/{segmentId}"; + var req = new HttpRequestMessage( HttpMethod.Patch, path ); + req.Content = JsonContent.Create( segment ); + + return Execute( req, ( x ) => x, cancellationToken ); + } + + /// public Task SegmentDeleteAsync( Guid segmentId, CancellationToken cancellationToken = default ) { diff --git a/src/Resend/SegmentUpdateResult.cs b/src/Resend/SegmentUpdateResult.cs new file mode 100644 index 0000000..feab3cd --- /dev/null +++ b/src/Resend/SegmentUpdateResult.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; + +namespace Resend; + +/// +/// Result of updating a segment. +/// +public class SegmentUpdateResult +{ + /// + /// Object type discriminator. + /// + [JsonPropertyName( "object" )] + public string Object { get; set; } = default!; + + /// + /// Segment identifier. + /// + [JsonPropertyName( "id" )] + public Guid Id { get; set; } +} diff --git a/tests/Resend.Tests/ResendClientTests.Segment.cs b/tests/Resend.Tests/ResendClientTests.Segment.cs new file mode 100644 index 0000000..ceec126 --- /dev/null +++ b/tests/Resend.Tests/ResendClientTests.Segment.cs @@ -0,0 +1,21 @@ +namespace Resend.Tests; + +/// +public partial class ResendClientTests +{ + /// + [Fact] + public async Task SegmentUpdate() + { + var segmentId = Guid.NewGuid(); + + var resp = await _resend.SegmentUpdateAsync( segmentId, new SegmentData() + { + Name = "Renamed segment", + } ); + + Assert.NotNull( resp ); + Assert.NotNull( resp.Content ); + Assert.Equal( segmentId, resp.Content.Id ); + } +} diff --git a/tools/Resend.ApiServer/Controllers/SegmentController.cs b/tools/Resend.ApiServer/Controllers/SegmentController.cs new file mode 100644 index 0000000..96ae731 --- /dev/null +++ b/tools/Resend.ApiServer/Controllers/SegmentController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Resend.ApiServer.Controllers; + +/// +[ApiController] +public class SegmentController : ControllerBase +{ + private readonly ILogger _logger; + + + /// + public SegmentController( ILogger logger ) + { + _logger = logger; + } + + + /// + [HttpPatch] + [Route( "segments/{id}" )] + public SegmentUpdateResult SegmentUpdate( [FromRoute] Guid id, [FromBody] SegmentData data ) + { + _logger.LogDebug( "SegmentUpdate" ); + + return new SegmentUpdateResult() + { + Object = "segment", + Id = id, + }; + } +} diff --git a/tools/Resend.Cli/Segment/SegmentUpdateCommand.cs b/tools/Resend.Cli/Segment/SegmentUpdateCommand.cs new file mode 100644 index 0000000..493944f --- /dev/null +++ b/tools/Resend.Cli/Segment/SegmentUpdateCommand.cs @@ -0,0 +1,42 @@ +using McMaster.Extensions.CommandLineUtils; +using System.ComponentModel.DataAnnotations; + +namespace Resend.Cli.Segment; + +/// +[Command( "update", Description = "Update a segment" )] +public class SegmentUpdateCommand +{ + private readonly IResend _resend; + + /// + [Argument( 0, Description = "Segment identifier" )] + [Required] + public Guid? SegmentId { get; set; } + + /// + [Argument( 1, Description = "Segment name" )] + [Required] + public string? Name { get; set; } + + + /// + public SegmentUpdateCommand( IResend resend ) + { + _resend = resend; + } + + + /// + public async Task OnExecuteAsync() + { + var data = new SegmentData() + { + Name = this.Name!, + }; + + await _resend.SegmentUpdateAsync( this.SegmentId!.Value, data ); + + return 0; + } +} diff --git a/tools/Resend.Cli/SegmentCommand.cs b/tools/Resend.Cli/SegmentCommand.cs index 766c954..0737489 100644 --- a/tools/Resend.Cli/SegmentCommand.cs +++ b/tools/Resend.Cli/SegmentCommand.cs @@ -8,6 +8,7 @@ namespace Resend.Cli; [Subcommand( typeof( Segment.SegmentDeleteCommand ) )] [Subcommand( typeof( Segment.SegmentListCommand ) )] [Subcommand( typeof( Segment.SegmentRetrieveCommand ) )] +[Subcommand( typeof( Segment.SegmentUpdateCommand ) )] public class SegmentCommand { ///