From 1228d0b1c6587526fead8c7e17c9b1cd592a1678 Mon Sep 17 00:00:00 2001 From: Franco Jalil Date: Mon, 15 Jun 2026 20:17:43 -0300 Subject: [PATCH] feat: typed webhook event catalog (BIL-1567) Add the v2 webhook catalog (50 events) as typed payloads: event-name constants, one type per event, shared auxiliary types for nested shapes, and a typed envelope with per-event narrowing. The webhook parser now returns the typed envelope instead of an untyped map. --- src/main/java/co/commet/WebhookEvent.java | 281 ++++++++++++++++++ .../co/commet/models/AddonActivatedData.java | 14 + .../commet/models/AddonDeactivatedData.java | 12 + .../co/commet/models/BalanceDepletedData.java | 12 + .../java/co/commet/models/BalanceLowData.java | 13 + .../co/commet/models/BalanceToppedUpData.java | 14 + .../co/commet/models/CheckoutReadyData.java | 15 + .../co/commet/models/CreditsDepletedData.java | 11 + .../co/commet/models/CreditsExpiredData.java | 11 + .../co/commet/models/CreditsGrantedData.java | 12 + .../java/co/commet/models/CreditsLowData.java | 13 + .../commet/models/CreditsPurchasedData.java | 14 + .../co/commet/models/CustomerCreatedData.java | 17 ++ .../models/CustomerStateChangedData.java | 20 ++ .../co/commet/models/CustomerUpdatedData.java | 17 ++ .../co/commet/models/InvoiceCreatedData.java | 20 ++ .../co/commet/models/InvoiceOverdueData.java | 20 ++ .../co/commet/models/InvoiceUpcomingData.java | 15 + .../co/commet/models/InvoiceVoidedData.java | 20 ++ .../models/PaymentDisputeResolvedData.java | 17 ++ .../co/commet/models/PaymentDisputedData.java | 16 + .../co/commet/models/PaymentFailedData.java | 14 + .../models/PaymentMethodAttachedData.java | 11 + .../models/PaymentMethodUpdatedData.java | 10 + .../co/commet/models/PaymentReceivedData.java | 19 ++ .../commet/models/PaymentRecoveredData.java | 13 + .../co/commet/models/PaymentRefundedData.java | 15 + .../co/commet/models/PayoutAvailableData.java | 10 + .../co/commet/models/PayoutCreatedData.java | 16 + .../co/commet/models/PayoutFailedData.java | 18 ++ .../java/co/commet/models/PayoutPaidData.java | 16 + .../co/commet/models/QuotaExceededData.java | 15 + .../models/QuotaThresholdReachedData.java | 14 + .../commet/models/SeatsLimitReachedData.java | 13 + .../co/commet/models/SeatsUpdatedData.java | 13 + .../models/SubscriptionActivatedData.java | 18 ++ .../models/SubscriptionCanceledData.java | 14 + .../SubscriptionCancellationRevokedData.java | 12 + ...SubscriptionCancellationScheduledData.java | 14 + .../models/SubscriptionCreatedData.java | 15 + .../models/SubscriptionPastDueData.java | 13 + .../SubscriptionPlanChangeRevokedData.java | 15 + .../SubscriptionPlanChangeScheduledData.java | 16 + .../models/SubscriptionPlanChangedData.java | 16 + .../models/SubscriptionUpdatedData.java | 14 + .../commet/models/TrialCheckoutReadyData.java | 13 + .../co/commet/models/TrialConvertedData.java | 13 + .../co/commet/models/TrialExpiredData.java | 14 + .../co/commet/models/TrialStartedData.java | 14 + .../co/commet/models/TrialWillEndData.java | 14 + .../co/commet/models/UsageRecordedData.java | 14 + .../co/commet/models/WebhookAddonRef.java | 10 + .../java/co/commet/models/WebhookBalance.java | 9 + .../java/co/commet/models/WebhookBankRef.java | 10 + .../co/commet/models/WebhookCardInfo.java | 12 + .../commet/models/WebhookCreditsBalance.java | 11 + .../co/commet/models/WebhookEventType.java | 72 +++++ .../commet/models/WebhookFeatureAccess.java | 21 ++ .../java/co/commet/models/WebhookPlanRef.java | 10 + .../co/commet/models/WebhookSeatSummary.java | 13 + .../java/co/commet/resources/Webhooks.java | 5 +- src/test/java/co/commet/WebhooksTest.java | 34 ++- 62 files changed, 1209 insertions(+), 8 deletions(-) create mode 100644 src/main/java/co/commet/WebhookEvent.java create mode 100644 src/main/java/co/commet/models/AddonActivatedData.java create mode 100644 src/main/java/co/commet/models/AddonDeactivatedData.java create mode 100644 src/main/java/co/commet/models/BalanceDepletedData.java create mode 100644 src/main/java/co/commet/models/BalanceLowData.java create mode 100644 src/main/java/co/commet/models/BalanceToppedUpData.java create mode 100644 src/main/java/co/commet/models/CheckoutReadyData.java create mode 100644 src/main/java/co/commet/models/CreditsDepletedData.java create mode 100644 src/main/java/co/commet/models/CreditsExpiredData.java create mode 100644 src/main/java/co/commet/models/CreditsGrantedData.java create mode 100644 src/main/java/co/commet/models/CreditsLowData.java create mode 100644 src/main/java/co/commet/models/CreditsPurchasedData.java create mode 100644 src/main/java/co/commet/models/CustomerCreatedData.java create mode 100644 src/main/java/co/commet/models/CustomerStateChangedData.java create mode 100644 src/main/java/co/commet/models/CustomerUpdatedData.java create mode 100644 src/main/java/co/commet/models/InvoiceCreatedData.java create mode 100644 src/main/java/co/commet/models/InvoiceOverdueData.java create mode 100644 src/main/java/co/commet/models/InvoiceUpcomingData.java create mode 100644 src/main/java/co/commet/models/InvoiceVoidedData.java create mode 100644 src/main/java/co/commet/models/PaymentDisputeResolvedData.java create mode 100644 src/main/java/co/commet/models/PaymentDisputedData.java create mode 100644 src/main/java/co/commet/models/PaymentFailedData.java create mode 100644 src/main/java/co/commet/models/PaymentMethodAttachedData.java create mode 100644 src/main/java/co/commet/models/PaymentMethodUpdatedData.java create mode 100644 src/main/java/co/commet/models/PaymentReceivedData.java create mode 100644 src/main/java/co/commet/models/PaymentRecoveredData.java create mode 100644 src/main/java/co/commet/models/PaymentRefundedData.java create mode 100644 src/main/java/co/commet/models/PayoutAvailableData.java create mode 100644 src/main/java/co/commet/models/PayoutCreatedData.java create mode 100644 src/main/java/co/commet/models/PayoutFailedData.java create mode 100644 src/main/java/co/commet/models/PayoutPaidData.java create mode 100644 src/main/java/co/commet/models/QuotaExceededData.java create mode 100644 src/main/java/co/commet/models/QuotaThresholdReachedData.java create mode 100644 src/main/java/co/commet/models/SeatsLimitReachedData.java create mode 100644 src/main/java/co/commet/models/SeatsUpdatedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionActivatedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionCanceledData.java create mode 100644 src/main/java/co/commet/models/SubscriptionCancellationRevokedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionCancellationScheduledData.java create mode 100644 src/main/java/co/commet/models/SubscriptionCreatedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionPastDueData.java create mode 100644 src/main/java/co/commet/models/SubscriptionPlanChangeRevokedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionPlanChangeScheduledData.java create mode 100644 src/main/java/co/commet/models/SubscriptionPlanChangedData.java create mode 100644 src/main/java/co/commet/models/SubscriptionUpdatedData.java create mode 100644 src/main/java/co/commet/models/TrialCheckoutReadyData.java create mode 100644 src/main/java/co/commet/models/TrialConvertedData.java create mode 100644 src/main/java/co/commet/models/TrialExpiredData.java create mode 100644 src/main/java/co/commet/models/TrialStartedData.java create mode 100644 src/main/java/co/commet/models/TrialWillEndData.java create mode 100644 src/main/java/co/commet/models/UsageRecordedData.java create mode 100644 src/main/java/co/commet/models/WebhookAddonRef.java create mode 100644 src/main/java/co/commet/models/WebhookBalance.java create mode 100644 src/main/java/co/commet/models/WebhookBankRef.java create mode 100644 src/main/java/co/commet/models/WebhookCardInfo.java create mode 100644 src/main/java/co/commet/models/WebhookCreditsBalance.java create mode 100644 src/main/java/co/commet/models/WebhookEventType.java create mode 100644 src/main/java/co/commet/models/WebhookFeatureAccess.java create mode 100644 src/main/java/co/commet/models/WebhookPlanRef.java create mode 100644 src/main/java/co/commet/models/WebhookSeatSummary.java diff --git a/src/main/java/co/commet/WebhookEvent.java b/src/main/java/co/commet/WebhookEvent.java new file mode 100644 index 0000000..9ffac2b --- /dev/null +++ b/src/main/java/co/commet/WebhookEvent.java @@ -0,0 +1,281 @@ +package co.commet; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import co.commet.models.WebhookEventType; + +import co.commet.models.SubscriptionCreatedData; +import co.commet.models.SubscriptionActivatedData; +import co.commet.models.SubscriptionCanceledData; +import co.commet.models.SubscriptionUpdatedData; +import co.commet.models.SubscriptionPlanChangedData; +import co.commet.models.SubscriptionCancellationScheduledData; +import co.commet.models.SubscriptionCancellationRevokedData; +import co.commet.models.SubscriptionPlanChangeScheduledData; +import co.commet.models.SubscriptionPlanChangeRevokedData; +import co.commet.models.SubscriptionPastDueData; +import co.commet.models.TrialStartedData; +import co.commet.models.TrialConvertedData; +import co.commet.models.TrialExpiredData; +import co.commet.models.TrialWillEndData; +import co.commet.models.TrialCheckoutReadyData; +import co.commet.models.CheckoutReadyData; +import co.commet.models.PaymentReceivedData; +import co.commet.models.PaymentFailedData; +import co.commet.models.PaymentRecoveredData; +import co.commet.models.PaymentRefundedData; +import co.commet.models.PaymentDisputedData; +import co.commet.models.PaymentDisputeResolvedData; +import co.commet.models.InvoiceCreatedData; +import co.commet.models.InvoiceUpcomingData; +import co.commet.models.InvoiceOverdueData; +import co.commet.models.InvoiceVoidedData; +import co.commet.models.PaymentMethodAttachedData; +import co.commet.models.PaymentMethodUpdatedData; +import co.commet.models.CustomerCreatedData; +import co.commet.models.CustomerUpdatedData; +import co.commet.models.CustomerStateChangedData; +import co.commet.models.CreditsGrantedData; +import co.commet.models.CreditsPurchasedData; +import co.commet.models.CreditsLowData; +import co.commet.models.CreditsDepletedData; +import co.commet.models.CreditsExpiredData; +import co.commet.models.BalanceToppedUpData; +import co.commet.models.BalanceLowData; +import co.commet.models.BalanceDepletedData; +import co.commet.models.QuotaThresholdReachedData; +import co.commet.models.QuotaExceededData; +import co.commet.models.UsageRecordedData; +import co.commet.models.SeatsUpdatedData; +import co.commet.models.SeatsLimitReachedData; +import co.commet.models.AddonActivatedData; +import co.commet.models.AddonDeactivatedData; +import co.commet.models.PayoutAvailableData; +import co.commet.models.PayoutCreatedData; +import co.commet.models.PayoutPaidData; +import co.commet.models.PayoutFailedData; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookEvent( + @JsonProperty("event") WebhookEventType event, + @JsonProperty("timestamp") String timestamp, + @JsonProperty("organizationId") String organizationId, + @JsonProperty("mode") String mode, + @JsonProperty("apiVersion") String apiVersion, + @JsonProperty("data") JsonNode data +) { + + private static final ObjectMapper MAPPER = + new ObjectMapper().findAndRegisterModules(); + + private T convert(Class type) { + try { + return MAPPER.treeToValue(data, type); + } catch (Exception e) { + throw new RuntimeException("Failed to parse webhook data as " + type.getSimpleName(), e); + } + } + + public SubscriptionCreatedData asSubscriptionCreated() { + return convert(SubscriptionCreatedData.class); + } + + public SubscriptionActivatedData asSubscriptionActivated() { + return convert(SubscriptionActivatedData.class); + } + + public SubscriptionCanceledData asSubscriptionCanceled() { + return convert(SubscriptionCanceledData.class); + } + + public SubscriptionUpdatedData asSubscriptionUpdated() { + return convert(SubscriptionUpdatedData.class); + } + + public SubscriptionPlanChangedData asSubscriptionPlanChanged() { + return convert(SubscriptionPlanChangedData.class); + } + + public SubscriptionCancellationScheduledData asSubscriptionCancellationScheduled() { + return convert(SubscriptionCancellationScheduledData.class); + } + + public SubscriptionCancellationRevokedData asSubscriptionCancellationRevoked() { + return convert(SubscriptionCancellationRevokedData.class); + } + + public SubscriptionPlanChangeScheduledData asSubscriptionPlanChangeScheduled() { + return convert(SubscriptionPlanChangeScheduledData.class); + } + + public SubscriptionPlanChangeRevokedData asSubscriptionPlanChangeRevoked() { + return convert(SubscriptionPlanChangeRevokedData.class); + } + + public SubscriptionPastDueData asSubscriptionPastDue() { + return convert(SubscriptionPastDueData.class); + } + + public TrialStartedData asTrialStarted() { + return convert(TrialStartedData.class); + } + + public TrialConvertedData asTrialConverted() { + return convert(TrialConvertedData.class); + } + + public TrialExpiredData asTrialExpired() { + return convert(TrialExpiredData.class); + } + + public TrialWillEndData asTrialWillEnd() { + return convert(TrialWillEndData.class); + } + + public TrialCheckoutReadyData asTrialCheckoutReady() { + return convert(TrialCheckoutReadyData.class); + } + + public CheckoutReadyData asCheckoutReady() { + return convert(CheckoutReadyData.class); + } + + public PaymentReceivedData asPaymentReceived() { + return convert(PaymentReceivedData.class); + } + + public PaymentFailedData asPaymentFailed() { + return convert(PaymentFailedData.class); + } + + public PaymentRecoveredData asPaymentRecovered() { + return convert(PaymentRecoveredData.class); + } + + public PaymentRefundedData asPaymentRefunded() { + return convert(PaymentRefundedData.class); + } + + public PaymentDisputedData asPaymentDisputed() { + return convert(PaymentDisputedData.class); + } + + public PaymentDisputeResolvedData asPaymentDisputeResolved() { + return convert(PaymentDisputeResolvedData.class); + } + + public InvoiceCreatedData asInvoiceCreated() { + return convert(InvoiceCreatedData.class); + } + + public InvoiceUpcomingData asInvoiceUpcoming() { + return convert(InvoiceUpcomingData.class); + } + + public InvoiceOverdueData asInvoiceOverdue() { + return convert(InvoiceOverdueData.class); + } + + public InvoiceVoidedData asInvoiceVoided() { + return convert(InvoiceVoidedData.class); + } + + public PaymentMethodAttachedData asPaymentMethodAttached() { + return convert(PaymentMethodAttachedData.class); + } + + public PaymentMethodUpdatedData asPaymentMethodUpdated() { + return convert(PaymentMethodUpdatedData.class); + } + + public CustomerCreatedData asCustomerCreated() { + return convert(CustomerCreatedData.class); + } + + public CustomerUpdatedData asCustomerUpdated() { + return convert(CustomerUpdatedData.class); + } + + public CustomerStateChangedData asCustomerStateChanged() { + return convert(CustomerStateChangedData.class); + } + + public CreditsGrantedData asCreditsGranted() { + return convert(CreditsGrantedData.class); + } + + public CreditsPurchasedData asCreditsPurchased() { + return convert(CreditsPurchasedData.class); + } + + public CreditsLowData asCreditsLow() { + return convert(CreditsLowData.class); + } + + public CreditsDepletedData asCreditsDepleted() { + return convert(CreditsDepletedData.class); + } + + public CreditsExpiredData asCreditsExpired() { + return convert(CreditsExpiredData.class); + } + + public BalanceToppedUpData asBalanceToppedUp() { + return convert(BalanceToppedUpData.class); + } + + public BalanceLowData asBalanceLow() { + return convert(BalanceLowData.class); + } + + public BalanceDepletedData asBalanceDepleted() { + return convert(BalanceDepletedData.class); + } + + public QuotaThresholdReachedData asQuotaThresholdReached() { + return convert(QuotaThresholdReachedData.class); + } + + public QuotaExceededData asQuotaExceeded() { + return convert(QuotaExceededData.class); + } + + public UsageRecordedData asUsageRecorded() { + return convert(UsageRecordedData.class); + } + + public SeatsUpdatedData asSeatsUpdated() { + return convert(SeatsUpdatedData.class); + } + + public SeatsLimitReachedData asSeatsLimitReached() { + return convert(SeatsLimitReachedData.class); + } + + public AddonActivatedData asAddonActivated() { + return convert(AddonActivatedData.class); + } + + public AddonDeactivatedData asAddonDeactivated() { + return convert(AddonDeactivatedData.class); + } + + public PayoutAvailableData asPayoutAvailable() { + return convert(PayoutAvailableData.class); + } + + public PayoutCreatedData asPayoutCreated() { + return convert(PayoutCreatedData.class); + } + + public PayoutPaidData asPayoutPaid() { + return convert(PayoutPaidData.class); + } + + public PayoutFailedData asPayoutFailed() { + return convert(PayoutFailedData.class); + } +} diff --git a/src/main/java/co/commet/models/AddonActivatedData.java b/src/main/java/co/commet/models/AddonActivatedData.java new file mode 100644 index 0000000..75f8d65 --- /dev/null +++ b/src/main/java/co/commet/models/AddonActivatedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record AddonActivatedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("addon") WebhookAddonRef addon, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("proratedPrice") double proratedPrice, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/AddonDeactivatedData.java b/src/main/java/co/commet/models/AddonDeactivatedData.java new file mode 100644 index 0000000..a964317 --- /dev/null +++ b/src/main/java/co/commet/models/AddonDeactivatedData.java @@ -0,0 +1,12 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record AddonDeactivatedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("addon") WebhookAddonRef addon, + @JsonProperty("featureCode") String featureCode +) {} diff --git a/src/main/java/co/commet/models/BalanceDepletedData.java b/src/main/java/co/commet/models/BalanceDepletedData.java new file mode 100644 index 0000000..da06178 --- /dev/null +++ b/src/main/java/co/commet/models/BalanceDepletedData.java @@ -0,0 +1,12 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record BalanceDepletedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("currentBalance") double currentBalance, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/BalanceLowData.java b/src/main/java/co/commet/models/BalanceLowData.java new file mode 100644 index 0000000..3d10b0d --- /dev/null +++ b/src/main/java/co/commet/models/BalanceLowData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record BalanceLowData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("currentBalance") double currentBalance, + @JsonProperty("thresholdBalance") double thresholdBalance, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/BalanceToppedUpData.java b/src/main/java/co/commet/models/BalanceToppedUpData.java new file mode 100644 index 0000000..5bc12fd --- /dev/null +++ b/src/main/java/co/commet/models/BalanceToppedUpData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record BalanceToppedUpData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("amount") double amount, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/CheckoutReadyData.java b/src/main/java/co/commet/models/CheckoutReadyData.java new file mode 100644 index 0000000..60482dd --- /dev/null +++ b/src/main/java/co/commet/models/CheckoutReadyData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CheckoutReadyData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceTotal") double invoiceTotal, + @JsonProperty("invoiceCurrency") String invoiceCurrency, + @JsonProperty("checkoutUrl") String checkoutUrl +) {} diff --git a/src/main/java/co/commet/models/CreditsDepletedData.java b/src/main/java/co/commet/models/CreditsDepletedData.java new file mode 100644 index 0000000..887361c --- /dev/null +++ b/src/main/java/co/commet/models/CreditsDepletedData.java @@ -0,0 +1,11 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CreditsDepletedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("remainingCredits") double remainingCredits +) {} diff --git a/src/main/java/co/commet/models/CreditsExpiredData.java b/src/main/java/co/commet/models/CreditsExpiredData.java new file mode 100644 index 0000000..e3a2d1c --- /dev/null +++ b/src/main/java/co/commet/models/CreditsExpiredData.java @@ -0,0 +1,11 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CreditsExpiredData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("expiredCredits") double expiredCredits +) {} diff --git a/src/main/java/co/commet/models/CreditsGrantedData.java b/src/main/java/co/commet/models/CreditsGrantedData.java new file mode 100644 index 0000000..7097f6b --- /dev/null +++ b/src/main/java/co/commet/models/CreditsGrantedData.java @@ -0,0 +1,12 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CreditsGrantedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("credits") double credits, + @JsonProperty("reason") String reason +) {} diff --git a/src/main/java/co/commet/models/CreditsLowData.java b/src/main/java/co/commet/models/CreditsLowData.java new file mode 100644 index 0000000..cd54322 --- /dev/null +++ b/src/main/java/co/commet/models/CreditsLowData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CreditsLowData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("remainingCredits") double remainingCredits, + @JsonProperty("thresholdCredits") double thresholdCredits, + @JsonProperty("periodCredits") double periodCredits +) {} diff --git a/src/main/java/co/commet/models/CreditsPurchasedData.java b/src/main/java/co/commet/models/CreditsPurchasedData.java new file mode 100644 index 0000000..31e374d --- /dev/null +++ b/src/main/java/co/commet/models/CreditsPurchasedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CreditsPurchasedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("creditPackName") String creditPackName, + @JsonProperty("credits") double credits +) {} diff --git a/src/main/java/co/commet/models/CustomerCreatedData.java b/src/main/java/co/commet/models/CustomerCreatedData.java new file mode 100644 index 0000000..34baf3c --- /dev/null +++ b/src/main/java/co/commet/models/CustomerCreatedData.java @@ -0,0 +1,17 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CustomerCreatedData( + @JsonProperty("id") String id, + @JsonProperty("externalId") String externalId, + @JsonProperty("fullName") String fullName, + @JsonProperty("email") String email, + @JsonProperty("timezone") String timezone, + @JsonProperty("metadata") Map metadata, + @JsonProperty("createdAt") String createdAt, + @JsonProperty("updatedAt") String updatedAt +) {} diff --git a/src/main/java/co/commet/models/CustomerStateChangedData.java b/src/main/java/co/commet/models/CustomerStateChangedData.java new file mode 100644 index 0000000..9f94e5d --- /dev/null +++ b/src/main/java/co/commet/models/CustomerStateChangedData.java @@ -0,0 +1,20 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CustomerStateChangedData( + @JsonProperty("customerId") String customerId, + @JsonProperty("trigger") String trigger, + @JsonProperty("status") String status, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("plan") WebhookPlanRef plan, + @JsonProperty("billingInterval") String billingInterval, + @JsonProperty("consumptionModel") String consumptionModel, + @JsonProperty("features") List features, + @JsonProperty("seats") List seats, + @JsonProperty("credits") WebhookCreditsBalance credits, + @JsonProperty("balance") WebhookBalance balance +) {} diff --git a/src/main/java/co/commet/models/CustomerUpdatedData.java b/src/main/java/co/commet/models/CustomerUpdatedData.java new file mode 100644 index 0000000..2e38328 --- /dev/null +++ b/src/main/java/co/commet/models/CustomerUpdatedData.java @@ -0,0 +1,17 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record CustomerUpdatedData( + @JsonProperty("id") String id, + @JsonProperty("externalId") String externalId, + @JsonProperty("fullName") String fullName, + @JsonProperty("email") String email, + @JsonProperty("timezone") String timezone, + @JsonProperty("metadata") Map metadata, + @JsonProperty("createdAt") String createdAt, + @JsonProperty("updatedAt") String updatedAt +) {} diff --git a/src/main/java/co/commet/models/InvoiceCreatedData.java b/src/main/java/co/commet/models/InvoiceCreatedData.java new file mode 100644 index 0000000..3cfef1d --- /dev/null +++ b/src/main/java/co/commet/models/InvoiceCreatedData.java @@ -0,0 +1,20 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record InvoiceCreatedData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceStatus") String invoiceStatus, + @JsonProperty("periodStart") String periodStart, + @JsonProperty("periodEnd") String periodEnd, + @JsonProperty("issueDate") String issueDate, + @JsonProperty("dueDate") String dueDate, + @JsonProperty("currency") String currency, + @JsonProperty("subtotal") double subtotal, + @JsonProperty("total") double total, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId +) {} diff --git a/src/main/java/co/commet/models/InvoiceOverdueData.java b/src/main/java/co/commet/models/InvoiceOverdueData.java new file mode 100644 index 0000000..eb6e950 --- /dev/null +++ b/src/main/java/co/commet/models/InvoiceOverdueData.java @@ -0,0 +1,20 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record InvoiceOverdueData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceStatus") String invoiceStatus, + @JsonProperty("periodStart") String periodStart, + @JsonProperty("periodEnd") String periodEnd, + @JsonProperty("issueDate") String issueDate, + @JsonProperty("dueDate") String dueDate, + @JsonProperty("currency") String currency, + @JsonProperty("subtotal") double subtotal, + @JsonProperty("total") double total, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId +) {} diff --git a/src/main/java/co/commet/models/InvoiceUpcomingData.java b/src/main/java/co/commet/models/InvoiceUpcomingData.java new file mode 100644 index 0000000..8fe02fc --- /dev/null +++ b/src/main/java/co/commet/models/InvoiceUpcomingData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record InvoiceUpcomingData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName, + @JsonProperty("billingInterval") String billingInterval, + @JsonProperty("currentPeriodEnd") String currentPeriodEnd +) {} diff --git a/src/main/java/co/commet/models/InvoiceVoidedData.java b/src/main/java/co/commet/models/InvoiceVoidedData.java new file mode 100644 index 0000000..03cbf49 --- /dev/null +++ b/src/main/java/co/commet/models/InvoiceVoidedData.java @@ -0,0 +1,20 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record InvoiceVoidedData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceStatus") String invoiceStatus, + @JsonProperty("periodStart") String periodStart, + @JsonProperty("periodEnd") String periodEnd, + @JsonProperty("issueDate") String issueDate, + @JsonProperty("dueDate") String dueDate, + @JsonProperty("currency") String currency, + @JsonProperty("subtotal") double subtotal, + @JsonProperty("total") double total, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId +) {} diff --git a/src/main/java/co/commet/models/PaymentDisputeResolvedData.java b/src/main/java/co/commet/models/PaymentDisputeResolvedData.java new file mode 100644 index 0000000..a35bad4 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentDisputeResolvedData.java @@ -0,0 +1,17 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentDisputeResolvedData( + @JsonProperty("paymentTransactionId") String paymentTransactionId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("disputeAmount") double disputeAmount, + @JsonProperty("currency") String currency, + @JsonProperty("disputeReason") String disputeReason, + @JsonProperty("outcome") String outcome +) {} diff --git a/src/main/java/co/commet/models/PaymentDisputedData.java b/src/main/java/co/commet/models/PaymentDisputedData.java new file mode 100644 index 0000000..52f49c0 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentDisputedData.java @@ -0,0 +1,16 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentDisputedData( + @JsonProperty("paymentTransactionId") String paymentTransactionId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("disputeAmount") double disputeAmount, + @JsonProperty("currency") String currency, + @JsonProperty("disputeReason") String disputeReason +) {} diff --git a/src/main/java/co/commet/models/PaymentFailedData.java b/src/main/java/co/commet/models/PaymentFailedData.java new file mode 100644 index 0000000..b4168cb --- /dev/null +++ b/src/main/java/co/commet/models/PaymentFailedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentFailedData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("failureCode") String failureCode, + @JsonProperty("failureMessage") String failureMessage +) {} diff --git a/src/main/java/co/commet/models/PaymentMethodAttachedData.java b/src/main/java/co/commet/models/PaymentMethodAttachedData.java new file mode 100644 index 0000000..5183c37 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentMethodAttachedData.java @@ -0,0 +1,11 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentMethodAttachedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("card") WebhookCardInfo card +) {} diff --git a/src/main/java/co/commet/models/PaymentMethodUpdatedData.java b/src/main/java/co/commet/models/PaymentMethodUpdatedData.java new file mode 100644 index 0000000..c6a5d13 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentMethodUpdatedData.java @@ -0,0 +1,10 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentMethodUpdatedData( + @JsonProperty("customerId") String customerId, + @JsonProperty("card") WebhookCardInfo card +) {} diff --git a/src/main/java/co/commet/models/PaymentReceivedData.java b/src/main/java/co/commet/models/PaymentReceivedData.java new file mode 100644 index 0000000..11f948d --- /dev/null +++ b/src/main/java/co/commet/models/PaymentReceivedData.java @@ -0,0 +1,19 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentReceivedData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceTotal") double invoiceTotal, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("paymentTransactionId") String paymentTransactionId, + @JsonProperty("grossAmount") double grossAmount, + @JsonProperty("currency") String currency, + @JsonProperty("orgNetAmount") double orgNetAmount, + @JsonProperty("customerEmail") String customerEmail, + @JsonProperty("paidAt") String paidAt +) {} diff --git a/src/main/java/co/commet/models/PaymentRecoveredData.java b/src/main/java/co/commet/models/PaymentRecoveredData.java new file mode 100644 index 0000000..9cab6d6 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentRecoveredData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentRecoveredData( + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceTotal") double invoiceTotal, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId +) {} diff --git a/src/main/java/co/commet/models/PaymentRefundedData.java b/src/main/java/co/commet/models/PaymentRefundedData.java new file mode 100644 index 0000000..5e288a3 --- /dev/null +++ b/src/main/java/co/commet/models/PaymentRefundedData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PaymentRefundedData( + @JsonProperty("paymentTransactionId") String paymentTransactionId, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("refundAmount") double refundAmount, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/PayoutAvailableData.java b/src/main/java/co/commet/models/PayoutAvailableData.java new file mode 100644 index 0000000..05ca817 --- /dev/null +++ b/src/main/java/co/commet/models/PayoutAvailableData.java @@ -0,0 +1,10 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PayoutAvailableData( + @JsonProperty("availableAmount") double availableAmount, + @JsonProperty("currency") String currency +) {} diff --git a/src/main/java/co/commet/models/PayoutCreatedData.java b/src/main/java/co/commet/models/PayoutCreatedData.java new file mode 100644 index 0000000..7b68879 --- /dev/null +++ b/src/main/java/co/commet/models/PayoutCreatedData.java @@ -0,0 +1,16 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PayoutCreatedData( + @JsonProperty("payoutId") String payoutId, + @JsonProperty("amount") double amount, + @JsonProperty("fee") double fee, + @JsonProperty("netAmount") double netAmount, + @JsonProperty("currency") String currency, + @JsonProperty("status") String status, + @JsonProperty("destinationBank") WebhookBankRef destinationBank, + @JsonProperty("createdAt") String createdAt +) {} diff --git a/src/main/java/co/commet/models/PayoutFailedData.java b/src/main/java/co/commet/models/PayoutFailedData.java new file mode 100644 index 0000000..4fa9396 --- /dev/null +++ b/src/main/java/co/commet/models/PayoutFailedData.java @@ -0,0 +1,18 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PayoutFailedData( + @JsonProperty("payoutId") String payoutId, + @JsonProperty("amount") double amount, + @JsonProperty("fee") double fee, + @JsonProperty("netAmount") double netAmount, + @JsonProperty("currency") String currency, + @JsonProperty("status") String status, + @JsonProperty("destinationBank") WebhookBankRef destinationBank, + @JsonProperty("failedAt") String failedAt, + @JsonProperty("failureCode") String failureCode, + @JsonProperty("failureMessage") String failureMessage +) {} diff --git a/src/main/java/co/commet/models/PayoutPaidData.java b/src/main/java/co/commet/models/PayoutPaidData.java new file mode 100644 index 0000000..d15786e --- /dev/null +++ b/src/main/java/co/commet/models/PayoutPaidData.java @@ -0,0 +1,16 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record PayoutPaidData( + @JsonProperty("payoutId") String payoutId, + @JsonProperty("amount") double amount, + @JsonProperty("fee") double fee, + @JsonProperty("netAmount") double netAmount, + @JsonProperty("currency") String currency, + @JsonProperty("status") String status, + @JsonProperty("destinationBank") WebhookBankRef destinationBank, + @JsonProperty("paidAt") String paidAt +) {} diff --git a/src/main/java/co/commet/models/QuotaExceededData.java b/src/main/java/co/commet/models/QuotaExceededData.java new file mode 100644 index 0000000..bd19bab --- /dev/null +++ b/src/main/java/co/commet/models/QuotaExceededData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record QuotaExceededData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("currentUsage") double currentUsage, + @JsonProperty("includedAmount") double includedAmount, + @JsonProperty("overageEnabled") boolean overageEnabled, + @JsonProperty("periodStart") String periodStart +) {} diff --git a/src/main/java/co/commet/models/QuotaThresholdReachedData.java b/src/main/java/co/commet/models/QuotaThresholdReachedData.java new file mode 100644 index 0000000..a9afec1 --- /dev/null +++ b/src/main/java/co/commet/models/QuotaThresholdReachedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record QuotaThresholdReachedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("currentUsage") double currentUsage, + @JsonProperty("includedAmount") double includedAmount, + @JsonProperty("periodStart") String periodStart +) {} diff --git a/src/main/java/co/commet/models/SeatsLimitReachedData.java b/src/main/java/co/commet/models/SeatsLimitReachedData.java new file mode 100644 index 0000000..3179516 --- /dev/null +++ b/src/main/java/co/commet/models/SeatsLimitReachedData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SeatsLimitReachedData( + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("currentSeats") double currentSeats, + @JsonProperty("includedSeats") double includedSeats +) {} diff --git a/src/main/java/co/commet/models/SeatsUpdatedData.java b/src/main/java/co/commet/models/SeatsUpdatedData.java new file mode 100644 index 0000000..525186c --- /dev/null +++ b/src/main/java/co/commet/models/SeatsUpdatedData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SeatsUpdatedData( + @JsonProperty("customerId") String customerId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("previousSeats") double previousSeats, + @JsonProperty("currentSeats") double currentSeats +) {} diff --git a/src/main/java/co/commet/models/SubscriptionActivatedData.java b/src/main/java/co/commet/models/SubscriptionActivatedData.java new file mode 100644 index 0000000..dbb7423 --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionActivatedData.java @@ -0,0 +1,18 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionActivatedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("currentPeriodStart") String currentPeriodStart, + @JsonProperty("currentPeriodEnd") String currentPeriodEnd, + @JsonProperty("name") String name, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber, + @JsonProperty("invoiceTotal") double invoiceTotal, + @JsonProperty("invoiceCurrency") String invoiceCurrency +) {} diff --git a/src/main/java/co/commet/models/SubscriptionCanceledData.java b/src/main/java/co/commet/models/SubscriptionCanceledData.java new file mode 100644 index 0000000..1a9ed30 --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionCanceledData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionCanceledData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("canceledAt") String canceledAt, + @JsonProperty("cancelReason") String cancelReason, + @JsonProperty("endDate") String endDate +) {} diff --git a/src/main/java/co/commet/models/SubscriptionCancellationRevokedData.java b/src/main/java/co/commet/models/SubscriptionCancellationRevokedData.java new file mode 100644 index 0000000..88adce0 --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionCancellationRevokedData.java @@ -0,0 +1,12 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionCancellationRevokedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("currentPeriodEnd") String currentPeriodEnd +) {} diff --git a/src/main/java/co/commet/models/SubscriptionCancellationScheduledData.java b/src/main/java/co/commet/models/SubscriptionCancellationScheduledData.java new file mode 100644 index 0000000..84f20ef --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionCancellationScheduledData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionCancellationScheduledData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("canceledAt") String canceledAt, + @JsonProperty("cancelReason") String cancelReason, + @JsonProperty("effectiveAt") String effectiveAt +) {} diff --git a/src/main/java/co/commet/models/SubscriptionCreatedData.java b/src/main/java/co/commet/models/SubscriptionCreatedData.java new file mode 100644 index 0000000..8e49418 --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionCreatedData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionCreatedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName, + @JsonProperty("status") String status, + @JsonProperty("startDate") String startDate, + @JsonProperty("name") String name +) {} diff --git a/src/main/java/co/commet/models/SubscriptionPastDueData.java b/src/main/java/co/commet/models/SubscriptionPastDueData.java new file mode 100644 index 0000000..4a0ecae --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionPastDueData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionPastDueData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("invoiceId") String invoiceId, + @JsonProperty("invoiceNumber") String invoiceNumber +) {} diff --git a/src/main/java/co/commet/models/SubscriptionPlanChangeRevokedData.java b/src/main/java/co/commet/models/SubscriptionPlanChangeRevokedData.java new file mode 100644 index 0000000..3412567 --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionPlanChangeRevokedData.java @@ -0,0 +1,15 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionPlanChangeRevokedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("currentPlan") WebhookPlanRef currentPlan, + @JsonProperty("revokedPlan") WebhookPlanRef revokedPlan, + @JsonProperty("billingInterval") String billingInterval, + @JsonProperty("revokedBillingInterval") String revokedBillingInterval +) {} diff --git a/src/main/java/co/commet/models/SubscriptionPlanChangeScheduledData.java b/src/main/java/co/commet/models/SubscriptionPlanChangeScheduledData.java new file mode 100644 index 0000000..1c49e9e --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionPlanChangeScheduledData.java @@ -0,0 +1,16 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionPlanChangeScheduledData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("currentPlan") WebhookPlanRef currentPlan, + @JsonProperty("scheduledPlan") WebhookPlanRef scheduledPlan, + @JsonProperty("billingInterval") String billingInterval, + @JsonProperty("scheduledBillingInterval") String scheduledBillingInterval, + @JsonProperty("effectiveAt") String effectiveAt +) {} diff --git a/src/main/java/co/commet/models/SubscriptionPlanChangedData.java b/src/main/java/co/commet/models/SubscriptionPlanChangedData.java new file mode 100644 index 0000000..cafb9fa --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionPlanChangedData.java @@ -0,0 +1,16 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionPlanChangedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("previousPlan") WebhookPlanRef previousPlan, + @JsonProperty("currentPlan") WebhookPlanRef currentPlan, + @JsonProperty("billingInterval") String billingInterval, + @JsonProperty("credit") Double credit, + @JsonProperty("charge") Double charge, + @JsonProperty("totalCharged") Double totalCharged +) {} diff --git a/src/main/java/co/commet/models/SubscriptionUpdatedData.java b/src/main/java/co/commet/models/SubscriptionUpdatedData.java new file mode 100644 index 0000000..8d670eb --- /dev/null +++ b/src/main/java/co/commet/models/SubscriptionUpdatedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record SubscriptionUpdatedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("canceledAt") String canceledAt, + @JsonProperty("cancelReason") String cancelReason, + @JsonProperty("endDate") String endDate +) {} diff --git a/src/main/java/co/commet/models/TrialCheckoutReadyData.java b/src/main/java/co/commet/models/TrialCheckoutReadyData.java new file mode 100644 index 0000000..1a14a89 --- /dev/null +++ b/src/main/java/co/commet/models/TrialCheckoutReadyData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record TrialCheckoutReadyData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("planName") String planName, + @JsonProperty("trialDays") double trialDays, + @JsonProperty("checkoutUrl") String checkoutUrl +) {} diff --git a/src/main/java/co/commet/models/TrialConvertedData.java b/src/main/java/co/commet/models/TrialConvertedData.java new file mode 100644 index 0000000..c5925ac --- /dev/null +++ b/src/main/java/co/commet/models/TrialConvertedData.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record TrialConvertedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName +) {} diff --git a/src/main/java/co/commet/models/TrialExpiredData.java b/src/main/java/co/commet/models/TrialExpiredData.java new file mode 100644 index 0000000..76387db --- /dev/null +++ b/src/main/java/co/commet/models/TrialExpiredData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record TrialExpiredData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName, + @JsonProperty("trialEndsAt") String trialEndsAt +) {} diff --git a/src/main/java/co/commet/models/TrialStartedData.java b/src/main/java/co/commet/models/TrialStartedData.java new file mode 100644 index 0000000..fbb791c --- /dev/null +++ b/src/main/java/co/commet/models/TrialStartedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record TrialStartedData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName, + @JsonProperty("trialEndsAt") String trialEndsAt +) {} diff --git a/src/main/java/co/commet/models/TrialWillEndData.java b/src/main/java/co/commet/models/TrialWillEndData.java new file mode 100644 index 0000000..7b0e3f5 --- /dev/null +++ b/src/main/java/co/commet/models/TrialWillEndData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record TrialWillEndData( + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("status") String status, + @JsonProperty("planId") String planId, + @JsonProperty("planName") String planName, + @JsonProperty("trialEndsAt") String trialEndsAt +) {} diff --git a/src/main/java/co/commet/models/UsageRecordedData.java b/src/main/java/co/commet/models/UsageRecordedData.java new file mode 100644 index 0000000..3b81a15 --- /dev/null +++ b/src/main/java/co/commet/models/UsageRecordedData.java @@ -0,0 +1,14 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record UsageRecordedData( + @JsonProperty("usageEventId") String usageEventId, + @JsonProperty("subscriptionId") String subscriptionId, + @JsonProperty("customerId") String customerId, + @JsonProperty("featureCode") String featureCode, + @JsonProperty("value") double value, + @JsonProperty("ts") String ts +) {} diff --git a/src/main/java/co/commet/models/WebhookAddonRef.java b/src/main/java/co/commet/models/WebhookAddonRef.java new file mode 100644 index 0000000..b5d8e4a --- /dev/null +++ b/src/main/java/co/commet/models/WebhookAddonRef.java @@ -0,0 +1,10 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookAddonRef( + @JsonProperty("id") String id, + @JsonProperty("name") String name +) {} diff --git a/src/main/java/co/commet/models/WebhookBalance.java b/src/main/java/co/commet/models/WebhookBalance.java new file mode 100644 index 0000000..f83258b --- /dev/null +++ b/src/main/java/co/commet/models/WebhookBalance.java @@ -0,0 +1,9 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookBalance( + @JsonProperty("currentBalance") double currentBalance +) {} diff --git a/src/main/java/co/commet/models/WebhookBankRef.java b/src/main/java/co/commet/models/WebhookBankRef.java new file mode 100644 index 0000000..5f92a47 --- /dev/null +++ b/src/main/java/co/commet/models/WebhookBankRef.java @@ -0,0 +1,10 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookBankRef( + @JsonProperty("bankName") String bankName, + @JsonProperty("last4") String last4 +) {} diff --git a/src/main/java/co/commet/models/WebhookCardInfo.java b/src/main/java/co/commet/models/WebhookCardInfo.java new file mode 100644 index 0000000..ee2e350 --- /dev/null +++ b/src/main/java/co/commet/models/WebhookCardInfo.java @@ -0,0 +1,12 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookCardInfo( + @JsonProperty("brand") String brand, + @JsonProperty("last4") String last4, + @JsonProperty("expMonth") long expMonth, + @JsonProperty("expYear") long expYear +) {} diff --git a/src/main/java/co/commet/models/WebhookCreditsBalance.java b/src/main/java/co/commet/models/WebhookCreditsBalance.java new file mode 100644 index 0000000..b09d361 --- /dev/null +++ b/src/main/java/co/commet/models/WebhookCreditsBalance.java @@ -0,0 +1,11 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookCreditsBalance( + @JsonProperty("planCredits") double planCredits, + @JsonProperty("purchasedCredits") double purchasedCredits, + @JsonProperty("totalCredits") double totalCredits +) {} diff --git a/src/main/java/co/commet/models/WebhookEventType.java b/src/main/java/co/commet/models/WebhookEventType.java new file mode 100644 index 0000000..54c6430 --- /dev/null +++ b/src/main/java/co/commet/models/WebhookEventType.java @@ -0,0 +1,72 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public enum WebhookEventType { + SUBSCRIPTION_CREATED("subscription.created"), + SUBSCRIPTION_ACTIVATED("subscription.activated"), + SUBSCRIPTION_CANCELED("subscription.canceled"), + SUBSCRIPTION_UPDATED("subscription.updated"), + SUBSCRIPTION_PLAN_CHANGED("subscription.plan_changed"), + SUBSCRIPTION_CANCELLATION_SCHEDULED("subscription.cancellation_scheduled"), + SUBSCRIPTION_CANCELLATION_REVOKED("subscription.cancellation_revoked"), + SUBSCRIPTION_PLAN_CHANGE_SCHEDULED("subscription.plan_change_scheduled"), + SUBSCRIPTION_PLAN_CHANGE_REVOKED("subscription.plan_change_revoked"), + SUBSCRIPTION_PAST_DUE("subscription.past_due"), + TRIAL_STARTED("trial.started"), + TRIAL_CONVERTED("trial.converted"), + TRIAL_EXPIRED("trial.expired"), + TRIAL_WILL_END("trial.will_end"), + TRIAL_CHECKOUT_READY("trial.checkout_ready"), + CHECKOUT_READY("checkout.ready"), + PAYMENT_RECEIVED("payment.received"), + PAYMENT_FAILED("payment.failed"), + PAYMENT_RECOVERED("payment.recovered"), + PAYMENT_REFUNDED("payment.refunded"), + PAYMENT_DISPUTED("payment.disputed"), + PAYMENT_DISPUTE_RESOLVED("payment.dispute_resolved"), + INVOICE_CREATED("invoice.created"), + INVOICE_UPCOMING("invoice.upcoming"), + INVOICE_OVERDUE("invoice.overdue"), + INVOICE_VOIDED("invoice.voided"), + PAYMENT_METHOD_ATTACHED("payment_method.attached"), + PAYMENT_METHOD_UPDATED("payment_method.updated"), + CUSTOMER_CREATED("customer.created"), + CUSTOMER_UPDATED("customer.updated"), + CUSTOMER_STATE_CHANGED("customer.state_changed"), + CREDITS_GRANTED("credits.granted"), + CREDITS_PURCHASED("credits.purchased"), + CREDITS_LOW("credits.low"), + CREDITS_DEPLETED("credits.depleted"), + CREDITS_EXPIRED("credits.expired"), + BALANCE_TOPPED_UP("balance.topped_up"), + BALANCE_LOW("balance.low"), + BALANCE_DEPLETED("balance.depleted"), + QUOTA_THRESHOLD_REACHED("quota.threshold_reached"), + QUOTA_EXCEEDED("quota.exceeded"), + USAGE_RECORDED("usage.recorded"), + SEATS_UPDATED("seats.updated"), + SEATS_LIMIT_REACHED("seats.limit_reached"), + ADDON_ACTIVATED("addon.activated"), + ADDON_DEACTIVATED("addon.deactivated"), + PAYOUT_AVAILABLE("payout.available"), + PAYOUT_CREATED("payout.created"), + PAYOUT_PAID("payout.paid"), + PAYOUT_FAILED("payout.failed"); + + private final String value; + + WebhookEventType(String value) { this.value = value; } + + @JsonValue + public String getValue() { return value; } + + @JsonCreator + public static WebhookEventType fromValue(String value) { + for (WebhookEventType type : values()) { + if (type.value.equals(value)) return type; + } + throw new IllegalArgumentException("Unknown WebhookEventType: " + value); + } +} diff --git a/src/main/java/co/commet/models/WebhookFeatureAccess.java b/src/main/java/co/commet/models/WebhookFeatureAccess.java new file mode 100644 index 0000000..8c5889d --- /dev/null +++ b/src/main/java/co/commet/models/WebhookFeatureAccess.java @@ -0,0 +1,21 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookFeatureAccess( + @JsonProperty("code") String code, + @JsonProperty("name") String name, + @JsonProperty("type") String type, + @JsonProperty("allowed") boolean allowed, + @JsonProperty("enabled") Boolean enabled, + @JsonProperty("current") Double current, + @JsonProperty("included") Double included, + @JsonProperty("remaining") Double remaining, + @JsonProperty("overageQuantity") Double overageQuantity, + @JsonProperty("overageUnitPrice") Double overageUnitPrice, + @JsonProperty("unlimited") Boolean unlimited, + @JsonProperty("overageEnabled") Boolean overageEnabled, + @JsonProperty("billedQuantity") Double billedQuantity +) {} diff --git a/src/main/java/co/commet/models/WebhookPlanRef.java b/src/main/java/co/commet/models/WebhookPlanRef.java new file mode 100644 index 0000000..1b86f67 --- /dev/null +++ b/src/main/java/co/commet/models/WebhookPlanRef.java @@ -0,0 +1,10 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookPlanRef( + @JsonProperty("id") String id, + @JsonProperty("name") String name +) {} diff --git a/src/main/java/co/commet/models/WebhookSeatSummary.java b/src/main/java/co/commet/models/WebhookSeatSummary.java new file mode 100644 index 0000000..b12058e --- /dev/null +++ b/src/main/java/co/commet/models/WebhookSeatSummary.java @@ -0,0 +1,13 @@ +package co.commet.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public record WebhookSeatSummary( + @JsonProperty("code") String code, + @JsonProperty("current") Double current, + @JsonProperty("included") Double included, + @JsonProperty("remaining") Double remaining, + @JsonProperty("unlimited") Boolean unlimited +) {} diff --git a/src/main/java/co/commet/resources/Webhooks.java b/src/main/java/co/commet/resources/Webhooks.java index a11753d..2a5074c 100644 --- a/src/main/java/co/commet/resources/Webhooks.java +++ b/src/main/java/co/commet/resources/Webhooks.java @@ -2,6 +2,7 @@ import co.commet.ApiResponse; import co.commet.CommetHttpClient; +import co.commet.WebhookEvent; import co.commet.models.DeleteResult; import co.commet.models.WebhookEndpoint; import co.commet.models.WebhookTestResult; @@ -43,13 +44,13 @@ public boolean verify(String payload, String signature, String secret) { return constantTimeEquals(signature, expected); } - public Map verifyAndParse(String rawBody, String signature, String secret) { + public WebhookEvent verifyAndParse(String rawBody, String signature, String secret) { if (!verify(rawBody, signature, secret)) { return null; } try { - return objectMapper.readValue(rawBody, new TypeReference<>() {}); + return objectMapper.readValue(rawBody, WebhookEvent.class); } catch (Exception e) { return null; } diff --git a/src/test/java/co/commet/WebhooksTest.java b/src/test/java/co/commet/WebhooksTest.java index e2dbba9..9ad5dac 100644 --- a/src/test/java/co/commet/WebhooksTest.java +++ b/src/test/java/co/commet/WebhooksTest.java @@ -1,5 +1,7 @@ package co.commet; +import co.commet.models.CustomerCreatedData; +import co.commet.models.WebhookEventType; import co.commet.resources.Webhooks; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -7,7 +9,6 @@ import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; -import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @@ -30,14 +31,35 @@ void validSignaturePasses() { } @Test - void validSignatureReturnsPayloadOnVerifyAndParse() { - String payload = "{\"event\":\"subscription.created\",\"data\":{\"id\":\"sub_123\"}}"; + void validSignatureReturnsTypedEventOnVerifyAndParse() { + String payload = "{\"event\":\"subscription.created\",\"timestamp\":\"2026-01-01T00:00:00Z\"," + + "\"organizationId\":\"org_1\",\"mode\":\"live\",\"apiVersion\":\"2025-01-01\"," + + "\"data\":{\"subscriptionId\":\"sub_123\"}}"; + String signature = computeHmac(payload, SECRET); + + WebhookEvent event = webhooks.verifyAndParse(payload, signature, SECRET); + + assertNotNull(event); + assertEquals(WebhookEventType.SUBSCRIPTION_CREATED, event.event()); + assertEquals("org_1", event.organizationId()); + } + + @Test + void verifyAndParseNarrowsToTypedPayloadRecord() { + String payload = "{\"event\":\"customer.created\",\"timestamp\":\"2026-01-01T00:00:00Z\"," + + "\"organizationId\":\"org_1\",\"mode\":\"live\",\"apiVersion\":\"2025-01-01\"," + + "\"data\":{\"id\":\"cus_123\",\"email\":\"ada@example.com\"," + + "\"createdAt\":\"2026-01-01T00:00:00Z\",\"updatedAt\":\"2026-01-01T00:00:00Z\"}}"; String signature = computeHmac(payload, SECRET); - Map result = webhooks.verifyAndParse(payload, signature, SECRET); + WebhookEvent event = webhooks.verifyAndParse(payload, signature, SECRET); + + assertNotNull(event); + assertEquals(WebhookEventType.CUSTOMER_CREATED, event.event()); - assertNotNull(result); - assertEquals("subscription.created", result.get("event")); + CustomerCreatedData data = event.asCustomerCreated(); + assertEquals("cus_123", data.id()); + assertEquals("ada@example.com", data.email()); } @Test