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)]
pub struct ConfirmSubscriptionPaymentDetails {
pub shipping: Option<Address>,
pub billing: Option<Address>,
pub payment_method: api_enums::PaymentMethod,
pub payment_method_type: Option<api_enums::PaymentMethodType>,
pub payment_method_data: PaymentMethodDataRequest,
@ -305,6 +306,8 @@ pub struct PaymentResponseData {
pub error_message: Option<String>,
pub payment_method_type: Option<api_enums::PaymentMethodType>,
pub client_secret: Option<Secret<String>>,
pub billing: Option<Address>,
pub shipping: Option<Address>,
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
.payment_method_data
.billing
.clone()
.ok_or(error_stack::report!(
ValidationError::MissingRequiredField {
field_name: "billing".to_string()
}
))
.as_ref()
.or(self.payment_details.billing.as_ref())
.cloned()
}
}
@ -394,6 +394,16 @@ pub struct CreateAndConfirmSubscriptionRequest {
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 {}
#[derive(Debug, Clone, serde::Serialize, ToSchema)]

View File

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

View File

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

View File

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