refactor: Refactored Response types for subscription APIs (#9788)

This commit is contained in:
Sarthak Soni
2025-10-13 15:53:18 +05:30
committed by GitHub
parent f616ffcdd1
commit 435bc11776
4 changed files with 34 additions and 17 deletions

View File

@ -212,6 +212,7 @@ impl ApiEventMetric for GetPlansResponse {}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
pub struct ConfirmSubscriptionPaymentDetails { pub struct ConfirmSubscriptionPaymentDetails {
pub shipping: Option<Address>, pub shipping: Option<Address>,
pub billing: Option<Address>,
pub payment_method: api_enums::PaymentMethod, pub payment_method: api_enums::PaymentMethod,
pub payment_method_type: Option<api_enums::PaymentMethodType>, pub payment_method_type: Option<api_enums::PaymentMethodType>,
pub payment_method_data: PaymentMethodDataRequest, pub payment_method_data: PaymentMethodDataRequest,
@ -305,6 +306,8 @@ pub struct PaymentResponseData {
pub error_message: Option<String>, pub error_message: Option<String>,
pub payment_method_type: Option<api_enums::PaymentMethodType>, pub payment_method_type: Option<api_enums::PaymentMethodType>,
pub client_secret: Option<Secret<String>>, pub client_secret: Option<Secret<String>>,
pub billing: Option<Address>,
pub shipping: Option<Address>,
pub payment_type: Option<api_enums::PaymentType>, pub payment_type: Option<api_enums::PaymentType>,
} }
@ -346,16 +349,13 @@ impl ConfirmSubscriptionRequest {
)) ))
} }
pub fn get_billing_address(&self) -> Result<Address, error_stack::Report<ValidationError>> { pub fn get_billing_address(&self) -> Option<Address> {
self.payment_details self.payment_details
.payment_method_data .payment_method_data
.billing .billing
.clone() .as_ref()
.ok_or(error_stack::report!( .or(self.payment_details.billing.as_ref())
ValidationError::MissingRequiredField { .cloned()
field_name: "billing".to_string()
}
))
} }
} }
@ -394,6 +394,16 @@ pub struct CreateAndConfirmSubscriptionRequest {
pub merchant_reference_id: Option<String>, pub merchant_reference_id: Option<String>,
} }
impl CreateAndConfirmSubscriptionRequest {
pub fn get_billing_address(&self) -> Option<Address> {
self.payment_details
.payment_method_data
.as_ref()
.and_then(|data| data.billing.clone())
.or(self.billing.clone())
}
}
impl ApiEventMetric for CreateAndConfirmSubscriptionRequest {} impl ApiEventMetric for CreateAndConfirmSubscriptionRequest {}
#[derive(Debug, Clone, serde::Serialize, ToSchema)] #[derive(Debug, Clone, serde::Serialize, ToSchema)]

View File

