mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 17:19:15 +08:00
fix: Set headers as optional in ob flows (#6305)
This commit is contained in:
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
@ -56,6 +56,7 @@ crates/euclid @juspay/hyperswitch-routing
|
|||||||
crates/euclid_macros @juspay/hyperswitch-routing
|
crates/euclid_macros @juspay/hyperswitch-routing
|
||||||
crates/euclid_wasm @juspay/hyperswitch-routing
|
crates/euclid_wasm @juspay/hyperswitch-routing
|
||||||
crates/kgraph_utils @juspay/hyperswitch-routing
|
crates/kgraph_utils @juspay/hyperswitch-routing
|
||||||
|
crates/pm_auth @juspay/hyperswitch-routing
|
||||||
crates/router/src/routes/routing.rs @juspay/hyperswitch-routing
|
crates/router/src/routes/routing.rs @juspay/hyperswitch-routing
|
||||||
crates/router/src/core/routing @juspay/hyperswitch-routing
|
crates/router/src/core/routing @juspay/hyperswitch-routing
|
||||||
crates/router/src/core/routing.rs @juspay/hyperswitch-routing
|
crates/router/src/core/routing.rs @juspay/hyperswitch-routing
|
||||||
|
|||||||
@ -4,8 +4,6 @@ use common_utils::{
|
|||||||
id_type, impl_api_event_type,
|
id_type, impl_api_event_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::enums as api_enums;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
|
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
pub struct LinkTokenCreateRequest {
|
pub struct LinkTokenCreateRequest {
|
||||||
@ -14,9 +12,6 @@ pub struct LinkTokenCreateRequest {
|
|||||||
pub payment_id: id_type::PaymentId, // payment_id to be passed in req body for redis pm_auth connector name fetch
|
pub payment_id: id_type::PaymentId, // payment_id to be passed in req body for redis pm_auth connector name fetch
|
||||||
pub payment_method: PaymentMethod, // payment_method to be used for filtering pm_auth connector
|
pub payment_method: PaymentMethod, // payment_method to be used for filtering pm_auth connector
|
||||||
pub payment_method_type: PaymentMethodType, // payment_method_type to be used for filtering pm_auth connector
|
pub payment_method_type: PaymentMethodType, // payment_method_type to be used for filtering pm_auth connector
|
||||||
pub client_platform: api_enums::ClientPlatform, // Client Platform to perform platform based processing
|
|
||||||
pub android_package_name: Option<String>, // Android Package name to be sent for Android platform
|
|
||||||
pub redirect_uri: Option<String>, // Merchant redirect_uri to be sent in case of IOS platform
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Serialize)]
|
#[derive(Debug, Clone, serde::Serialize)]
|
||||||
|
|||||||
@ -45,28 +45,20 @@ impl TryFrom<&types::LinkTokenRouterData> for PlaidLinkTokenRequest {
|
|||||||
)?,
|
)?,
|
||||||
},
|
},
|
||||||
android_package_name: match item.request.client_platform {
|
android_package_name: match item.request.client_platform {
|
||||||
api_models::enums::ClientPlatform::Android => {
|
Some(api_models::enums::ClientPlatform::Android) => {
|
||||||
Some(item.request.android_package_name.clone().ok_or(
|
item.request.android_package_name.clone()
|
||||||
errors::ConnectorError::MissingRequiredField {
|
|
||||||
field_name: "android_package_name",
|
|
||||||
},
|
|
||||||
)?)
|
|
||||||
}
|
}
|
||||||
api_models::enums::ClientPlatform::Ios
|
Some(api_models::enums::ClientPlatform::Ios)
|
||||||
| api_models::enums::ClientPlatform::Web
|
| Some(api_models::enums::ClientPlatform::Web)
|
||||||
| api_models::enums::ClientPlatform::Unknown => None,
|
| Some(api_models::enums::ClientPlatform::Unknown)
|
||||||
|
| None => None,
|
||||||
},
|
},
|
||||||
redirect_uri: match item.request.client_platform {
|
redirect_uri: match item.request.client_platform {
|
||||||
api_models::enums::ClientPlatform::Ios => {
|
Some(api_models::enums::ClientPlatform::Ios) => item.request.redirect_uri.clone(),
|
||||||
Some(item.request.redirect_uri.clone().ok_or(
|
Some(api_models::enums::ClientPlatform::Android)
|
||||||
errors::ConnectorError::MissingRequiredField {
|
| Some(api_models::enums::ClientPlatform::Web)
|
||||||
field_name: "redirect_uri",
|
| Some(api_models::enums::ClientPlatform::Unknown)
|
||||||
},
|
| None => None,
|
||||||
)?)
|
|
||||||
}
|
|
||||||
api_models::enums::ClientPlatform::Android
|
|
||||||
| api_models::enums::ClientPlatform::Web
|
|
||||||
| api_models::enums::ClientPlatform::Unknown => None,
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ pub struct LinkTokenRequest {
|
|||||||
pub country_codes: Option<Vec<String>>,
|
pub country_codes: Option<Vec<String>>,
|
||||||
pub language: Option<String>,
|
pub language: Option<String>,
|
||||||
pub user_info: Option<id_type::CustomerId>,
|
pub user_info: Option<id_type::CustomerId>,
|
||||||
pub client_platform: api_enums::ClientPlatform,
|
pub client_platform: Option<api_enums::ClientPlatform>,
|
||||||
pub android_package_name: Option<String>,
|
pub android_package_name: Option<String>,
|
||||||
pub redirect_uri: Option<String>,
|
pub redirect_uri: Option<String>,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -163,21 +163,15 @@ impl TryFrom<&types::PaymentsPostProcessingRouterData> for PlaidLinkTokenRequest
|
|||||||
match item.request.payment_method_data {
|
match item.request.payment_method_data {
|
||||||
domain::PaymentMethodData::OpenBanking(ref data) => match data {
|
domain::PaymentMethodData::OpenBanking(ref data) => match data {
|
||||||
domain::OpenBankingData::OpenBankingPIS { .. } => {
|
domain::OpenBankingData::OpenBankingPIS { .. } => {
|
||||||
let headers = item.header_payload.clone().ok_or(
|
let headers = item.header_payload.clone();
|
||||||
errors::ConnectorError::MissingRequiredField {
|
|
||||||
field_name: "header_payload",
|
|
||||||
},
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let platform = headers.x_client_platform.ok_or(
|
let platform = headers
|
||||||
errors::ConnectorError::MissingRequiredField {
|
.as_ref()
|
||||||
field_name: "x_client_platform",
|
.and_then(|headers| headers.x_client_platform.clone());
|
||||||
},
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let (is_android, is_ios) = match platform {
|
let (is_android, is_ios) = match platform {
|
||||||
common_enums::ClientPlatform::Android => (true, false),
|
Some(common_enums::ClientPlatform::Android) => (true, false),
|
||||||
common_enums::ClientPlatform::Ios => (false, true),
|
Some(common_enums::ClientPlatform::Ios) => (false, true),
|
||||||
_ => (false, false),
|
_ => (false, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -208,20 +202,16 @@ impl TryFrom<&types::PaymentsPostProcessingRouterData> for PlaidLinkTokenRequest
|
|||||||
.ok_or(errors::ConnectorError::MissingConnectorTransactionID)?,
|
.ok_or(errors::ConnectorError::MissingConnectorTransactionID)?,
|
||||||
},
|
},
|
||||||
android_package_name: if is_android {
|
android_package_name: if is_android {
|
||||||
Some(headers.x_app_id.ok_or(
|
headers
|
||||||
errors::ConnectorError::MissingRequiredField {
|
.as_ref()
|
||||||
field_name: "x-app-id",
|
.and_then(|headers| headers.x_app_id.clone())
|
||||||
},
|
|
||||||
)?)
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
redirect_uri: if is_ios {
|
redirect_uri: if is_ios {
|
||||||
Some(headers.x_redirect_uri.ok_or(
|
headers
|
||||||
errors::ConnectorError::MissingRequiredField {
|
.as_ref()
|
||||||
field_name: "x_redirect_uri",
|
.and_then(|headers| headers.x_redirect_uri.clone())
|
||||||
},
|
|
||||||
)?)
|
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
|
|||||||
@ -51,6 +51,7 @@ pub async fn create_link_token(
|
|||||||
merchant_account: domain::MerchantAccount,
|
merchant_account: domain::MerchantAccount,
|
||||||
key_store: domain::MerchantKeyStore,
|
key_store: domain::MerchantKeyStore,
|
||||||
payload: api_models::pm_auth::LinkTokenCreateRequest,
|
payload: api_models::pm_auth::LinkTokenCreateRequest,
|
||||||
|
headers: Option<api_models::payments::HeaderPayload>,
|
||||||
) -> RouterResponse<api_models::pm_auth::LinkTokenCreateResponse> {
|
) -> RouterResponse<api_models::pm_auth::LinkTokenCreateResponse> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
|
||||||
@ -165,9 +166,13 @@ pub async fn create_link_token(
|
|||||||
)?]),
|
)?]),
|
||||||
language: payload.language,
|
language: payload.language,
|
||||||
user_info: payment_intent.and_then(|pi| pi.customer_id),
|
user_info: payment_intent.and_then(|pi| pi.customer_id),
|
||||||
client_platform: payload.client_platform,
|
client_platform: headers
|
||||||
android_package_name: payload.android_package_name,
|
.as_ref()
|
||||||
redirect_uri: payload.redirect_uri,
|
.and_then(|header| header.x_client_platform.clone()),
|
||||||
|
android_package_name: headers.as_ref().and_then(|header| header.x_app_id.clone()),
|
||||||
|
redirect_uri: headers
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|header| header.x_redirect_uri.clone()),
|
||||||
},
|
},
|
||||||
response: Ok(pm_auth_types::LinkTokenResponse {
|
response: Ok(pm_auth_types::LinkTokenResponse {
|
||||||
link_token: "".to_string(),
|
link_token: "".to_string(),
|
||||||
@ -211,6 +216,7 @@ pub async fn create_link_token(
|
|||||||
_merchant_account: domain::MerchantAccount,
|
_merchant_account: domain::MerchantAccount,
|
||||||
_key_store: domain::MerchantKeyStore,
|
_key_store: domain::MerchantKeyStore,
|
||||||
_payload: api_models::pm_auth::LinkTokenCreateRequest,
|
_payload: api_models::pm_auth::LinkTokenCreateRequest,
|
||||||
|
_headers: Option<api_models::payments::HeaderPayload>,
|
||||||
) -> RouterResponse<api_models::pm_auth::LinkTokenCreateResponse> {
|
) -> RouterResponse<api_models::pm_auth::LinkTokenCreateResponse> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,9 @@ use actix_web::{web, HttpRequest, Responder};
|
|||||||
use api_models as api_types;
|
use api_models as api_types;
|
||||||
use router_env::{instrument, tracing, types::Flow};
|
use router_env::{instrument, tracing, types::Flow};
|
||||||
|
|
||||||
use crate::{core::api_locking, routes::AppState, services::api as oss_api};
|
use crate::{
|
||||||
|
core::api_locking, routes::AppState, services::api, types::transformers::ForeignTryFrom,
|
||||||
|
};
|
||||||
|
|
||||||
#[instrument(skip_all, fields(flow = ?Flow::PmAuthLinkTokenCreate))]
|
#[instrument(skip_all, fields(flow = ?Flow::PmAuthLinkTokenCreate))]
|
||||||
pub async fn link_token_create(
|
pub async fn link_token_create(
|
||||||
@ -17,9 +19,17 @@ pub async fn link_token_create(
|
|||||||
&payload,
|
&payload,
|
||||||
) {
|
) {
|
||||||
Ok((auth, _auth_flow)) => (auth, _auth_flow),
|
Ok((auth, _auth_flow)) => (auth, _auth_flow),
|
||||||
Err(e) => return oss_api::log_and_return_error_response(e),
|
Err(e) => return api::log_and_return_error_response(e),
|
||||||
};
|
};
|
||||||
Box::pin(oss_api::server_wrap(
|
|
||||||
|
let header_payload = match api_types::payments::HeaderPayload::foreign_try_from(req.headers()) {
|
||||||
|
Ok(headers) => headers,
|
||||||
|
Err(err) => {
|
||||||
|
return api::log_and_return_error_response(err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Box::pin(api::server_wrap(
|
||||||
flow,
|
flow,
|
||||||
state,
|
state,
|
||||||
&req,
|
&req,
|
||||||
@ -30,6 +40,7 @@ pub async fn link_token_create(
|
|||||||
auth.merchant_account,
|
auth.merchant_account,
|
||||||
auth.key_store,
|
auth.key_store,
|
||||||
payload,
|
payload,
|
||||||
|
Some(header_payload.clone()),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
&*auth,
|
&*auth,
|
||||||
@ -51,9 +62,9 @@ pub async fn exchange_token(
|
|||||||
&payload,
|
&payload,
|
||||||
) {
|
) {
|
||||||
Ok((auth, _auth_flow)) => (auth, _auth_flow),
|
Ok((auth, _auth_flow)) => (auth, _auth_flow),
|
||||||
Err(e) => return oss_api::log_and_return_error_response(e),
|
Err(e) => return api::log_and_return_error_response(e),
|
||||||
};
|
};
|
||||||
Box::pin(oss_api::server_wrap(
|
Box::pin(api::server_wrap(
|
||||||
flow,
|
flow,
|
||||||
state,
|
state,
|
||||||
&req,
|
&req,
|
||||||
|
|||||||
Reference in New Issue
Block a user