feat(core): allow setting up status across payments, refunds and payouts for triggering webhooks in core resource flows (#8433)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Kashif
2025-06-30 12:38:04 +05:30
committed by GitHub
parent 78e837b171
commit d305fad2e6
20 changed files with 545 additions and 189 deletions

View File

@ -702,6 +702,58 @@ pub struct WebhookDetails {
/// If this property is true, a webhook message is posted whenever a payment fails
#[schema(example = true)]
pub payment_failed_enabled: Option<bool>,
/// List of payment statuses that triggers a webhook for payment intents
#[schema(value_type = Vec<IntentStatus>, example = json!(["succeeded", "failed", "partially_captured", "requires_merchant_action"]))]
pub payment_statuses_enabled: Option<Vec<api_enums::IntentStatus>>,
/// List of refund statuses that triggers a webhook for refunds
#[schema(value_type = Vec<IntentStatus>, example = json!(["success", "failure"]))]
pub refund_statuses_enabled: Option<Vec<api_enums::RefundStatus>>,
/// List of payout statuses that triggers a webhook for payouts
#[cfg(feature = "payouts")]
#[schema(value_type = Option<Vec<PayoutStatus>>, example = json!(["success", "failed"]))]
pub payout_statuses_enabled: Option<Vec<api_enums::PayoutStatus>>,
}
impl WebhookDetails {
fn validate_statuses<T>(statuses: &[T], status_type_name: &str) -> Result<(), String>
where
T: strum::IntoEnumIterator + Copy + PartialEq + std::fmt::Debug,
T: Into<Option<api_enums::EventType>>,
{
let valid_statuses: Vec<T> = T::iter().filter(|s| (*s).into().is_some()).collect();
for status in statuses {
if !valid_statuses.contains(status) {
return Err(format!(
"Invalid {} webhook status provided: {:?}",
status_type_name, status
));
}
}
Ok(())
}
pub fn validate(&self) -> Result<(), String> {
if let Some(payment_statuses) = &self.payment_statuses_enabled {
Self::validate_statuses(payment_statuses, "payment")?;
}
if let Some(refund_statuses) = &self.refund_statuses_enabled {
Self::validate_statuses(refund_statuses, "refund")?;
}
#[cfg(feature = "payouts")]
{
if let Some(payout_statuses) = &self.payout_statuses_enabled {
Self::validate_statuses(payout_statuses, "payout")?;
}
}
Ok(())
}
}
#[derive(Debug, Serialize, ToSchema)]