@ -189,7 +189,7 @@ pub async fn create_and_confirm_subscription(
&state, &state,
customer.clone(), customer.clone(),
request.customer_id.clone(), request.customer_id.clone(),
request.billing.clone(), request.get_billing_address(),
request request
.payment_details .payment_details
.payment_method_data .payment_method_data
@ -212,7 +212,7 @@ pub async fn create_and_confirm_subscription(
&state, &state,
subs_handler.subscription.clone(), subs_handler.subscription.clone(),
request.item_price_id.clone(), request.item_price_id.clone(),
request.billing.clone(), request.get_billing_address(),
) )
.await?; .await?;
@ -271,6 +271,8 @@ pub async fn create_and_confirm_subscription(
&invoice_entry, &invoice_entry,
&payment_response, &payment_response,
subscription_create_response.status, subscription_create_response.status,
request.plan_id.clone(),
request.item_price_id.clone(),
)?; )?;
Ok(ApplicationResponse::Json(response)) Ok(ApplicationResponse::Json(response))
@ -337,11 +339,12 @@ pub async fn confirm_subscription(
&state, &state,
customer.clone(), customer.clone(),
subscription.customer_id.clone(), subscription.customer_id.clone(),
request.payment_details.payment_method_data.billing.clone(), request.get_billing_address(),
request request
.payment_details .payment_details
.payment_method_data .payment_method_data
.payment_method_data, .payment_method_data
.clone(),
) )
.await?; .await?;
let _customer_updated_response = SubscriptionHandler::update_connector_customer_id_in_customer( let _customer_updated_response = SubscriptionHandler::update_connector_customer_id_in_customer(
@ -358,8 +361,8 @@ pub async fn confirm_subscription(
.create_subscription_on_connector( .create_subscription_on_connector(
&state, &state,
subscription, subscription,
request.item_price_id, request.item_price_id.clone(),
request.payment_details.payment_method_data.billing, request.get_billing_address(),
) )
.await?; .await?;
@ -406,6 +409,8 @@ pub async fn confirm_subscription(
&invoice_entry, &invoice_entry,
&payment_response, &payment_response,
subscription_create_response.status, subscription_create_response.status,
request.plan_id.clone(),
request.item_price_id.clone(),
)?; )?;
Ok(ApplicationResponse::Json(response)) Ok(ApplicationResponse::Json(response))

View File

@ -176,7 +176,7 @@ impl InvoiceHandler {
currency, currency,
confirm: true, confirm: true,
customer_id: Some(self.subscription.customer_id.clone()), customer_id: Some(self.subscription.customer_id.clone()),
billing: request.billing.clone(), billing: request.get_billing_address(),
shipping: request.shipping.clone(), shipping: request.shipping.clone(),
profile_id: Some(self.profile.get_id().clone()), profile_id: Some(self.profile.get_id().clone()),
setup_future_usage: payment_details.setup_future_usage, setup_future_usage: payment_details.setup_future_usage,
@ -206,7 +206,7 @@ impl InvoiceHandler {
) -> errors::RouterResult<subscription_types::PaymentResponseData> { ) -> errors::RouterResult<subscription_types::PaymentResponseData> {
let payment_details = &request.payment_details; let payment_details = &request.payment_details;
let cit_payment_request = subscription_types::ConfirmPaymentsRequestData { let cit_payment_request = subscription_types::ConfirmPaymentsRequestData {
billing: request.payment_details.payment_method_data.billing.clone(), billing: request.get_billing_address(),
shipping: request.payment_details.shipping.clone(), shipping: request.payment_details.shipping.clone(),
profile_id: Some(self.profile.get_id().clone()), profile_id: Some(self.profile.get_id().clone()),
payment_method: payment_details.payment_method, payment_method: payment_details.payment_method,

View File

@ -288,16 +288,18 @@ impl SubscriptionWithHandler<'_> {
invoice: &hyperswitch_domain_models::invoice::Invoice, invoice: &hyperswitch_domain_models::invoice::Invoice,
payment_response: &subscription_types::PaymentResponseData, payment_response: &subscription_types::PaymentResponseData,
status: subscription_response_types::SubscriptionStatus, status: subscription_response_types::SubscriptionStatus,
plan_id: Option<String>,
price_id: Option<String>,
) -> errors::RouterResult<subscription_types::ConfirmSubscriptionResponse> { ) -> errors::RouterResult<subscription_types::ConfirmSubscriptionResponse> {
Ok(subscription_types::ConfirmSubscriptionResponse { Ok(subscription_types::ConfirmSubscriptionResponse {
id: self.subscription.id.clone(), id: self.subscription.id.clone(),
merchant_reference_id: self.subscription.merchant_reference_id.clone(), merchant_reference_id: self.subscription.merchant_reference_id.clone(),
status: subscription_types::SubscriptionStatus::from(status), status: subscription_types::SubscriptionStatus::from(status),
plan_id: None, plan_id,
profile_id: self.subscription.profile_id.to_owned(), profile_id: self.subscription.profile_id.to_owned(),
payment: Some(payment_response.clone()), payment: Some(payment_response.clone()),
customer_id: Some(self.subscription.customer_id.clone()), customer_id: Some(self.subscription.customer_id.clone()),
price_id: None, price_id,
coupon: None, coupon: None,
billing_processor_subscription_id: self.subscription.connector_subscription_id.clone(), billing_processor_subscription_id: self.subscription.connector_subscription_id.clone(),
invoice: Some(subscription_types::Invoice::foreign_try_from(invoice)?), invoice: Some(subscription_types::Invoice::foreign_try_from(invoice)?),