From 1c8c27ad84f1b9dbe607bcb6e440df2abc76f60e Mon Sep 17 00:00:00 2001 From: dielduarte Date: Mon, 10 Aug 2026 15:46:41 -0300 Subject: [PATCH 1/2] feat: add broadcasts.cancel() method Cancels a queued or scheduled broadcast via POST /broadcasts/:id/cancel, mirroring emails.cancel()'s request shape (empty body). Co-Authored-By: Claude Sonnet 5 --- .../services/broadcasts/Broadcasts.java | 11 ++++++++++ .../model/CancelBroadcastResponseSuccess.java | 21 +++++++++++++++++++ .../services/broadcasts/BroadcastsTest.java | 17 +++++++++++++++ .../resend/services/util/BroadcastsUtil.java | 4 ++++ 4 files changed, 53 insertions(+) create mode 100644 src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java diff --git a/src/main/java/com/resend/services/broadcasts/Broadcasts.java b/src/main/java/com/resend/services/broadcasts/Broadcasts.java index 7723067..7397f54 100644 --- a/src/main/java/com/resend/services/broadcasts/Broadcasts.java +++ b/src/main/java/com/resend/services/broadcasts/Broadcasts.java @@ -86,6 +86,17 @@ public SendBroadcastResponseSuccess send(SendBroadcastOptions sendBroadcastOptio return resendMapper.readValue(responseBody, SendBroadcastResponseSuccess.class); } + public CancelBroadcastResponseSuccess cancel(String id) throws ResendException { + AbstractHttpResponse response = httpClient.perform("/broadcasts/" + id + "/cancel", super.apiKey, HttpMethod.POST, "", MediaType.get("application/json")); + + if (!response.isSuccessful()) { + throw new ResendException(response.getCode(), response.getBody()); + } + + String responseBody = response.getBody(); + return resendMapper.readValue(responseBody, CancelBroadcastResponseSuccess.class); + } + /** * Deletes a broadcast based on the provided broadcast ID. * diff --git a/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java b/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java new file mode 100644 index 0000000..55c4218 --- /dev/null +++ b/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java @@ -0,0 +1,21 @@ +package com.resend.services.broadcasts.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CancelBroadcastResponseSuccess extends BaseBroadcastResponse { + @JsonProperty("object") + private String object; + + public CancelBroadcastResponseSuccess() { + + } + + public CancelBroadcastResponseSuccess(String id, String object) { + super(id); + this.object = object; + } + + public String getObject() { + return object; + } +} diff --git a/src/test/java/com/resend/services/broadcasts/BroadcastsTest.java b/src/test/java/com/resend/services/broadcasts/BroadcastsTest.java index f88acf7..52bbb66 100644 --- a/src/test/java/com/resend/services/broadcasts/BroadcastsTest.java +++ b/src/test/java/com/resend/services/broadcasts/BroadcastsTest.java @@ -42,6 +42,9 @@ public class BroadcastsTest { private static final String REMOVE_RESPONSE_JSON = "{\"id\":\"" + GET_BROADCAST_ID + "\",\"object\":\"object\",\"deleted\":true}"; + private static final String CANCEL_RESPONSE_JSON = + "{\"id\":\"" + GET_BROADCAST_ID + "\",\"object\":\"broadcast\"}"; + private static final String LIST_RESPONSE_JSON = "{\"object\":\"list\",\"has_more\":true,\"data\":[" + "{\"id\":\"1\",\"audience_id\":\"" + AUDIENCE_ID + "\",\"status\":\"draft\",\"created_at\":\"2024-12-01 19:32:22.98+00\"}," + @@ -136,6 +139,20 @@ public void testDeleteBroadcast_Success() throws ResendException { assertTrue(response.isDeleted()); } + @Test + public void testCancelBroadcast_Success() throws ResendException { + AbstractHttpResponse httpResponse = new AbstractHttpResponse<>(200, CANCEL_RESPONSE_JSON, true); + + when(httpClient.perform(eq("/broadcasts/" + GET_BROADCAST_ID + "/cancel"), anyString(), eq(HttpMethod.POST), eq(""), any(MediaType.class))) + .thenReturn(httpResponse); + + CancelBroadcastResponseSuccess response = broadcasts.cancel(GET_BROADCAST_ID); + + assertNotNull(response); + assertEquals(GET_BROADCAST_ID, response.getId()); + assertEquals("broadcast", response.getObject()); + } + @Test public void testListBroadcasts_Success() throws ResendException { AbstractHttpResponse httpResponse = new AbstractHttpResponse<>(200, LIST_RESPONSE_JSON, true); diff --git a/src/test/java/com/resend/services/util/BroadcastsUtil.java b/src/test/java/com/resend/services/util/BroadcastsUtil.java index e5e818e..baf87ae 100644 --- a/src/test/java/com/resend/services/util/BroadcastsUtil.java +++ b/src/test/java/com/resend/services/util/BroadcastsUtil.java @@ -70,6 +70,10 @@ public static RemoveBroadcastResponseSuccess removeBroadcastResponseSuccess() { return new RemoveBroadcastResponseSuccess("559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "object",true); } + public static CancelBroadcastResponseSuccess cancelBroadcastResponseSuccess() { + return new CancelBroadcastResponseSuccess("559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "broadcast"); + } + public static ListBroadcastsResponseSuccess createBroadcastsListResponse() { List broadcastList = new ArrayList<>(); From 38ddedbf38cd83493c696b3870c27ae5dee29358 Mon Sep 17 00:00:00 2001 From: dielduarte Date: Wed, 12 Aug 2026 09:14:06 -0300 Subject: [PATCH 2/2] docs: add JavaDoc to cancel() and CancelBroadcastResponseSuccess Required for the release signing process. Also removes the unused cancelBroadcastResponseSuccess() test helper (cubic). --- .../resend/services/broadcasts/Broadcasts.java | 7 +++++++ .../model/CancelBroadcastResponseSuccess.java | 18 ++++++++++++++++++ .../resend/services/util/BroadcastsUtil.java | 4 ---- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/resend/services/broadcasts/Broadcasts.java b/src/main/java/com/resend/services/broadcasts/Broadcasts.java index 7397f54..945ec9f 100644 --- a/src/main/java/com/resend/services/broadcasts/Broadcasts.java +++ b/src/main/java/com/resend/services/broadcasts/Broadcasts.java @@ -86,6 +86,13 @@ public SendBroadcastResponseSuccess send(SendBroadcastOptions sendBroadcastOptio return resendMapper.readValue(responseBody, SendBroadcastResponseSuccess.class); } + /** + * Cancels a queued or scheduled broadcast. + * + * @param id The unique identifier of the broadcast to cancel. + * @return The CancelBroadcastResponseSuccess with the details of the canceled broadcast. + * @throws ResendException If an error occurs during the broadcast cancellation process. + */ public CancelBroadcastResponseSuccess cancel(String id) throws ResendException { AbstractHttpResponse response = httpClient.perform("/broadcasts/" + id + "/cancel", super.apiKey, HttpMethod.POST, "", MediaType.get("application/json")); diff --git a/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java b/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java index 55c4218..b5c4280 100644 --- a/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java +++ b/src/main/java/com/resend/services/broadcasts/model/CancelBroadcastResponseSuccess.java @@ -2,19 +2,37 @@ import com.fasterxml.jackson.annotation.JsonProperty; +/** + * Represents the response for a successful broadcast cancellation. + * Extends the BaseBroadcastResponse class. + */ public class CancelBroadcastResponseSuccess extends BaseBroadcastResponse { @JsonProperty("object") private String object; + /** + * Default constructor + */ public CancelBroadcastResponseSuccess() { } + /** + * Constructs a successful response for cancelling a broadcast. + * + * @param id The ID of the broadcast. + * @param object The object of the broadcast. + */ public CancelBroadcastResponseSuccess(String id, String object) { super(id); this.object = object; } + /** + * Get the object. + * + * @return The type of the data. + */ public String getObject() { return object; } diff --git a/src/test/java/com/resend/services/util/BroadcastsUtil.java b/src/test/java/com/resend/services/util/BroadcastsUtil.java index baf87ae..e5e818e 100644 --- a/src/test/java/com/resend/services/util/BroadcastsUtil.java +++ b/src/test/java/com/resend/services/util/BroadcastsUtil.java @@ -70,10 +70,6 @@ public static RemoveBroadcastResponseSuccess removeBroadcastResponseSuccess() { return new RemoveBroadcastResponseSuccess("559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "object",true); } - public static CancelBroadcastResponseSuccess cancelBroadcastResponseSuccess() { - return new CancelBroadcastResponseSuccess("559ac32e-9ef5-46fb-82a1-b76b840c0f7b", "broadcast"); - } - public static ListBroadcastsResponseSuccess createBroadcastsListResponse() { List broadcastList = new ArrayList<>();