From eabc7c882c5f9cd7a683d5856a30b8c9bc9efd2f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Jul 2026 19:05:17 +0000 Subject: [PATCH 1/4] feat: add message_id typing for emails and webhook events - Add message_id field to Email model for GET /emails/:id and list responses - Add typed webhook event payload models with message_id in BaseEmailEventData and ReceivedEmailEventData, matching the Node.js SDK structure - Update Webhooks.verify() to return the parsed WebhookEventPayload - Add email.scheduled and email.suppressed to WebhookEvent enum Co-authored-by: cpenned --- .../resend/services/emails/model/Email.java | 19 ++ .../resend/services/webhooks/Webhooks.java | 6 +- .../services/webhooks/model/WebhookEvent.java | 4 + .../model/events/BaseEmailEventData.java | 206 ++++++++++++++++ .../model/events/ContactCreatedEvent.java | 36 +++ .../model/events/ContactDeletedEvent.java | 36 +++ .../model/events/ContactEventData.java | 205 ++++++++++++++++ .../model/events/ContactUpdatedEvent.java | 36 +++ .../model/events/DomainCreatedEvent.java | 36 +++ .../model/events/DomainDeletedEvent.java | 36 +++ .../model/events/DomainEventData.java | 143 +++++++++++ .../model/events/DomainUpdatedEvent.java | 36 +++ .../webhooks/model/events/EmailBounce.java | 78 ++++++ .../model/events/EmailBouncedEvent.java | 36 +++ .../model/events/EmailBouncedEventData.java | 36 +++ .../webhooks/model/events/EmailClick.java | 99 ++++++++ .../model/events/EmailClickedEvent.java | 36 +++ .../model/events/EmailClickedEventData.java | 36 +++ .../model/events/EmailComplainedEvent.java | 36 +++ .../model/events/EmailDeliveredEvent.java | 36 +++ .../events/EmailDeliveryDelayedEvent.java | 36 +++ .../model/events/EmailFailedDetails.java | 36 +++ .../model/events/EmailFailedEvent.java | 36 +++ .../model/events/EmailFailedEventData.java | 36 +++ .../model/events/EmailOpenedEvent.java | 36 +++ .../model/events/EmailReceivedEvent.java | 36 +++ .../model/events/EmailScheduledEvent.java | 36 +++ .../webhooks/model/events/EmailSentEvent.java | 36 +++ .../model/events/EmailSuppressedDetails.java | 57 +++++ .../model/events/EmailSuppressedEvent.java | 36 +++ .../events/EmailSuppressedEventData.java | 36 +++ .../model/events/ReceivedEmailEventData.java | 227 ++++++++++++++++++ .../model/events/WebhookEventPayload.java | 84 +++++++ .../resend/services/emails/EmailsTest.java | 4 +- .../services/webhooks/WebhooksTest.java | 100 ++++++++ 35 files changed, 2022 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClick.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java create mode 100644 src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java diff --git a/src/main/java/com/resend/services/emails/model/Email.java b/src/main/java/com/resend/services/emails/model/Email.java index f6956f0..03fb4e1 100644 --- a/src/main/java/com/resend/services/emails/model/Email.java +++ b/src/main/java/com/resend/services/emails/model/Email.java @@ -43,6 +43,9 @@ public class Email { @JsonProperty("last_event") private String lastEvent; + @JsonProperty("message_id") + private String messageId; + /** * Default constructor. */ @@ -273,5 +276,21 @@ public String getLastEvent() { public void setLastEvent(String lastEvent) { this.lastEvent = lastEvent; } + + /** + * Get the RFC Message-ID header value for the email. + * @return The message ID. + */ + public String getMessageId() { + return messageId; + } + + /** + * Set the RFC Message-ID header value for the email. + * @param messageId The message ID. + */ + public void setMessageId(String messageId) { + this.messageId = messageId; + } } diff --git a/src/main/java/com/resend/services/webhooks/Webhooks.java b/src/main/java/com/resend/services/webhooks/Webhooks.java index 6cfc071..27ab520 100644 --- a/src/main/java/com/resend/services/webhooks/Webhooks.java +++ b/src/main/java/com/resend/services/webhooks/Webhooks.java @@ -15,6 +15,7 @@ import com.resend.services.webhooks.model.UpdateWebhookResponseSuccess; import com.resend.services.webhooks.model.GetWebhookResponseSuccess; import com.resend.services.webhooks.model.VerifyWebhookOptions; +import com.resend.services.webhooks.model.events.WebhookEventPayload; import okhttp3.MediaType; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -156,9 +157,10 @@ public RemoveWebhookResponseSuccess remove(String webhookId) throws ResendExcept * replay attacks. * * @param options The verification options containing payload, headers, and secret. + * @return The verified and parsed webhook event payload. * @throws ResendException If the signature is invalid or the timestamp is outside the tolerance window. */ - public void verify(VerifyWebhookOptions options) throws ResendException { + public WebhookEventPayload verify(VerifyWebhookOptions options) throws ResendException { if (options == null) { throw new ResendException(400, "VerifyWebhookOptions cannot be null"); } @@ -250,6 +252,8 @@ public void verify(VerifyWebhookOptions options) throws ResendException { throw new ResendException(401, "Webhook signature verification failed"); } + return resendMapper.readValue(options.getPayload(), WebhookEventPayload.class); + } catch (ResendException e) { throw e; } catch (Exception e) { diff --git a/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java b/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java index db79f5a..44c1988 100644 --- a/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java +++ b/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java @@ -8,6 +8,8 @@ public enum WebhookEvent { /** Triggered when an email is sent. */ EMAIL_SENT("email.sent"), + /** Triggered when an email is scheduled. */ + EMAIL_SCHEDULED("email.scheduled"), /** Triggered when an email is delivered. */ EMAIL_DELIVERED("email.delivered"), /** Triggered when an email delivery is delayed. */ @@ -24,6 +26,8 @@ public enum WebhookEvent { EMAIL_RECEIVED("email.received"), /** Triggered when an email fails to send. */ EMAIL_FAILED("email.failed"), + /** Triggered when an email is suppressed. */ + EMAIL_SUPPRESSED("email.suppressed"), /** Triggered when a contact is created. */ CONTACT_CREATED("contact.created"), /** Triggered when a contact is updated. */ diff --git a/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java b/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java new file mode 100644 index 0000000..6684a98 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java @@ -0,0 +1,206 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.Map; + +/** + * Base data payload for outbound email webhook events. + */ +public class BaseEmailEventData { + + @JsonProperty("broadcast_id") + private String broadcastId; + + @JsonProperty("created_at") + private String createdAt; + + @JsonProperty("email_id") + private String emailId; + + @JsonProperty("message_id") + private String messageId; + + @JsonProperty("from") + private String from; + + @JsonProperty("to") + private List to; + + @JsonProperty("subject") + private String subject; + + @JsonProperty("template_id") + private String templateId; + + @JsonProperty("tags") + private Map tags; + + /** + * Default constructor. + */ + public BaseEmailEventData() { + } + + /** + * Gets the broadcast ID. + * + * @return The broadcast ID. + */ + public String getBroadcastId() { + return broadcastId; + } + + /** + * Sets the broadcast ID. + * + * @param broadcastId The broadcast ID. + */ + public void setBroadcastId(String broadcastId) { + this.broadcastId = broadcastId; + } + + /** + * Gets the creation timestamp. + * + * @return The creation timestamp. + */ + public String getCreatedAt() { + return createdAt; + } + + /** + * Sets the creation timestamp. + * + * @param createdAt The creation timestamp. + */ + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the email ID. + * + * @return The email ID. + */ + public String getEmailId() { + return emailId; + } + + /** + * Sets the email ID. + * + * @param emailId The email ID. + */ + public void setEmailId(String emailId) { + this.emailId = emailId; + } + + /** + * Gets the RFC Message-ID header value. + * + * @return The message ID. + */ + public String getMessageId() { + return messageId; + } + + /** + * Sets the RFC Message-ID header value. + * + * @param messageId The message ID. + */ + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + /** + * Gets the sender email address. + * + * @return The sender email address. + */ + public String getFrom() { + return from; + } + + /** + * Sets the sender email address. + * + * @param from The sender email address. + */ + public void setFrom(String from) { + this.from = from; + } + + /** + * Gets the recipient email addresses. + * + * @return The recipient email addresses. + */ + public List getTo() { + return to; + } + + /** + * Sets the recipient email addresses. + * + * @param to The recipient email addresses. + */ + public void setTo(List to) { + this.to = to; + } + + /** + * Gets the email subject. + * + * @return The email subject. + */ + public String getSubject() { + return subject; + } + + /** + * Sets the email subject. + * + * @param subject The email subject. + */ + public void setSubject(String subject) { + this.subject = subject; + } + + /** + * Gets the template ID. + * + * @return The template ID. + */ + public String getTemplateId() { + return templateId; + } + + /** + * Sets the template ID. + * + * @param templateId The template ID. + */ + public void setTemplateId(String templateId) { + this.templateId = templateId; + } + + /** + * Gets the email tags. + * + * @return The email tags. + */ + public Map getTags() { + return tags; + } + + /** + * Sets the email tags. + * + * @param tags The email tags. + */ + public void setTags(Map tags) { + this.tags = tags; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java new file mode 100644 index 0000000..18b3e1b --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a contact is created. + */ +public class ContactCreatedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private ContactEventData data; + + /** + * Default constructor. + */ + public ContactCreatedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public ContactEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(ContactEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java new file mode 100644 index 0000000..7f4f801 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a contact is deleted. + */ +public class ContactDeletedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private ContactEventData data; + + /** + * Default constructor. + */ + public ContactDeletedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public ContactEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(ContactEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java b/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java new file mode 100644 index 0000000..f4f3b3f --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java @@ -0,0 +1,205 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * Data payload for contact webhook events. + */ +public class ContactEventData { + + @JsonProperty("id") + private String id; + + @JsonProperty("audience_id") + private String audienceId; + + @JsonProperty("segment_ids") + private List segmentIds; + + @JsonProperty("created_at") + private String createdAt; + + @JsonProperty("updated_at") + private String updatedAt; + + @JsonProperty("email") + private String email; + + @JsonProperty("first_name") + private String firstName; + + @JsonProperty("last_name") + private String lastName; + + @JsonProperty("unsubscribed") + private Boolean unsubscribed; + + /** + * Default constructor. + */ + public ContactEventData() { + } + + /** + * Gets the contact ID. + * + * @return The contact ID. + */ + public String getId() { + return id; + } + + /** + * Sets the contact ID. + * + * @param id The contact ID. + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the audience ID. + * + * @return The audience ID. + */ + public String getAudienceId() { + return audienceId; + } + + /** + * Sets the audience ID. + * + * @param audienceId The audience ID. + */ + public void setAudienceId(String audienceId) { + this.audienceId = audienceId; + } + + /** + * Gets the segment IDs. + * + * @return The segment IDs. + */ + public List getSegmentIds() { + return segmentIds; + } + + /** + * Sets the segment IDs. + * + * @param segmentIds The segment IDs. + */ + public void setSegmentIds(List segmentIds) { + this.segmentIds = segmentIds; + } + + /** + * Gets the creation timestamp. + * + * @return The creation timestamp. + */ + public String getCreatedAt() { + return createdAt; + } + + /** + * Sets the creation timestamp. + * + * @param createdAt The creation timestamp. + */ + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the update timestamp. + * + * @return The update timestamp. + */ + public String getUpdatedAt() { + return updatedAt; + } + + /** + * Sets the update timestamp. + * + * @param updatedAt The update timestamp. + */ + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * Gets the contact email address. + * + * @return The contact email address. + */ + public String getEmail() { + return email; + } + + /** + * Sets the contact email address. + * + * @param email The contact email address. + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * Gets the contact first name. + * + * @return The contact first name. + */ + public String getFirstName() { + return firstName; + } + + /** + * Sets the contact first name. + * + * @param firstName The contact first name. + */ + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * Gets the contact last name. + * + * @return The contact last name. + */ + public String getLastName() { + return lastName; + } + + /** + * Sets the contact last name. + * + * @param lastName The contact last name. + */ + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * Gets whether the contact is unsubscribed. + * + * @return Whether the contact is unsubscribed. + */ + public Boolean getUnsubscribed() { + return unsubscribed; + } + + /** + * Sets whether the contact is unsubscribed. + * + * @param unsubscribed Whether the contact is unsubscribed. + */ + public void setUnsubscribed(Boolean unsubscribed) { + this.unsubscribed = unsubscribed; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java new file mode 100644 index 0000000..ceac523 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a contact is updated. + */ +public class ContactUpdatedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private ContactEventData data; + + /** + * Default constructor. + */ + public ContactUpdatedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public ContactEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(ContactEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java new file mode 100644 index 0000000..2149f42 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a domain is created. + */ +public class DomainCreatedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private DomainEventData data; + + /** + * Default constructor. + */ + public DomainCreatedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public DomainEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(DomainEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java new file mode 100644 index 0000000..d5f1ab5 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a domain is deleted. + */ +public class DomainDeletedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private DomainEventData data; + + /** + * Default constructor. + */ + public DomainDeletedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public DomainEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(DomainEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java b/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java new file mode 100644 index 0000000..e23a6d5 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java @@ -0,0 +1,143 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.resend.services.domains.model.Record; +import java.util.List; + +/** + * Data payload for domain webhook events. + */ +public class DomainEventData { + + @JsonProperty("id") + private String id; + + @JsonProperty("name") + private String name; + + @JsonProperty("status") + private String status; + + @JsonProperty("created_at") + private String createdAt; + + @JsonProperty("region") + private String region; + + @JsonProperty("records") + private List records; + + /** + * Default constructor. + */ + public DomainEventData() { + } + + /** + * Gets the domain ID. + * + * @return The domain ID. + */ + public String getId() { + return id; + } + + /** + * Sets the domain ID. + * + * @param id The domain ID. + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the domain name. + * + * @return The domain name. + */ + public String getName() { + return name; + } + + /** + * Sets the domain name. + * + * @param name The domain name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the domain status. + * + * @return The domain status. + */ + public String getStatus() { + return status; + } + + /** + * Sets the domain status. + * + * @param status The domain status. + */ + public void setStatus(String status) { + this.status = status; + } + + /** + * Gets the creation timestamp. + * + * @return The creation timestamp. + */ + public String getCreatedAt() { + return createdAt; + } + + /** + * Sets the creation timestamp. + * + * @param createdAt The creation timestamp. + */ + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the domain region. + * + * @return The domain region. + */ + public String getRegion() { + return region; + } + + /** + * Sets the domain region. + * + * @param region The domain region. + */ + public void setRegion(String region) { + this.region = region; + } + + /** + * Gets the domain DNS records. + * + * @return The domain DNS records. + */ + public List getRecords() { + return records; + } + + /** + * Sets the domain DNS records. + * + * @param records The domain DNS records. + */ + public void setRecords(List records) { + this.records = records; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java new file mode 100644 index 0000000..f535266 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a domain is updated. + */ +public class DomainUpdatedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private DomainEventData data; + + /** + * Default constructor. + */ + public DomainUpdatedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public DomainEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(DomainEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java new file mode 100644 index 0000000..d0c7159 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java @@ -0,0 +1,78 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Bounce details included in the {@code email.bounced} webhook event. + */ +public class EmailBounce { + + @JsonProperty("message") + private String message; + + @JsonProperty("subType") + private String subType; + + @JsonProperty("type") + private String type; + + /** + * Default constructor. + */ + public EmailBounce() { + } + + /** + * Gets the bounce message. + * + * @return The bounce message. + */ + public String getMessage() { + return message; + } + + /** + * Sets the bounce message. + * + * @param message The bounce message. + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Gets the bounce sub-type. + * + * @return The bounce sub-type. + */ + public String getSubType() { + return subType; + } + + /** + * Sets the bounce sub-type. + * + * @param subType The bounce sub-type. + */ + public void setSubType(String subType) { + this.subType = subType; + } + + /** + * Gets the bounce type. + * + * @return The bounce type. + */ + public String getType() { + return type; + } + + /** + * Sets the bounce type. + * + * @param type The bounce type. + */ + public void setType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java new file mode 100644 index 0000000..246d36a --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email bounces. + */ +public class EmailBouncedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private EmailBouncedEventData data; + + /** + * Default constructor. + */ + public EmailBouncedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public EmailBouncedEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(EmailBouncedEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java new file mode 100644 index 0000000..4c2c861 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Data payload for the {@code email.bounced} webhook event. + */ +public class EmailBouncedEventData extends BaseEmailEventData { + + @JsonProperty("bounce") + private EmailBounce bounce; + + /** + * Default constructor. + */ + public EmailBouncedEventData() { + } + + /** + * Gets the bounce details. + * + * @return The bounce details. + */ + public EmailBounce getBounce() { + return bounce; + } + + /** + * Sets the bounce details. + * + * @param bounce The bounce details. + */ + public void setBounce(EmailBounce bounce) { + this.bounce = bounce; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java new file mode 100644 index 0000000..e78993f --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java @@ -0,0 +1,99 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Click details included in the {@code email.clicked} webhook event. + */ +public class EmailClick { + + @JsonProperty("ipAddress") + private String ipAddress; + + @JsonProperty("link") + private String link; + + @JsonProperty("timestamp") + private String timestamp; + + @JsonProperty("userAgent") + private String userAgent; + + /** + * Default constructor. + */ + public EmailClick() { + } + + /** + * Gets the IP address of the click. + * + * @return The IP address. + */ + public String getIpAddress() { + return ipAddress; + } + + /** + * Sets the IP address of the click. + * + * @param ipAddress The IP address. + */ + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + /** + * Gets the clicked link URL. + * + * @return The link URL. + */ + public String getLink() { + return link; + } + + /** + * Sets the clicked link URL. + * + * @param link The link URL. + */ + public void setLink(String link) { + this.link = link; + } + + /** + * Gets the click timestamp. + * + * @return The click timestamp. + */ + public String getTimestamp() { + return timestamp; + } + + /** + * Sets the click timestamp. + * + * @param timestamp The click timestamp. + */ + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + /** + * Gets the user agent of the click. + * + * @return The user agent. + */ + public String getUserAgent() { + return userAgent; + } + + /** + * Sets the user agent of the click. + * + * @param userAgent The user agent. + */ + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java new file mode 100644 index 0000000..1636338 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when a link in an email is clicked. + */ +public class EmailClickedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private EmailClickedEventData data; + + /** + * Default constructor. + */ + public EmailClickedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public EmailClickedEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(EmailClickedEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java new file mode 100644 index 0000000..8214b54 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Data payload for the {@code email.clicked} webhook event. + */ +public class EmailClickedEventData extends BaseEmailEventData { + + @JsonProperty("click") + private EmailClick click; + + /** + * Default constructor. + */ + public EmailClickedEventData() { + } + + /** + * Gets the click details. + * + * @return The click details. + */ + public EmailClick getClick() { + return click; + } + + /** + * Sets the click details. + * + * @param click The click details. + */ + public void setClick(EmailClick click) { + this.click = click; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java new file mode 100644 index 0000000..715150d --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email complaint is received. + */ +public class EmailComplainedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailComplainedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java new file mode 100644 index 0000000..5751631 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email is delivered. + */ +public class EmailDeliveredEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailDeliveredEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java new file mode 100644 index 0000000..ff6d23d --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email delivery is delayed. + */ +public class EmailDeliveryDelayedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailDeliveryDelayedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java new file mode 100644 index 0000000..7edb69a --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Failure details included in the {@code email.failed} webhook event. + */ +public class EmailFailedDetails { + + @JsonProperty("reason") + private String reason; + + /** + * Default constructor. + */ + public EmailFailedDetails() { + } + + /** + * Gets the failure reason. + * + * @return The failure reason. + */ + public String getReason() { + return reason; + } + + /** + * Sets the failure reason. + * + * @param reason The failure reason. + */ + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java new file mode 100644 index 0000000..76ea0ce --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email fails to send. + */ +public class EmailFailedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private EmailFailedEventData data; + + /** + * Default constructor. + */ + public EmailFailedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public EmailFailedEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(EmailFailedEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java new file mode 100644 index 0000000..d85805a --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Data payload for the {@code email.failed} webhook event. + */ +public class EmailFailedEventData extends BaseEmailEventData { + + @JsonProperty("failed") + private EmailFailedDetails failed; + + /** + * Default constructor. + */ + public EmailFailedEventData() { + } + + /** + * Gets the failure details. + * + * @return The failure details. + */ + public EmailFailedDetails getFailed() { + return failed; + } + + /** + * Sets the failure details. + * + * @param failed The failure details. + */ + public void setFailed(EmailFailedDetails failed) { + this.failed = failed; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java new file mode 100644 index 0000000..d219b79 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email is opened. + */ +public class EmailOpenedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailOpenedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java new file mode 100644 index 0000000..8d749f9 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an inbound email is received. + */ +public class EmailReceivedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private ReceivedEmailEventData data; + + /** + * Default constructor. + */ + public EmailReceivedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public ReceivedEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(ReceivedEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java new file mode 100644 index 0000000..85670db --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email is scheduled. + */ +public class EmailScheduledEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailScheduledEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java new file mode 100644 index 0000000..e160022 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email is sent. + */ +public class EmailSentEvent extends WebhookEventPayload { + + @JsonProperty("data") + private BaseEmailEventData data; + + /** + * Default constructor. + */ + public EmailSentEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public BaseEmailEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(BaseEmailEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java new file mode 100644 index 0000000..a3d18e8 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java @@ -0,0 +1,57 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Suppression details included in the {@code email.suppressed} webhook event. + */ +public class EmailSuppressedDetails { + + @JsonProperty("message") + private String message; + + @JsonProperty("type") + private String type; + + /** + * Default constructor. + */ + public EmailSuppressedDetails() { + } + + /** + * Gets the suppression message. + * + * @return The suppression message. + */ + public String getMessage() { + return message; + } + + /** + * Sets the suppression message. + * + * @param message The suppression message. + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Gets the suppression type. + * + * @return The suppression type. + */ + public String getType() { + return type; + } + + /** + * Sets the suppression type. + * + * @param type The suppression type. + */ + public void setType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java new file mode 100644 index 0000000..d3e62d8 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Webhook event triggered when an email is suppressed. + */ +public class EmailSuppressedEvent extends WebhookEventPayload { + + @JsonProperty("data") + private EmailSuppressedEventData data; + + /** + * Default constructor. + */ + public EmailSuppressedEvent() { + } + + /** + * Gets the event data. + * + * @return The event data. + */ + public EmailSuppressedEventData getData() { + return data; + } + + /** + * Sets the event data. + * + * @param data The event data. + */ + public void setData(EmailSuppressedEventData data) { + this.data = data; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java new file mode 100644 index 0000000..0f7cf5c --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java @@ -0,0 +1,36 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Data payload for the {@code email.suppressed} webhook event. + */ +public class EmailSuppressedEventData extends BaseEmailEventData { + + @JsonProperty("suppressed") + private EmailSuppressedDetails suppressed; + + /** + * Default constructor. + */ + public EmailSuppressedEventData() { + } + + /** + * Gets the suppression details. + * + * @return The suppression details. + */ + public EmailSuppressedDetails getSuppressed() { + return suppressed; + } + + /** + * Sets the suppression details. + * + * @param suppressed The suppression details. + */ + public void setSuppressed(EmailSuppressedDetails suppressed) { + this.suppressed = suppressed; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java b/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java new file mode 100644 index 0000000..e72e848 --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java @@ -0,0 +1,227 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.resend.services.receiving.model.ReceivedEmailAttachment; +import java.util.List; + +/** + * Data payload for the {@code email.received} webhook event. + */ +public class ReceivedEmailEventData { + + @JsonProperty("email_id") + private String emailId; + + @JsonProperty("created_at") + private String createdAt; + + @JsonProperty("from") + private String from; + + @JsonProperty("to") + private List to; + + @JsonProperty("bcc") + private List bcc; + + @JsonProperty("cc") + private List cc; + + @JsonProperty("received_for") + private List receivedFor; + + @JsonProperty("message_id") + private String messageId; + + @JsonProperty("subject") + private String subject; + + @JsonProperty("attachments") + private List attachments; + + /** + * Default constructor. + */ + public ReceivedEmailEventData() { + } + + /** + * Gets the email ID. + * + * @return The email ID. + */ + public String getEmailId() { + return emailId; + } + + /** + * Sets the email ID. + * + * @param emailId The email ID. + */ + public void setEmailId(String emailId) { + this.emailId = emailId; + } + + /** + * Gets the creation timestamp. + * + * @return The creation timestamp. + */ + public String getCreatedAt() { + return createdAt; + } + + /** + * Sets the creation timestamp. + * + * @param createdAt The creation timestamp. + */ + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the sender email address. + * + * @return The sender email address. + */ + public String getFrom() { + return from; + } + + /** + * Sets the sender email address. + * + * @param from The sender email address. + */ + public void setFrom(String from) { + this.from = from; + } + + /** + * Gets the recipient email addresses. + * + * @return The recipient email addresses. + */ + public List getTo() { + return to; + } + + /** + * Sets the recipient email addresses. + * + * @param to The recipient email addresses. + */ + public void setTo(List to) { + this.to = to; + } + + /** + * Gets the BCC recipient email addresses. + * + * @return The BCC recipient email addresses. + */ + public List getBcc() { + return bcc; + } + + /** + * Sets the BCC recipient email addresses. + * + * @param bcc The BCC recipient email addresses. + */ + public void setBcc(List bcc) { + this.bcc = bcc; + } + + /** + * Gets the CC recipient email addresses. + * + * @return The CC recipient email addresses. + */ + public List getCc() { + return cc; + } + + /** + * Sets the CC recipient email addresses. + * + * @param cc The CC recipient email addresses. + */ + public void setCc(List cc) { + this.cc = cc; + } + + /** + * Gets the addresses the email was received for. + * + * @return The received-for addresses. + */ + public List getReceivedFor() { + return receivedFor; + } + + /** + * Sets the addresses the email was received for. + * + * @param receivedFor The received-for addresses. + */ + public void setReceivedFor(List receivedFor) { + this.receivedFor = receivedFor; + } + + /** + * Gets the RFC Message-ID header value. + * + * @return The message ID. + */ + public String getMessageId() { + return messageId; + } + + /** + * Sets the RFC Message-ID header value. + * + * @param messageId The message ID. + */ + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + /** + * Gets the email subject. + * + * @return The email subject. + */ + public String getSubject() { + return subject; + } + + /** + * Sets the email subject. + * + * @param subject The email subject. + */ + public void setSubject(String subject) { + this.subject = subject; + } + + /** + * Gets the email attachments. + * + * @return The email attachments. + */ + public List getAttachments() { + return attachments; + } + + /** + * Sets the email attachments. + * + * @param attachments The email attachments. + */ + public void setAttachments(List attachments) { + this.attachments = attachments; + } +} diff --git a/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java b/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java new file mode 100644 index 0000000..6f14e5d --- /dev/null +++ b/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java @@ -0,0 +1,84 @@ +package com.resend.services.webhooks.model.events; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +/** + * Base class for verified webhook event payloads. + */ +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.EXISTING_PROPERTY, + property = "type", + visible = true +) +@JsonSubTypes({ + @JsonSubTypes.Type(value = EmailSentEvent.class, name = "email.sent"), + @JsonSubTypes.Type(value = EmailScheduledEvent.class, name = "email.scheduled"), + @JsonSubTypes.Type(value = EmailDeliveredEvent.class, name = "email.delivered"), + @JsonSubTypes.Type(value = EmailDeliveryDelayedEvent.class, name = "email.delivery_delayed"), + @JsonSubTypes.Type(value = EmailComplainedEvent.class, name = "email.complained"), + @JsonSubTypes.Type(value = EmailBouncedEvent.class, name = "email.bounced"), + @JsonSubTypes.Type(value = EmailOpenedEvent.class, name = "email.opened"), + @JsonSubTypes.Type(value = EmailClickedEvent.class, name = "email.clicked"), + @JsonSubTypes.Type(value = EmailReceivedEvent.class, name = "email.received"), + @JsonSubTypes.Type(value = EmailFailedEvent.class, name = "email.failed"), + @JsonSubTypes.Type(value = EmailSuppressedEvent.class, name = "email.suppressed"), + @JsonSubTypes.Type(value = ContactCreatedEvent.class, name = "contact.created"), + @JsonSubTypes.Type(value = ContactUpdatedEvent.class, name = "contact.updated"), + @JsonSubTypes.Type(value = ContactDeletedEvent.class, name = "contact.deleted"), + @JsonSubTypes.Type(value = DomainCreatedEvent.class, name = "domain.created"), + @JsonSubTypes.Type(value = DomainUpdatedEvent.class, name = "domain.updated"), + @JsonSubTypes.Type(value = DomainDeletedEvent.class, name = "domain.deleted") +}) +public abstract class WebhookEventPayload { + + @JsonProperty("type") + private String type; + + @JsonProperty("created_at") + private String createdAt; + + /** + * Default constructor. + */ + protected WebhookEventPayload() { + } + + /** + * Gets the webhook event type. + * + * @return The event type. + */ + public String getType() { + return type; + } + + /** + * Sets the webhook event type. + * + * @param type The event type. + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the event creation timestamp. + * + * @return The creation timestamp. + */ + public String getCreatedAt() { + return createdAt; + } + + /** + * Sets the event creation timestamp. + * + * @param createdAt The creation timestamp. + */ + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } +} diff --git a/src/test/java/com/resend/services/emails/EmailsTest.java b/src/test/java/com/resend/services/emails/EmailsTest.java index c638186..927fe6e 100644 --- a/src/test/java/com/resend/services/emails/EmailsTest.java +++ b/src/test/java/com/resend/services/emails/EmailsTest.java @@ -36,7 +36,8 @@ public class EmailsTest { "\"html\":\"This is the HTML content\"," + "\"text\":\"This is the plain text content\"," + "\"bcc\":[\"bcc@example.com\"],\"cc\":[\"cc@example.com\"]," + - "\"reply_to\":[\"replyto@example.com\"],\"last_event\":\"last_event_status\"}"; + "\"reply_to\":[\"replyto@example.com\"],\"last_event\":\"last_event_status\"," + + "\"message_id\":\"\"}"; private static final String UPDATE_RESPONSE_JSON = "{\"id\":\"" + UPDATE_EMAIL_ID + "\",\"object\":\"emails\"}"; @@ -125,6 +126,7 @@ public void testRetrieveEmail_Success() throws ResendException { assertNotNull(response); assertEquals(EMAIL_ID, response.getId()); assertEquals("sender@example.com", response.getFrom()); + assertEquals("", response.getMessageId()); } @Test diff --git a/src/test/java/com/resend/services/webhooks/WebhooksTest.java b/src/test/java/com/resend/services/webhooks/WebhooksTest.java index 481f350..0acab8b 100644 --- a/src/test/java/com/resend/services/webhooks/WebhooksTest.java +++ b/src/test/java/com/resend/services/webhooks/WebhooksTest.java @@ -7,6 +7,9 @@ import com.resend.core.net.ListParams; import com.resend.services.util.WebhooksUtil; import com.resend.services.webhooks.model.*; +import com.resend.services.webhooks.model.events.EmailDeliveredEvent; +import com.resend.services.webhooks.model.events.EmailReceivedEvent; +import com.resend.services.webhooks.model.events.WebhookEventPayload; import okhttp3.MediaType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -200,6 +203,103 @@ public void testVerifyWebhook_Success() throws Exception { assertDoesNotThrow(() -> webhooksService.verify(options)); } + @Test + public void testVerifyWebhook_ReturnsParsedPayloadWithMessageId() throws Exception { + Webhooks webhooksService = new Webhooks("test-api-key"); + + String secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"; + String payload = "{" + + "\"type\":\"email.delivered\"," + + "\"created_at\":\"2024-01-01T00:00:00.000Z\"," + + "\"data\":{" + + "\"email_id\":\"56761188-7520-42d8-8898-ff6fc54ce618\"," + + "\"message_id\":\"<111-222-333@email.example.com>\"," + + "\"from\":\"Acme \"," + + "\"to\":[\"delivered@resend.dev\"]," + + "\"subject\":\"Sending this example\"," + + "\"created_at\":\"2024-01-01T00:00:00.000Z\"" + + "}" + + "}"; + String msgId = "msg_test123"; + long currentTimestamp = System.currentTimeMillis() / 1000; + String timestamp = String.valueOf(currentTimestamp); + + String signedContent = msgId + "." + timestamp + "." + payload; + String secretKey = secret.substring(6); + byte[] decodedSecret = Base64.getDecoder().decode(secretKey); + + Mac hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKeySpec = new SecretKeySpec(decodedSecret, "HmacSHA256"); + hmac.init(secretKeySpec); + byte[] hash = hmac.doFinal(signedContent.getBytes("UTF-8")); + String signature = "v1," + Base64.getEncoder().encodeToString(hash); + + VerifyWebhookOptions options = VerifyWebhookOptions.builder() + .payload(payload) + .addHeader("svix-id", msgId) + .addHeader("svix-timestamp", timestamp) + .addHeader("svix-signature", signature) + .secret(secret) + .build(); + + WebhookEventPayload event = webhooksService.verify(options); + + assertNotNull(event); + assertEquals("email.delivered", event.getType()); + assertTrue(event instanceof EmailDeliveredEvent); + EmailDeliveredEvent deliveredEvent = (EmailDeliveredEvent) event; + assertEquals("<111-222-333@email.example.com>", deliveredEvent.getData().getMessageId()); + assertEquals("56761188-7520-42d8-8898-ff6fc54ce618", deliveredEvent.getData().getEmailId()); + } + + @Test + public void testVerifyWebhook_EmailReceived_ReturnsMessageId() throws Exception { + Webhooks webhooksService = new Webhooks("test-api-key"); + + String secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"; + String payload = "{" + + "\"type\":\"email.received\"," + + "\"created_at\":\"2024-02-22T23:41:12.126Z\"," + + "\"data\":{" + + "\"email_id\":\"56761188-7520-42d8-8898-ff6fc54ce618\"," + + "\"message_id\":\"<111-222-333@email.example.com>\"," + + "\"from\":\"sender@example.com\"," + + "\"to\":[\"support@acme.com\"]," + + "\"subject\":\"Question about my order\"," + + "\"created_at\":\"2024-02-22T23:41:12.126Z\"," + + "\"bcc\":[],\"cc\":[],\"received_for\":[\"support@acme.com\"],\"attachments\":[]" + + "}" + + "}"; + String msgId = "msg_received123"; + long currentTimestamp = System.currentTimeMillis() / 1000; + String timestamp = String.valueOf(currentTimestamp); + + String signedContent = msgId + "." + timestamp + "." + payload; + String secretKey = secret.substring(6); + byte[] decodedSecret = Base64.getDecoder().decode(secretKey); + + Mac hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec secretKeySpec = new SecretKeySpec(decodedSecret, "HmacSHA256"); + hmac.init(secretKeySpec); + byte[] hash = hmac.doFinal(signedContent.getBytes("UTF-8")); + String signature = "v1," + Base64.getEncoder().encodeToString(hash); + + VerifyWebhookOptions options = VerifyWebhookOptions.builder() + .payload(payload) + .addHeader("svix-id", msgId) + .addHeader("svix-timestamp", timestamp) + .addHeader("svix-signature", signature) + .secret(secret) + .build(); + + WebhookEventPayload event = webhooksService.verify(options); + + assertNotNull(event); + assertTrue(event instanceof EmailReceivedEvent); + EmailReceivedEvent receivedEvent = (EmailReceivedEvent) event; + assertEquals("<111-222-333@email.example.com>", receivedEvent.getData().getMessageId()); + } + @Test public void testVerifyWebhook_InvalidSignature() { Webhooks webhooksService = new Webhooks("test-api-key"); From d3658a47d0541ff491d2433fb17a80882fe76cc0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Jul 2026 19:08:09 +0000 Subject: [PATCH 2/4] refactor: scope down to message_id on Email model only Remove webhook event payload models, verify() return type change, and WebhookEvent enum additions. Keep only message_id on Email for GET /emails/:id and list responses. Co-authored-by: cpenned --- .../resend/services/webhooks/Webhooks.java | 6 +- .../services/webhooks/model/WebhookEvent.java | 4 - .../model/events/BaseEmailEventData.java | 206 ---------------- .../model/events/ContactCreatedEvent.java | 36 --- .../model/events/ContactDeletedEvent.java | 36 --- .../model/events/ContactEventData.java | 205 ---------------- .../model/events/ContactUpdatedEvent.java | 36 --- .../model/events/DomainCreatedEvent.java | 36 --- .../model/events/DomainDeletedEvent.java | 36 --- .../model/events/DomainEventData.java | 143 ----------- .../model/events/DomainUpdatedEvent.java | 36 --- .../webhooks/model/events/EmailBounce.java | 78 ------ .../model/events/EmailBouncedEvent.java | 36 --- .../model/events/EmailBouncedEventData.java | 36 --- .../webhooks/model/events/EmailClick.java | 99 -------- .../model/events/EmailClickedEvent.java | 36 --- .../model/events/EmailClickedEventData.java | 36 --- .../model/events/EmailComplainedEvent.java | 36 --- .../model/events/EmailDeliveredEvent.java | 36 --- .../events/EmailDeliveryDelayedEvent.java | 36 --- .../model/events/EmailFailedDetails.java | 36 --- .../model/events/EmailFailedEvent.java | 36 --- .../model/events/EmailFailedEventData.java | 36 --- .../model/events/EmailOpenedEvent.java | 36 --- .../model/events/EmailReceivedEvent.java | 36 --- .../model/events/EmailScheduledEvent.java | 36 --- .../webhooks/model/events/EmailSentEvent.java | 36 --- .../model/events/EmailSuppressedDetails.java | 57 ----- .../model/events/EmailSuppressedEvent.java | 36 --- .../events/EmailSuppressedEventData.java | 36 --- .../model/events/ReceivedEmailEventData.java | 227 ------------------ .../model/events/WebhookEventPayload.java | 84 ------- .../services/webhooks/WebhooksTest.java | 100 -------- 33 files changed, 1 insertion(+), 2000 deletions(-) delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClick.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java delete mode 100644 src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java diff --git a/src/main/java/com/resend/services/webhooks/Webhooks.java b/src/main/java/com/resend/services/webhooks/Webhooks.java index 27ab520..6cfc071 100644 --- a/src/main/java/com/resend/services/webhooks/Webhooks.java +++ b/src/main/java/com/resend/services/webhooks/Webhooks.java @@ -15,7 +15,6 @@ import com.resend.services.webhooks.model.UpdateWebhookResponseSuccess; import com.resend.services.webhooks.model.GetWebhookResponseSuccess; import com.resend.services.webhooks.model.VerifyWebhookOptions; -import com.resend.services.webhooks.model.events.WebhookEventPayload; import okhttp3.MediaType; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -157,10 +156,9 @@ public RemoveWebhookResponseSuccess remove(String webhookId) throws ResendExcept * replay attacks. * * @param options The verification options containing payload, headers, and secret. - * @return The verified and parsed webhook event payload. * @throws ResendException If the signature is invalid or the timestamp is outside the tolerance window. */ - public WebhookEventPayload verify(VerifyWebhookOptions options) throws ResendException { + public void verify(VerifyWebhookOptions options) throws ResendException { if (options == null) { throw new ResendException(400, "VerifyWebhookOptions cannot be null"); } @@ -252,8 +250,6 @@ public WebhookEventPayload verify(VerifyWebhookOptions options) throws ResendExc throw new ResendException(401, "Webhook signature verification failed"); } - return resendMapper.readValue(options.getPayload(), WebhookEventPayload.class); - } catch (ResendException e) { throw e; } catch (Exception e) { diff --git a/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java b/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java index 44c1988..db79f5a 100644 --- a/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java +++ b/src/main/java/com/resend/services/webhooks/model/WebhookEvent.java @@ -8,8 +8,6 @@ public enum WebhookEvent { /** Triggered when an email is sent. */ EMAIL_SENT("email.sent"), - /** Triggered when an email is scheduled. */ - EMAIL_SCHEDULED("email.scheduled"), /** Triggered when an email is delivered. */ EMAIL_DELIVERED("email.delivered"), /** Triggered when an email delivery is delayed. */ @@ -26,8 +24,6 @@ public enum WebhookEvent { EMAIL_RECEIVED("email.received"), /** Triggered when an email fails to send. */ EMAIL_FAILED("email.failed"), - /** Triggered when an email is suppressed. */ - EMAIL_SUPPRESSED("email.suppressed"), /** Triggered when a contact is created. */ CONTACT_CREATED("contact.created"), /** Triggered when a contact is updated. */ diff --git a/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java b/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java deleted file mode 100644 index 6684a98..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/BaseEmailEventData.java +++ /dev/null @@ -1,206 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import java.util.Map; - -/** - * Base data payload for outbound email webhook events. - */ -public class BaseEmailEventData { - - @JsonProperty("broadcast_id") - private String broadcastId; - - @JsonProperty("created_at") - private String createdAt; - - @JsonProperty("email_id") - private String emailId; - - @JsonProperty("message_id") - private String messageId; - - @JsonProperty("from") - private String from; - - @JsonProperty("to") - private List to; - - @JsonProperty("subject") - private String subject; - - @JsonProperty("template_id") - private String templateId; - - @JsonProperty("tags") - private Map tags; - - /** - * Default constructor. - */ - public BaseEmailEventData() { - } - - /** - * Gets the broadcast ID. - * - * @return The broadcast ID. - */ - public String getBroadcastId() { - return broadcastId; - } - - /** - * Sets the broadcast ID. - * - * @param broadcastId The broadcast ID. - */ - public void setBroadcastId(String broadcastId) { - this.broadcastId = broadcastId; - } - - /** - * Gets the creation timestamp. - * - * @return The creation timestamp. - */ - public String getCreatedAt() { - return createdAt; - } - - /** - * Sets the creation timestamp. - * - * @param createdAt The creation timestamp. - */ - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the email ID. - * - * @return The email ID. - */ - public String getEmailId() { - return emailId; - } - - /** - * Sets the email ID. - * - * @param emailId The email ID. - */ - public void setEmailId(String emailId) { - this.emailId = emailId; - } - - /** - * Gets the RFC Message-ID header value. - * - * @return The message ID. - */ - public String getMessageId() { - return messageId; - } - - /** - * Sets the RFC Message-ID header value. - * - * @param messageId The message ID. - */ - public void setMessageId(String messageId) { - this.messageId = messageId; - } - - /** - * Gets the sender email address. - * - * @return The sender email address. - */ - public String getFrom() { - return from; - } - - /** - * Sets the sender email address. - * - * @param from The sender email address. - */ - public void setFrom(String from) { - this.from = from; - } - - /** - * Gets the recipient email addresses. - * - * @return The recipient email addresses. - */ - public List getTo() { - return to; - } - - /** - * Sets the recipient email addresses. - * - * @param to The recipient email addresses. - */ - public void setTo(List to) { - this.to = to; - } - - /** - * Gets the email subject. - * - * @return The email subject. - */ - public String getSubject() { - return subject; - } - - /** - * Sets the email subject. - * - * @param subject The email subject. - */ - public void setSubject(String subject) { - this.subject = subject; - } - - /** - * Gets the template ID. - * - * @return The template ID. - */ - public String getTemplateId() { - return templateId; - } - - /** - * Sets the template ID. - * - * @param templateId The template ID. - */ - public void setTemplateId(String templateId) { - this.templateId = templateId; - } - - /** - * Gets the email tags. - * - * @return The email tags. - */ - public Map getTags() { - return tags; - } - - /** - * Sets the email tags. - * - * @param tags The email tags. - */ - public void setTags(Map tags) { - this.tags = tags; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java deleted file mode 100644 index 18b3e1b..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/ContactCreatedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a contact is created. - */ -public class ContactCreatedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private ContactEventData data; - - /** - * Default constructor. - */ - public ContactCreatedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public ContactEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(ContactEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java deleted file mode 100644 index 7f4f801..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/ContactDeletedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a contact is deleted. - */ -public class ContactDeletedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private ContactEventData data; - - /** - * Default constructor. - */ - public ContactDeletedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public ContactEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(ContactEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java b/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java deleted file mode 100644 index f4f3b3f..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/ContactEventData.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; - -/** - * Data payload for contact webhook events. - */ -public class ContactEventData { - - @JsonProperty("id") - private String id; - - @JsonProperty("audience_id") - private String audienceId; - - @JsonProperty("segment_ids") - private List segmentIds; - - @JsonProperty("created_at") - private String createdAt; - - @JsonProperty("updated_at") - private String updatedAt; - - @JsonProperty("email") - private String email; - - @JsonProperty("first_name") - private String firstName; - - @JsonProperty("last_name") - private String lastName; - - @JsonProperty("unsubscribed") - private Boolean unsubscribed; - - /** - * Default constructor. - */ - public ContactEventData() { - } - - /** - * Gets the contact ID. - * - * @return The contact ID. - */ - public String getId() { - return id; - } - - /** - * Sets the contact ID. - * - * @param id The contact ID. - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the audience ID. - * - * @return The audience ID. - */ - public String getAudienceId() { - return audienceId; - } - - /** - * Sets the audience ID. - * - * @param audienceId The audience ID. - */ - public void setAudienceId(String audienceId) { - this.audienceId = audienceId; - } - - /** - * Gets the segment IDs. - * - * @return The segment IDs. - */ - public List getSegmentIds() { - return segmentIds; - } - - /** - * Sets the segment IDs. - * - * @param segmentIds The segment IDs. - */ - public void setSegmentIds(List segmentIds) { - this.segmentIds = segmentIds; - } - - /** - * Gets the creation timestamp. - * - * @return The creation timestamp. - */ - public String getCreatedAt() { - return createdAt; - } - - /** - * Sets the creation timestamp. - * - * @param createdAt The creation timestamp. - */ - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the update timestamp. - * - * @return The update timestamp. - */ - public String getUpdatedAt() { - return updatedAt; - } - - /** - * Sets the update timestamp. - * - * @param updatedAt The update timestamp. - */ - public void setUpdatedAt(String updatedAt) { - this.updatedAt = updatedAt; - } - - /** - * Gets the contact email address. - * - * @return The contact email address. - */ - public String getEmail() { - return email; - } - - /** - * Sets the contact email address. - * - * @param email The contact email address. - */ - public void setEmail(String email) { - this.email = email; - } - - /** - * Gets the contact first name. - * - * @return The contact first name. - */ - public String getFirstName() { - return firstName; - } - - /** - * Sets the contact first name. - * - * @param firstName The contact first name. - */ - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - /** - * Gets the contact last name. - * - * @return The contact last name. - */ - public String getLastName() { - return lastName; - } - - /** - * Sets the contact last name. - * - * @param lastName The contact last name. - */ - public void setLastName(String lastName) { - this.lastName = lastName; - } - - /** - * Gets whether the contact is unsubscribed. - * - * @return Whether the contact is unsubscribed. - */ - public Boolean getUnsubscribed() { - return unsubscribed; - } - - /** - * Sets whether the contact is unsubscribed. - * - * @param unsubscribed Whether the contact is unsubscribed. - */ - public void setUnsubscribed(Boolean unsubscribed) { - this.unsubscribed = unsubscribed; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java deleted file mode 100644 index ceac523..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/ContactUpdatedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a contact is updated. - */ -public class ContactUpdatedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private ContactEventData data; - - /** - * Default constructor. - */ - public ContactUpdatedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public ContactEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(ContactEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java deleted file mode 100644 index 2149f42..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/DomainCreatedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a domain is created. - */ -public class DomainCreatedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private DomainEventData data; - - /** - * Default constructor. - */ - public DomainCreatedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public DomainEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(DomainEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java deleted file mode 100644 index d5f1ab5..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/DomainDeletedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a domain is deleted. - */ -public class DomainDeletedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private DomainEventData data; - - /** - * Default constructor. - */ - public DomainDeletedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public DomainEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(DomainEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java b/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java deleted file mode 100644 index e23a6d5..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/DomainEventData.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.resend.services.domains.model.Record; -import java.util.List; - -/** - * Data payload for domain webhook events. - */ -public class DomainEventData { - - @JsonProperty("id") - private String id; - - @JsonProperty("name") - private String name; - - @JsonProperty("status") - private String status; - - @JsonProperty("created_at") - private String createdAt; - - @JsonProperty("region") - private String region; - - @JsonProperty("records") - private List records; - - /** - * Default constructor. - */ - public DomainEventData() { - } - - /** - * Gets the domain ID. - * - * @return The domain ID. - */ - public String getId() { - return id; - } - - /** - * Sets the domain ID. - * - * @param id The domain ID. - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the domain name. - * - * @return The domain name. - */ - public String getName() { - return name; - } - - /** - * Sets the domain name. - * - * @param name The domain name. - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the domain status. - * - * @return The domain status. - */ - public String getStatus() { - return status; - } - - /** - * Sets the domain status. - * - * @param status The domain status. - */ - public void setStatus(String status) { - this.status = status; - } - - /** - * Gets the creation timestamp. - * - * @return The creation timestamp. - */ - public String getCreatedAt() { - return createdAt; - } - - /** - * Sets the creation timestamp. - * - * @param createdAt The creation timestamp. - */ - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the domain region. - * - * @return The domain region. - */ - public String getRegion() { - return region; - } - - /** - * Sets the domain region. - * - * @param region The domain region. - */ - public void setRegion(String region) { - this.region = region; - } - - /** - * Gets the domain DNS records. - * - * @return The domain DNS records. - */ - public List getRecords() { - return records; - } - - /** - * Sets the domain DNS records. - * - * @param records The domain DNS records. - */ - public void setRecords(List records) { - this.records = records; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java deleted file mode 100644 index f535266..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/DomainUpdatedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a domain is updated. - */ -public class DomainUpdatedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private DomainEventData data; - - /** - * Default constructor. - */ - public DomainUpdatedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public DomainEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(DomainEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java deleted file mode 100644 index d0c7159..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailBounce.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Bounce details included in the {@code email.bounced} webhook event. - */ -public class EmailBounce { - - @JsonProperty("message") - private String message; - - @JsonProperty("subType") - private String subType; - - @JsonProperty("type") - private String type; - - /** - * Default constructor. - */ - public EmailBounce() { - } - - /** - * Gets the bounce message. - * - * @return The bounce message. - */ - public String getMessage() { - return message; - } - - /** - * Sets the bounce message. - * - * @param message The bounce message. - */ - public void setMessage(String message) { - this.message = message; - } - - /** - * Gets the bounce sub-type. - * - * @return The bounce sub-type. - */ - public String getSubType() { - return subType; - } - - /** - * Sets the bounce sub-type. - * - * @param subType The bounce sub-type. - */ - public void setSubType(String subType) { - this.subType = subType; - } - - /** - * Gets the bounce type. - * - * @return The bounce type. - */ - public String getType() { - return type; - } - - /** - * Sets the bounce type. - * - * @param type The bounce type. - */ - public void setType(String type) { - this.type = type; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java deleted file mode 100644 index 246d36a..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email bounces. - */ -public class EmailBouncedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private EmailBouncedEventData data; - - /** - * Default constructor. - */ - public EmailBouncedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public EmailBouncedEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(EmailBouncedEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java deleted file mode 100644 index 4c2c861..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailBouncedEventData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Data payload for the {@code email.bounced} webhook event. - */ -public class EmailBouncedEventData extends BaseEmailEventData { - - @JsonProperty("bounce") - private EmailBounce bounce; - - /** - * Default constructor. - */ - public EmailBouncedEventData() { - } - - /** - * Gets the bounce details. - * - * @return The bounce details. - */ - public EmailBounce getBounce() { - return bounce; - } - - /** - * Sets the bounce details. - * - * @param bounce The bounce details. - */ - public void setBounce(EmailBounce bounce) { - this.bounce = bounce; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java deleted file mode 100644 index e78993f..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailClick.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Click details included in the {@code email.clicked} webhook event. - */ -public class EmailClick { - - @JsonProperty("ipAddress") - private String ipAddress; - - @JsonProperty("link") - private String link; - - @JsonProperty("timestamp") - private String timestamp; - - @JsonProperty("userAgent") - private String userAgent; - - /** - * Default constructor. - */ - public EmailClick() { - } - - /** - * Gets the IP address of the click. - * - * @return The IP address. - */ - public String getIpAddress() { - return ipAddress; - } - - /** - * Sets the IP address of the click. - * - * @param ipAddress The IP address. - */ - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - /** - * Gets the clicked link URL. - * - * @return The link URL. - */ - public String getLink() { - return link; - } - - /** - * Sets the clicked link URL. - * - * @param link The link URL. - */ - public void setLink(String link) { - this.link = link; - } - - /** - * Gets the click timestamp. - * - * @return The click timestamp. - */ - public String getTimestamp() { - return timestamp; - } - - /** - * Sets the click timestamp. - * - * @param timestamp The click timestamp. - */ - public void setTimestamp(String timestamp) { - this.timestamp = timestamp; - } - - /** - * Gets the user agent of the click. - * - * @return The user agent. - */ - public String getUserAgent() { - return userAgent; - } - - /** - * Sets the user agent of the click. - * - * @param userAgent The user agent. - */ - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java deleted file mode 100644 index 1636338..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when a link in an email is clicked. - */ -public class EmailClickedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private EmailClickedEventData data; - - /** - * Default constructor. - */ - public EmailClickedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public EmailClickedEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(EmailClickedEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java deleted file mode 100644 index 8214b54..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailClickedEventData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Data payload for the {@code email.clicked} webhook event. - */ -public class EmailClickedEventData extends BaseEmailEventData { - - @JsonProperty("click") - private EmailClick click; - - /** - * Default constructor. - */ - public EmailClickedEventData() { - } - - /** - * Gets the click details. - * - * @return The click details. - */ - public EmailClick getClick() { - return click; - } - - /** - * Sets the click details. - * - * @param click The click details. - */ - public void setClick(EmailClick click) { - this.click = click; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java deleted file mode 100644 index 715150d..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailComplainedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email complaint is received. - */ -public class EmailComplainedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailComplainedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java deleted file mode 100644 index 5751631..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveredEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email is delivered. - */ -public class EmailDeliveredEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailDeliveredEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java deleted file mode 100644 index ff6d23d..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailDeliveryDelayedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email delivery is delayed. - */ -public class EmailDeliveryDelayedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailDeliveryDelayedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java deleted file mode 100644 index 7edb69a..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedDetails.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Failure details included in the {@code email.failed} webhook event. - */ -public class EmailFailedDetails { - - @JsonProperty("reason") - private String reason; - - /** - * Default constructor. - */ - public EmailFailedDetails() { - } - - /** - * Gets the failure reason. - * - * @return The failure reason. - */ - public String getReason() { - return reason; - } - - /** - * Sets the failure reason. - * - * @param reason The failure reason. - */ - public void setReason(String reason) { - this.reason = reason; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java deleted file mode 100644 index 76ea0ce..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email fails to send. - */ -public class EmailFailedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private EmailFailedEventData data; - - /** - * Default constructor. - */ - public EmailFailedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public EmailFailedEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(EmailFailedEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java deleted file mode 100644 index d85805a..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailFailedEventData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Data payload for the {@code email.failed} webhook event. - */ -public class EmailFailedEventData extends BaseEmailEventData { - - @JsonProperty("failed") - private EmailFailedDetails failed; - - /** - * Default constructor. - */ - public EmailFailedEventData() { - } - - /** - * Gets the failure details. - * - * @return The failure details. - */ - public EmailFailedDetails getFailed() { - return failed; - } - - /** - * Sets the failure details. - * - * @param failed The failure details. - */ - public void setFailed(EmailFailedDetails failed) { - this.failed = failed; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java deleted file mode 100644 index d219b79..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailOpenedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email is opened. - */ -public class EmailOpenedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailOpenedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java deleted file mode 100644 index 8d749f9..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailReceivedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an inbound email is received. - */ -public class EmailReceivedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private ReceivedEmailEventData data; - - /** - * Default constructor. - */ - public EmailReceivedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public ReceivedEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(ReceivedEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java deleted file mode 100644 index 85670db..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailScheduledEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email is scheduled. - */ -public class EmailScheduledEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailScheduledEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java deleted file mode 100644 index e160022..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailSentEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email is sent. - */ -public class EmailSentEvent extends WebhookEventPayload { - - @JsonProperty("data") - private BaseEmailEventData data; - - /** - * Default constructor. - */ - public EmailSentEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public BaseEmailEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(BaseEmailEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java deleted file mode 100644 index a3d18e8..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedDetails.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Suppression details included in the {@code email.suppressed} webhook event. - */ -public class EmailSuppressedDetails { - - @JsonProperty("message") - private String message; - - @JsonProperty("type") - private String type; - - /** - * Default constructor. - */ - public EmailSuppressedDetails() { - } - - /** - * Gets the suppression message. - * - * @return The suppression message. - */ - public String getMessage() { - return message; - } - - /** - * Sets the suppression message. - * - * @param message The suppression message. - */ - public void setMessage(String message) { - this.message = message; - } - - /** - * Gets the suppression type. - * - * @return The suppression type. - */ - public String getType() { - return type; - } - - /** - * Sets the suppression type. - * - * @param type The suppression type. - */ - public void setType(String type) { - this.type = type; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java deleted file mode 100644 index d3e62d8..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Webhook event triggered when an email is suppressed. - */ -public class EmailSuppressedEvent extends WebhookEventPayload { - - @JsonProperty("data") - private EmailSuppressedEventData data; - - /** - * Default constructor. - */ - public EmailSuppressedEvent() { - } - - /** - * Gets the event data. - * - * @return The event data. - */ - public EmailSuppressedEventData getData() { - return data; - } - - /** - * Sets the event data. - * - * @param data The event data. - */ - public void setData(EmailSuppressedEventData data) { - this.data = data; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java b/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java deleted file mode 100644 index 0f7cf5c..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/EmailSuppressedEventData.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Data payload for the {@code email.suppressed} webhook event. - */ -public class EmailSuppressedEventData extends BaseEmailEventData { - - @JsonProperty("suppressed") - private EmailSuppressedDetails suppressed; - - /** - * Default constructor. - */ - public EmailSuppressedEventData() { - } - - /** - * Gets the suppression details. - * - * @return The suppression details. - */ - public EmailSuppressedDetails getSuppressed() { - return suppressed; - } - - /** - * Sets the suppression details. - * - * @param suppressed The suppression details. - */ - public void setSuppressed(EmailSuppressedDetails suppressed) { - this.suppressed = suppressed; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java b/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java deleted file mode 100644 index e72e848..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/ReceivedEmailEventData.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.resend.services.receiving.model.ReceivedEmailAttachment; -import java.util.List; - -/** - * Data payload for the {@code email.received} webhook event. - */ -public class ReceivedEmailEventData { - - @JsonProperty("email_id") - private String emailId; - - @JsonProperty("created_at") - private String createdAt; - - @JsonProperty("from") - private String from; - - @JsonProperty("to") - private List to; - - @JsonProperty("bcc") - private List bcc; - - @JsonProperty("cc") - private List cc; - - @JsonProperty("received_for") - private List receivedFor; - - @JsonProperty("message_id") - private String messageId; - - @JsonProperty("subject") - private String subject; - - @JsonProperty("attachments") - private List attachments; - - /** - * Default constructor. - */ - public ReceivedEmailEventData() { - } - - /** - * Gets the email ID. - * - * @return The email ID. - */ - public String getEmailId() { - return emailId; - } - - /** - * Sets the email ID. - * - * @param emailId The email ID. - */ - public void setEmailId(String emailId) { - this.emailId = emailId; - } - - /** - * Gets the creation timestamp. - * - * @return The creation timestamp. - */ - public String getCreatedAt() { - return createdAt; - } - - /** - * Sets the creation timestamp. - * - * @param createdAt The creation timestamp. - */ - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the sender email address. - * - * @return The sender email address. - */ - public String getFrom() { - return from; - } - - /** - * Sets the sender email address. - * - * @param from The sender email address. - */ - public void setFrom(String from) { - this.from = from; - } - - /** - * Gets the recipient email addresses. - * - * @return The recipient email addresses. - */ - public List getTo() { - return to; - } - - /** - * Sets the recipient email addresses. - * - * @param to The recipient email addresses. - */ - public void setTo(List to) { - this.to = to; - } - - /** - * Gets the BCC recipient email addresses. - * - * @return The BCC recipient email addresses. - */ - public List getBcc() { - return bcc; - } - - /** - * Sets the BCC recipient email addresses. - * - * @param bcc The BCC recipient email addresses. - */ - public void setBcc(List bcc) { - this.bcc = bcc; - } - - /** - * Gets the CC recipient email addresses. - * - * @return The CC recipient email addresses. - */ - public List getCc() { - return cc; - } - - /** - * Sets the CC recipient email addresses. - * - * @param cc The CC recipient email addresses. - */ - public void setCc(List cc) { - this.cc = cc; - } - - /** - * Gets the addresses the email was received for. - * - * @return The received-for addresses. - */ - public List getReceivedFor() { - return receivedFor; - } - - /** - * Sets the addresses the email was received for. - * - * @param receivedFor The received-for addresses. - */ - public void setReceivedFor(List receivedFor) { - this.receivedFor = receivedFor; - } - - /** - * Gets the RFC Message-ID header value. - * - * @return The message ID. - */ - public String getMessageId() { - return messageId; - } - - /** - * Sets the RFC Message-ID header value. - * - * @param messageId The message ID. - */ - public void setMessageId(String messageId) { - this.messageId = messageId; - } - - /** - * Gets the email subject. - * - * @return The email subject. - */ - public String getSubject() { - return subject; - } - - /** - * Sets the email subject. - * - * @param subject The email subject. - */ - public void setSubject(String subject) { - this.subject = subject; - } - - /** - * Gets the email attachments. - * - * @return The email attachments. - */ - public List getAttachments() { - return attachments; - } - - /** - * Sets the email attachments. - * - * @param attachments The email attachments. - */ - public void setAttachments(List attachments) { - this.attachments = attachments; - } -} diff --git a/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java b/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java deleted file mode 100644 index 6f14e5d..0000000 --- a/src/main/java/com/resend/services/webhooks/model/events/WebhookEventPayload.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.resend.services.webhooks.model.events; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -/** - * Base class for verified webhook event payloads. - */ -@JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, - include = JsonTypeInfo.As.EXISTING_PROPERTY, - property = "type", - visible = true -) -@JsonSubTypes({ - @JsonSubTypes.Type(value = EmailSentEvent.class, name = "email.sent"), - @JsonSubTypes.Type(value = EmailScheduledEvent.class, name = "email.scheduled"), - @JsonSubTypes.Type(value = EmailDeliveredEvent.class, name = "email.delivered"), - @JsonSubTypes.Type(value = EmailDeliveryDelayedEvent.class, name = "email.delivery_delayed"), - @JsonSubTypes.Type(value = EmailComplainedEvent.class, name = "email.complained"), - @JsonSubTypes.Type(value = EmailBouncedEvent.class, name = "email.bounced"), - @JsonSubTypes.Type(value = EmailOpenedEvent.class, name = "email.opened"), - @JsonSubTypes.Type(value = EmailClickedEvent.class, name = "email.clicked"), - @JsonSubTypes.Type(value = EmailReceivedEvent.class, name = "email.received"), - @JsonSubTypes.Type(value = EmailFailedEvent.class, name = "email.failed"), - @JsonSubTypes.Type(value = EmailSuppressedEvent.class, name = "email.suppressed"), - @JsonSubTypes.Type(value = ContactCreatedEvent.class, name = "contact.created"), - @JsonSubTypes.Type(value = ContactUpdatedEvent.class, name = "contact.updated"), - @JsonSubTypes.Type(value = ContactDeletedEvent.class, name = "contact.deleted"), - @JsonSubTypes.Type(value = DomainCreatedEvent.class, name = "domain.created"), - @JsonSubTypes.Type(value = DomainUpdatedEvent.class, name = "domain.updated"), - @JsonSubTypes.Type(value = DomainDeletedEvent.class, name = "domain.deleted") -}) -public abstract class WebhookEventPayload { - - @JsonProperty("type") - private String type; - - @JsonProperty("created_at") - private String createdAt; - - /** - * Default constructor. - */ - protected WebhookEventPayload() { - } - - /** - * Gets the webhook event type. - * - * @return The event type. - */ - public String getType() { - return type; - } - - /** - * Sets the webhook event type. - * - * @param type The event type. - */ - public void setType(String type) { - this.type = type; - } - - /** - * Gets the event creation timestamp. - * - * @return The creation timestamp. - */ - public String getCreatedAt() { - return createdAt; - } - - /** - * Sets the event creation timestamp. - * - * @param createdAt The creation timestamp. - */ - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } -} diff --git a/src/test/java/com/resend/services/webhooks/WebhooksTest.java b/src/test/java/com/resend/services/webhooks/WebhooksTest.java index 0acab8b..481f350 100644 --- a/src/test/java/com/resend/services/webhooks/WebhooksTest.java +++ b/src/test/java/com/resend/services/webhooks/WebhooksTest.java @@ -7,9 +7,6 @@ import com.resend.core.net.ListParams; import com.resend.services.util.WebhooksUtil; import com.resend.services.webhooks.model.*; -import com.resend.services.webhooks.model.events.EmailDeliveredEvent; -import com.resend.services.webhooks.model.events.EmailReceivedEvent; -import com.resend.services.webhooks.model.events.WebhookEventPayload; import okhttp3.MediaType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -203,103 +200,6 @@ public void testVerifyWebhook_Success() throws Exception { assertDoesNotThrow(() -> webhooksService.verify(options)); } - @Test - public void testVerifyWebhook_ReturnsParsedPayloadWithMessageId() throws Exception { - Webhooks webhooksService = new Webhooks("test-api-key"); - - String secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"; - String payload = "{" + - "\"type\":\"email.delivered\"," + - "\"created_at\":\"2024-01-01T00:00:00.000Z\"," + - "\"data\":{" + - "\"email_id\":\"56761188-7520-42d8-8898-ff6fc54ce618\"," + - "\"message_id\":\"<111-222-333@email.example.com>\"," + - "\"from\":\"Acme \"," + - "\"to\":[\"delivered@resend.dev\"]," + - "\"subject\":\"Sending this example\"," + - "\"created_at\":\"2024-01-01T00:00:00.000Z\"" + - "}" + - "}"; - String msgId = "msg_test123"; - long currentTimestamp = System.currentTimeMillis() / 1000; - String timestamp = String.valueOf(currentTimestamp); - - String signedContent = msgId + "." + timestamp + "." + payload; - String secretKey = secret.substring(6); - byte[] decodedSecret = Base64.getDecoder().decode(secretKey); - - Mac hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKeySpec = new SecretKeySpec(decodedSecret, "HmacSHA256"); - hmac.init(secretKeySpec); - byte[] hash = hmac.doFinal(signedContent.getBytes("UTF-8")); - String signature = "v1," + Base64.getEncoder().encodeToString(hash); - - VerifyWebhookOptions options = VerifyWebhookOptions.builder() - .payload(payload) - .addHeader("svix-id", msgId) - .addHeader("svix-timestamp", timestamp) - .addHeader("svix-signature", signature) - .secret(secret) - .build(); - - WebhookEventPayload event = webhooksService.verify(options); - - assertNotNull(event); - assertEquals("email.delivered", event.getType()); - assertTrue(event instanceof EmailDeliveredEvent); - EmailDeliveredEvent deliveredEvent = (EmailDeliveredEvent) event; - assertEquals("<111-222-333@email.example.com>", deliveredEvent.getData().getMessageId()); - assertEquals("56761188-7520-42d8-8898-ff6fc54ce618", deliveredEvent.getData().getEmailId()); - } - - @Test - public void testVerifyWebhook_EmailReceived_ReturnsMessageId() throws Exception { - Webhooks webhooksService = new Webhooks("test-api-key"); - - String secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"; - String payload = "{" + - "\"type\":\"email.received\"," + - "\"created_at\":\"2024-02-22T23:41:12.126Z\"," + - "\"data\":{" + - "\"email_id\":\"56761188-7520-42d8-8898-ff6fc54ce618\"," + - "\"message_id\":\"<111-222-333@email.example.com>\"," + - "\"from\":\"sender@example.com\"," + - "\"to\":[\"support@acme.com\"]," + - "\"subject\":\"Question about my order\"," + - "\"created_at\":\"2024-02-22T23:41:12.126Z\"," + - "\"bcc\":[],\"cc\":[],\"received_for\":[\"support@acme.com\"],\"attachments\":[]" + - "}" + - "}"; - String msgId = "msg_received123"; - long currentTimestamp = System.currentTimeMillis() / 1000; - String timestamp = String.valueOf(currentTimestamp); - - String signedContent = msgId + "." + timestamp + "." + payload; - String secretKey = secret.substring(6); - byte[] decodedSecret = Base64.getDecoder().decode(secretKey); - - Mac hmac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKeySpec = new SecretKeySpec(decodedSecret, "HmacSHA256"); - hmac.init(secretKeySpec); - byte[] hash = hmac.doFinal(signedContent.getBytes("UTF-8")); - String signature = "v1," + Base64.getEncoder().encodeToString(hash); - - VerifyWebhookOptions options = VerifyWebhookOptions.builder() - .payload(payload) - .addHeader("svix-id", msgId) - .addHeader("svix-timestamp", timestamp) - .addHeader("svix-signature", signature) - .secret(secret) - .build(); - - WebhookEventPayload event = webhooksService.verify(options); - - assertNotNull(event); - assertTrue(event instanceof EmailReceivedEvent); - EmailReceivedEvent receivedEvent = (EmailReceivedEvent) event; - assertEquals("<111-222-333@email.example.com>", receivedEvent.getData().getMessageId()); - } - @Test public void testVerifyWebhook_InvalidSignature() { Webhooks webhooksService = new Webhooks("test-api-key"); From 57ced10fb2be9954b6fa5bfc0faaf07b277ec535 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Jul 2026 19:43:06 +0000 Subject: [PATCH 3/4] style: align message_id javadoc with Email model conventions Co-authored-by: cpenned --- src/main/java/com/resend/services/emails/model/Email.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/resend/services/emails/model/Email.java b/src/main/java/com/resend/services/emails/model/Email.java index 03fb4e1..2497852 100644 --- a/src/main/java/com/resend/services/emails/model/Email.java +++ b/src/main/java/com/resend/services/emails/model/Email.java @@ -278,7 +278,7 @@ public void setLastEvent(String lastEvent) { } /** - * Get the RFC Message-ID header value for the email. + * Get the message ID of the email. * @return The message ID. */ public String getMessageId() { @@ -286,7 +286,7 @@ public String getMessageId() { } /** - * Set the RFC Message-ID header value for the email. + * Set the message ID of the email. * @param messageId The message ID. */ public void setMessageId(String messageId) { From e137411430c0f6a181ad930c632233e57c096f8c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 8 Jul 2026 20:59:28 +0000 Subject: [PATCH 4/4] test: use 111-222-333@email.example.com as message_id example Co-authored-by: cpenned --- src/test/java/com/resend/services/emails/EmailsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/resend/services/emails/EmailsTest.java b/src/test/java/com/resend/services/emails/EmailsTest.java index 927fe6e..0ec753f 100644 --- a/src/test/java/com/resend/services/emails/EmailsTest.java +++ b/src/test/java/com/resend/services/emails/EmailsTest.java @@ -37,7 +37,7 @@ public class EmailsTest { "\"text\":\"This is the plain text content\"," + "\"bcc\":[\"bcc@example.com\"],\"cc\":[\"cc@example.com\"]," + "\"reply_to\":[\"replyto@example.com\"],\"last_event\":\"last_event_status\"," + - "\"message_id\":\"\"}"; + "\"message_id\":\"111-222-333@email.example.com\"}"; private static final String UPDATE_RESPONSE_JSON = "{\"id\":\"" + UPDATE_EMAIL_ID + "\",\"object\":\"emails\"}"; @@ -126,7 +126,7 @@ public void testRetrieveEmail_Success() throws ResendException { assertNotNull(response); assertEquals(EMAIL_ID, response.getId()); assertEquals("sender@example.com", response.getFrom()); - assertEquals("", response.getMessageId()); + assertEquals("111-222-333@email.example.com", response.getMessageId()); } @Test