feat(klarna): wallet payment through klarna (#182)

This commit is contained in:
Narayan Bhat
2022-12-23 00:59:18 +05:30
committed by GitHub
parent 5477cc98ff
commit 06a3c38bd4
14 changed files with 351 additions and 53 deletions

View File

@ -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;
}

View File

@ -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()
}
}

View File

@ -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))
}
}

View File

@ -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,
})
}
}