Merge branch 'main' of github.com:juspay/hyperswitch into subscriptions-saved-pm

This commit is contained in:
Sarthak Soni
2025-10-27 16:09:56 +05:30
80 changed files with 2093 additions and 797 deletions

View File

@ -243,6 +243,7 @@ pub enum PayoutMethodData {
Bank(Bank),
Wallet(Wallet),
BankRedirect(BankRedirect),
Passthrough(Passthrough),
}
impl Default for PayoutMethodData {
@ -393,6 +394,18 @@ pub struct Interac {
pub email: Email,
}
#[derive(Eq, PartialEq, Clone, Debug, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub struct Passthrough {
/// PSP token generated for the payout method
#[schema(value_type = String, example = "token_12345")]
pub psp_token: Secret<String>,
/// Payout method type of the token
#[schema(value_type = PaymentMethodType, example = "paypal")]
pub token_type: api_enums::PaymentMethodType,
}
#[derive(Default, Eq, PartialEq, Clone, Debug, Deserialize, Serialize, ToSchema)]
pub struct Paypal {
/// Email linked with paypal account
@ -638,6 +651,8 @@ pub enum PayoutMethodDataResponse {
Wallet(Box<payout_method_utils::WalletAdditionalData>),
#[schema(value_type = BankRedirectAdditionalData)]
BankRedirect(Box<payout_method_utils::BankRedirectAdditionalData>),
#[schema(value_type = PassthroughAddtionalData)]
Passthrough(Box<payout_method_utils::PassthroughAddtionalData>),
}
#[derive(
@ -1048,6 +1063,15 @@ impl From<BankRedirect> for payout_method_utils::BankRedirectAdditionalData {
}
}
impl From<Passthrough> for payout_method_utils::PassthroughAddtionalData {
fn from(passthrough_data: Passthrough) -> Self {
Self {
psp_token: passthrough_data.psp_token.into(),
token_type: passthrough_data.token_type,
}
}
}
impl From<payout_method_utils::AdditionalPayoutMethodData> for PayoutMethodDataResponse {
fn from(additional_data: payout_method_utils::AdditionalPayoutMethodData) -> Self {
match additional_data {
@ -1063,6 +1087,9 @@ impl From<payout_method_utils::AdditionalPayoutMethodData> for PayoutMethodDataR
payout_method_utils::AdditionalPayoutMethodData::BankRedirect(bank_redirect) => {
Self::BankRedirect(bank_redirect)
}
payout_method_utils::AdditionalPayoutMethodData::Passthrough(passthrough) => {
Self::Passthrough(passthrough)
}
}
}
}

View File

@ -1,4 +1,4 @@
use common_enums::connector_enums::InvoiceStatus;
use common_enums::{connector_enums::InvoiceStatus, SubscriptionStatus};
use common_types::payments::CustomerAcceptance;
use common_utils::{
errors::ValidationError,
@ -96,43 +96,6 @@ pub struct SubscriptionResponse {
pub invoice: Option<Invoice>,
}
/// Possible states of a subscription lifecycle.
///
/// - `Created`: Subscription was created but not yet activated.
/// - `Active`: Subscription is currently active.
/// - `InActive`: Subscription is inactive.
/// - `Pending`: Subscription is pending activation.
/// - `Trial`: Subscription is in a trial period.
/// - `Paused`: Subscription is paused.
/// - `Unpaid`: Subscription is unpaid.
/// - `Onetime`: Subscription is a one-time payment.
/// - `Cancelled`: Subscription has been cancelled.
/// - `Failed`: Subscription has failed.
#[derive(Debug, Clone, serde::Serialize, strum::EnumString, strum::Display, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum SubscriptionStatus {
/// Subscription is active.
Active,
/// Subscription is created but not yet active.
Created,
/// Subscription is inactive.
InActive,
/// Subscription is in pending state.
Pending,
/// Subscription is in trial state.
Trial,
/// Subscription is paused.
Paused,
/// Subscription is unpaid.
Unpaid,
/// Subscription is a one-time payment.
Onetime,
/// Subscription is cancelled.
Cancelled,
/// Subscription has failed.
Failed,
}
impl SubscriptionResponse {
/// Creates a new [`CreateSubscriptionResponse`] with the given identifiers.
///
@ -381,6 +344,12 @@ pub struct PaymentResponseData {
pub payment_token: Option<String>,
}
impl PaymentResponseData {
pub fn get_billing_address(&self) -> Option<Address> {
self.billing.clone()
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
pub struct CreateMitPaymentRequestData {
pub amount: MinorUnit,
@ -498,6 +467,18 @@ pub struct ConfirmSubscriptionResponse {
pub billing_processor_subscription_id: Option<String>,
}
impl ConfirmSubscriptionResponse {
pub fn get_optional_invoice_id(&self) -> Option<InvoiceId> {
self.invoice.as_ref().map(|invoice| invoice.id.to_owned())
}
pub fn get_optional_payment_id(&self) -> Option<PaymentId> {
self.payment
.as_ref()
.map(|payment| payment.payment_id.to_owned())
}
}
#[derive(Debug, Clone, serde::Serialize, ToSchema)]
pub struct Invoice {
/// Unique identifier for the invoice.
@ -533,6 +514,9 @@ pub struct Invoice {
/// Status of the invoice.
pub status: InvoiceStatus,
/// billing processor invoice id
pub billing_processor_invoice_id: Option<String>,
}
impl ApiEventMetric for ConfirmSubscriptionResponse {}

View File

@ -5,7 +5,7 @@ use utoipa::ToSchema;
#[cfg(feature = "payouts")]
use crate::payouts;
use crate::{disputes, enums as api_enums, mandates, payments, refunds};
use crate::{disputes, enums as api_enums, mandates, payments, refunds, subscription};
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize, Copy)]
#[serde(rename_all = "snake_case")]
@ -446,6 +446,8 @@ pub enum OutgoingWebhookContent {
#[cfg(feature = "payouts")]
#[schema(value_type = PayoutCreateResponse, title = "PayoutCreateResponse")]
PayoutDetails(Box<payouts::PayoutCreateResponse>),
#[schema(value_type = ConfirmSubscriptionResponse, title = "ConfirmSubscriptionResponse")]
SubscriptionDetails(Box<subscription::ConfirmSubscriptionResponse>),
}
#[derive(Debug, Clone, Serialize, ToSchema)]