From c9bfb89f7eb03d73d5af3fe2bcd7632347ec17b4 Mon Sep 17 00:00:00 2001 From: Swangi Kumari <85639103+swangi-kumari@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:24:32 +0530 Subject: [PATCH] refactor(payment_method): [Klarna] store and populate payment_type for klarna_sdk Paylater in response (#4956) --- crates/api_models/src/payments.rs | 40 +++++++++++++++++-- .../src/router_data.rs | 8 ++++ .../src/connector/klarna/transformers.rs | 30 ++++++++++++++ crates/router/src/core/payments/helpers.rs | 12 +++++- 4 files changed, 85 insertions(+), 5 deletions(-) diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index c2418d78ec..d4acd6ae2a 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -1814,7 +1814,9 @@ pub enum AdditionalPaymentData { Wallet { apple_pay: Option, }, - PayLater {}, + PayLater { + klarna_sdk: Option, + }, BankTransfer {}, Crypto {}, BankDebit {}, @@ -1828,6 +1830,12 @@ pub enum AdditionalPaymentData { CardToken {}, } +#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)] + +pub struct KlarnaSdkPaymentMethod { + pub payment_type: Option, +} + #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum BankRedirectData { @@ -2761,7 +2769,7 @@ where | PaymentMethodDataResponse::Crypto {} | PaymentMethodDataResponse::MandatePayment {} | PaymentMethodDataResponse::GiftCard {} - | PaymentMethodDataResponse::PayLater {} + | PaymentMethodDataResponse::PayLater(_) | PaymentMethodDataResponse::Paypal {} | PaymentMethodDataResponse::RealTimePayment {} | PaymentMethodDataResponse::Upi {} @@ -2787,7 +2795,7 @@ pub enum PaymentMethodDataResponse { Card(Box), BankTransfer {}, Wallet {}, - PayLater {}, + PayLater(Box), Paypal {}, BankRedirect {}, Crypto {}, @@ -2802,6 +2810,17 @@ pub enum PaymentMethodDataResponse { CardToken {}, } +#[derive(Eq, PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] +pub struct PaylaterResponse { + klarna_sdk: Option, +} + +#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)] + +pub struct KlarnaSdkPaymentMethodResponse { + pub payment_type: Option, +} + #[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, ToSchema, serde::Serialize)] pub struct PaymentMethodDataResponseWithBilling { // The struct is flattened in order to provide backwards compatibility @@ -3900,11 +3919,24 @@ impl From for CardResponse { } } +impl From for PaylaterResponse { + fn from(klarna_sdk: KlarnaSdkPaymentMethod) -> Self { + Self { + klarna_sdk: Some(KlarnaSdkPaymentMethodResponse { + payment_type: klarna_sdk.payment_type, + }), + } + } +} + impl From for PaymentMethodDataResponse { fn from(payment_method_data: AdditionalPaymentData) -> Self { match payment_method_data { AdditionalPaymentData::Card(card) => Self::Card(Box::new(CardResponse::from(*card))), - AdditionalPaymentData::PayLater {} => Self::PayLater {}, + AdditionalPaymentData::PayLater { klarna_sdk } => match klarna_sdk { + Some(sdk) => Self::PayLater(Box::new(PaylaterResponse::from(sdk))), + None => Self::PayLater(Box::new(PaylaterResponse { klarna_sdk: None })), + }, AdditionalPaymentData::Wallet { .. } => Self::Wallet {}, AdditionalPaymentData::BankRedirect { .. } => Self::BankRedirect {}, AdditionalPaymentData::Crypto {} => Self::Crypto {}, diff --git a/crates/hyperswitch_domain_models/src/router_data.rs b/crates/hyperswitch_domain_models/src/router_data.rs index 01feefaa6c..79f0c78b7b 100644 --- a/crates/hyperswitch_domain_models/src/router_data.rs +++ b/crates/hyperswitch_domain_models/src/router_data.rs @@ -173,6 +173,14 @@ pub enum AdditionalPaymentMethodConnectorResponse { /// Various payment checks that are done for a payment payment_checks: Option, }, + PayLater { + klarna_sdk: Option, + }, +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct KlarnaSdkResponse { + pub payment_type: Option, } #[derive(Clone, Debug, serde::Serialize)] diff --git a/crates/router/src/connector/klarna/transformers.rs b/crates/router/src/connector/klarna/transformers.rs index a3d84a3546..ab3463e367 100644 --- a/crates/router/src/connector/klarna/transformers.rs +++ b/crates/router/src/connector/klarna/transformers.rs @@ -1,6 +1,7 @@ use api_models::payments; use common_utils::pii; use error_stack::{report, ResultExt}; +use hyperswitch_domain_models::router_data::KlarnaSdkResponse; use masking::{ExposeInterface, Secret}; use serde::{Deserialize, Serialize}; @@ -84,6 +85,23 @@ pub struct KlarnaPaymentsRequest { pub struct KlarnaPaymentsResponse { order_id: String, fraud_status: KlarnaFraudStatus, + authorized_payment_method: Option, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct AuthorizedPaymentMethod { + #[serde(rename = "type")] + payment_type: String, +} + +impl From for types::AdditionalPaymentMethodConnectorResponse { + fn from(item: AuthorizedPaymentMethod) -> Self { + Self::PayLater { + klarna_sdk: Some(KlarnaSdkResponse { + payment_type: Some(item.payment_type), + }), + } + } } #[derive(Debug, Serialize)] @@ -236,6 +254,17 @@ impl TryFrom> fn try_from( item: types::PaymentsResponseRouterData, ) -> Result { + let connector_response = types::ConnectorResponseData::with_additional_payment_method_data( + match item.response.authorized_payment_method { + Some(authorized_payment_method) => { + types::AdditionalPaymentMethodConnectorResponse::from(authorized_payment_method) + } + None => { + types::AdditionalPaymentMethodConnectorResponse::PayLater { klarna_sdk: None } + } + }, + ); + Ok(Self { response: Ok(types::PaymentsResponseData::TransactionResponse { resource_id: types::ResponseId::ConnectorTransactionId( @@ -253,6 +282,7 @@ impl TryFrom> item.response.fraud_status, item.data.request.is_auto_capture()?, )), + connector_response: Some(connector_response), ..item.data }) } diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index e9a793efb8..93876cdd54 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -18,6 +18,7 @@ use futures::future::Either; use hyperswitch_domain_models::{ mandates::MandateData, payments::{payment_attempt::PaymentAttempt, PaymentIntent}, + router_data::KlarnaSdkResponse, }; use josekit::jwe; use masking::{ExposeInterface, PeekInterface}; @@ -3857,7 +3858,7 @@ pub async fn get_additional_payment_data( _ => api_models::payments::AdditionalPaymentData::Wallet { apple_pay: None }, }, api_models::payments::PaymentMethodData::PayLater(_) => { - api_models::payments::AdditionalPaymentData::PayLater {} + api_models::payments::AdditionalPaymentData::PayLater { klarna_sdk: None } } api_models::payments::PaymentMethodData::BankTransfer(_) => { api_models::payments::AdditionalPaymentData::BankTransfer {} @@ -4501,6 +4502,15 @@ pub fn add_connector_response_to_additional_payment_data( ..*additional_card_data.clone() }, )), + ( + api_models::payments::AdditionalPaymentData::PayLater { .. }, + AdditionalPaymentMethodConnectorResponse::PayLater { + klarna_sdk: Some(KlarnaSdkResponse { payment_type }), + }, + ) => api_models::payments::AdditionalPaymentData::PayLater { + klarna_sdk: Some(api_models::payments::KlarnaSdkPaymentMethod { payment_type }), + }, + _ => additional_payment_data, } }