mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 04:04:55 +08:00
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:
@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user