mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-04 05:59:48 +08:00 
			
		
		
		
	feat(klarna): wallet payment through klarna (#182)
This commit is contained in:
		@ -144,7 +144,7 @@ pub trait Domain<F: Clone, R>: Send + Sync {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[async_trait]
 | 
			
		||||
pub trait UpdateTracker<F, D, R>: Send {
 | 
			
		||||
pub trait UpdateTracker<F, D, Req>: Send {
 | 
			
		||||
    async fn update_trackers<'b>(
 | 
			
		||||
        &'b self,
 | 
			
		||||
        db: &dyn StorageInterface,
 | 
			
		||||
@ -152,7 +152,7 @@ pub trait UpdateTracker<F, D, R>: Send {
 | 
			
		||||
        payment_data: D,
 | 
			
		||||
        customer: Option<Customer>,
 | 
			
		||||
        storage_scheme: enums::MerchantStorageScheme,
 | 
			
		||||
    ) -> RouterResult<(BoxedOperation<'b, F, R>, D)>
 | 
			
		||||
    ) -> RouterResult<(BoxedOperation<'b, F, Req>, D)>
 | 
			
		||||
    where
 | 
			
		||||
        F: 'b + Send;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -509,6 +509,7 @@ impl PaymentCreate {
 | 
			
		||||
            billing_address_id,
 | 
			
		||||
            statement_descriptor_name: request.statement_descriptor_name.clone(),
 | 
			
		||||
            statement_descriptor_suffix: request.statement_descriptor_suffix.clone(),
 | 
			
		||||
            metadata: request.metadata.clone(),
 | 
			
		||||
            ..storage::PaymentIntentNew::default()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -157,11 +157,11 @@ impl<F: Clone> UpdateTracker<F, PaymentData<F>, api::PaymentsSessionRequest> for
 | 
			
		||||
    #[instrument(skip_all)]
 | 
			
		||||
    async fn update_trackers<'b>(
 | 
			
		||||
        &'b self,
 | 
			
		||||
        _db: &dyn StorageInterface,
 | 
			
		||||
        db: &dyn StorageInterface,
 | 
			
		||||
        _payment_id: &api::PaymentIdType,
 | 
			
		||||
        payment_data: PaymentData<F>,
 | 
			
		||||
        mut payment_data: PaymentData<F>,
 | 
			
		||||
        _customer: Option<storage::Customer>,
 | 
			
		||||
        _storage_scheme: enums::MerchantStorageScheme,
 | 
			
		||||
        storage_scheme: enums::MerchantStorageScheme,
 | 
			
		||||
    ) -> RouterResult<(
 | 
			
		||||
        BoxedOperation<'b, F, api::PaymentsSessionRequest>,
 | 
			
		||||
        PaymentData<F>,
 | 
			
		||||
@ -169,6 +169,21 @@ impl<F: Clone> UpdateTracker<F, PaymentData<F>, api::PaymentsSessionRequest> for
 | 
			
		||||
    where
 | 
			
		||||
        F: 'b + Send,
 | 
			
		||||
    {
 | 
			
		||||
        let metadata = payment_data.payment_intent.metadata.clone();
 | 
			
		||||
        payment_data.payment_intent = match metadata {
 | 
			
		||||
            Some(metadata) => db
 | 
			
		||||
                .update_payment_intent(
 | 
			
		||||
                    payment_data.payment_intent,
 | 
			
		||||
                    storage::PaymentIntentUpdate::MetadataUpdate { metadata },
 | 
			
		||||
                    storage_scheme,
 | 
			
		||||
                )
 | 
			
		||||
                .await
 | 
			
		||||
                .map_err(|error| {
 | 
			
		||||
                    error.to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)
 | 
			
		||||
                })?,
 | 
			
		||||
            None => payment_data.payment_intent,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        Ok((Box::new(self), payment_data))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -394,6 +394,23 @@ impl<F: Clone> TryFrom<PaymentData<F>> for types::PaymentsAuthorizeData {
 | 
			
		||||
            .change_context(errors::ApiErrorResponse::InvalidDataValue {
 | 
			
		||||
                field_name: "browser_info",
 | 
			
		||||
            })?;
 | 
			
		||||
 | 
			
		||||
        let parsed_metadata: Option<api_models::payments::Metadata> = payment_data
 | 
			
		||||
            .payment_intent
 | 
			
		||||
            .metadata
 | 
			
		||||
            .map(|metadata_value| {
 | 
			
		||||
                metadata_value
 | 
			
		||||
                    .parse_value("metadata")
 | 
			
		||||
                    .change_context(errors::ApiErrorResponse::InvalidDataValue {
 | 
			
		||||
                        field_name: "metadata",
 | 
			
		||||
                    })
 | 
			
		||||
                    .attach_printable("unable to parse metadata")
 | 
			
		||||
            })
 | 
			
		||||
            .transpose()
 | 
			
		||||
            .unwrap_or_default();
 | 
			
		||||
 | 
			
		||||
        let order_details = parsed_metadata.map(|data| data.order_details);
 | 
			
		||||
 | 
			
		||||
        Ok(Self {
 | 
			
		||||
            payment_method_data: {
 | 
			
		||||
                let payment_method_type = payment_data
 | 
			
		||||
@ -418,6 +435,7 @@ impl<F: Clone> TryFrom<PaymentData<F>> for types::PaymentsAuthorizeData {
 | 
			
		||||
            amount: payment_data.amount.into(),
 | 
			
		||||
            currency: payment_data.currency,
 | 
			
		||||
            browser_info,
 | 
			
		||||
            order_details,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -469,9 +487,25 @@ impl<F: Clone> TryFrom<PaymentData<F>> for types::PaymentsCancelData {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<F: Clone> TryFrom<PaymentData<F>> for types::PaymentsSessionData {
 | 
			
		||||
    type Error = errors::ApiErrorResponse;
 | 
			
		||||
    type Error = error_stack::Report<errors::ApiErrorResponse>;
 | 
			
		||||
 | 
			
		||||
    fn try_from(payment_data: PaymentData<F>) -> Result<Self, Self::Error> {
 | 
			
		||||
        let parsed_metadata: Option<api_models::payments::Metadata> = payment_data
 | 
			
		||||
            .payment_intent
 | 
			
		||||
            .metadata
 | 
			
		||||
            .map(|metadata_value| {
 | 
			
		||||
                metadata_value
 | 
			
		||||
                    .parse_value("metadata")
 | 
			
		||||
                    .change_context(errors::ApiErrorResponse::InvalidDataValue {
 | 
			
		||||
                        field_name: "metadata",
 | 
			
		||||
                    })
 | 
			
		||||
                    .attach_printable("unable to parse metadata")
 | 
			
		||||
            })
 | 
			
		||||
            .transpose()
 | 
			
		||||
            .unwrap_or_default();
 | 
			
		||||
 | 
			
		||||
        let order_details = parsed_metadata.map(|data| data.order_details);
 | 
			
		||||
 | 
			
		||||
        Ok(Self {
 | 
			
		||||
            amount: payment_data.amount.into(),
 | 
			
		||||
            currency: payment_data.currency,
 | 
			
		||||
@ -480,6 +514,7 @@ impl<F: Clone> TryFrom<PaymentData<F>> for types::PaymentsSessionData {
 | 
			
		||||
                .billing
 | 
			
		||||
                .and_then(|billing_address| billing_address.address.map(|address| address.country))
 | 
			
		||||
                .flatten(),
 | 
			
		||||
            order_details,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user