mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 12:15:40 +08:00
fix: Add locker_id in merchant account and sbx default locker (#276)
Co-authored-by: Arun Raj M <jarnura47@gmail.com>
This commit is contained in:
@ -24,6 +24,7 @@ pub struct CreateMerchantAccount {
|
|||||||
pub redirect_to_merchant_with_http_post: Option<bool>,
|
pub redirect_to_merchant_with_http_post: Option<bool>,
|
||||||
pub metadata: Option<serde_json::Value>,
|
pub metadata: Option<serde_json::Value>,
|
||||||
pub publishable_key: Option<String>,
|
pub publishable_key: Option<String>,
|
||||||
|
pub locker_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
|||||||
@ -70,6 +70,7 @@ pub async fn create_merchant_account(
|
|||||||
payment_response_hash_key: req.payment_response_hash_key,
|
payment_response_hash_key: req.payment_response_hash_key,
|
||||||
redirect_to_merchant_with_http_post: req.redirect_to_merchant_with_http_post,
|
redirect_to_merchant_with_http_post: req.redirect_to_merchant_with_http_post,
|
||||||
publishable_key: Some(publishable_key.to_owned()),
|
publishable_key: Some(publishable_key.to_owned()),
|
||||||
|
locker_id: req.locker_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
db.insert_merchant(merchant_account)
|
db.insert_merchant(merchant_account)
|
||||||
@ -125,6 +126,7 @@ pub async fn get_merchant_account(
|
|||||||
),
|
),
|
||||||
metadata: None,
|
metadata: None,
|
||||||
publishable_key: merchant_account.publishable_key,
|
publishable_key: merchant_account.publishable_key,
|
||||||
|
locker_id: merchant_account.locker_id,
|
||||||
};
|
};
|
||||||
Ok(service_api::BachResponse::Json(response))
|
Ok(service_api::BachResponse::Json(response))
|
||||||
}
|
}
|
||||||
@ -214,6 +216,9 @@ pub async fn merchant_account_update(
|
|||||||
publishable_key: req
|
publishable_key: req
|
||||||
.publishable_key
|
.publishable_key
|
||||||
.or_else(|| merchant_account.publishable_key.clone()),
|
.or_else(|| merchant_account.publishable_key.clone()),
|
||||||
|
locker_id: req
|
||||||
|
.locker_id
|
||||||
|
.or_else(|| merchant_account.locker_id.to_owned()),
|
||||||
};
|
};
|
||||||
response.merchant_id = merchant_id.to_string();
|
response.merchant_id = merchant_id.to_string();
|
||||||
response.api_key = merchant_account.api_key.to_owned();
|
response.api_key = merchant_account.api_key.to_owned();
|
||||||
|
|||||||
@ -31,7 +31,7 @@ pub async fn get_mandate(
|
|||||||
.await
|
.await
|
||||||
.map_err(|error| error.to_not_found_response(errors::ApiErrorResponse::MandateNotFound))?;
|
.map_err(|error| error.to_not_found_response(errors::ApiErrorResponse::MandateNotFound))?;
|
||||||
Ok(services::BachResponse::Json(
|
Ok(services::BachResponse::Json(
|
||||||
mandates::MandateResponse::from_db_mandate(state, mandate).await?,
|
mandates::MandateResponse::from_db_mandate(state, mandate, &merchant_account).await?,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,7 +77,10 @@ pub async fn get_customer_mandates(
|
|||||||
} else {
|
} else {
|
||||||
let mut response_vec = Vec::with_capacity(mandates.len());
|
let mut response_vec = Vec::with_capacity(mandates.len());
|
||||||
for mandate in mandates {
|
for mandate in mandates {
|
||||||
response_vec.push(mandates::MandateResponse::from_db_mandate(state, mandate).await?);
|
response_vec.push(
|
||||||
|
mandates::MandateResponse::from_db_mandate(state, mandate, &merchant_account)
|
||||||
|
.await?,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Ok(services::BachResponse::Json(response_vec))
|
Ok(services::BachResponse::Json(response_vec))
|
||||||
}
|
}
|
||||||
@ -87,6 +90,7 @@ pub async fn mandate_procedure<F, FData>(
|
|||||||
state: &AppState,
|
state: &AppState,
|
||||||
mut resp: types::RouterData<F, FData, types::PaymentsResponseData>,
|
mut resp: types::RouterData<F, FData, types::PaymentsResponseData>,
|
||||||
maybe_customer: &Option<storage::Customer>,
|
maybe_customer: &Option<storage::Customer>,
|
||||||
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> errors::RouterResult<types::RouterData<F, FData, types::PaymentsResponseData>>
|
) -> errors::RouterResult<types::RouterData<F, FData, types::PaymentsResponseData>>
|
||||||
where
|
where
|
||||||
FData: MandateBehaviour,
|
FData: MandateBehaviour,
|
||||||
@ -132,7 +136,7 @@ where
|
|||||||
if resp.request.get_setup_mandate_details().is_some() {
|
if resp.request.get_setup_mandate_details().is_some() {
|
||||||
let payment_method_id = helpers::call_payment_method(
|
let payment_method_id = helpers::call_payment_method(
|
||||||
state,
|
state,
|
||||||
&resp.merchant_id,
|
merchant_account,
|
||||||
Some(&resp.request.get_payment_method_data()),
|
Some(&resp.request.get_payment_method_data()),
|
||||||
Some(resp.payment_method),
|
Some(resp.payment_method),
|
||||||
maybe_customer,
|
maybe_customer,
|
||||||
|
|||||||
@ -50,13 +50,13 @@ pub async fn create_payment_method(
|
|||||||
pub async fn add_payment_method(
|
pub async fn add_payment_method(
|
||||||
state: &routes::AppState,
|
state: &routes::AppState,
|
||||||
req: api::CreatePaymentMethod,
|
req: api::CreatePaymentMethod,
|
||||||
merchant_id: String,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> errors::RouterResponse<api::PaymentMethodResponse> {
|
) -> errors::RouterResponse<api::PaymentMethodResponse> {
|
||||||
req.validate()?;
|
req.validate()?;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
let customer_id = req.customer_id.clone().get_required_value("customer_id")?;
|
let customer_id = req.customer_id.clone().get_required_value("customer_id")?;
|
||||||
match req.card.clone() {
|
match req.card.clone() {
|
||||||
Some(card) => add_card(state, req, card, customer_id, &merchant_id)
|
Some(card) => add_card(state, req, card, customer_id, merchant_account)
|
||||||
.await
|
.await
|
||||||
.change_context(errors::ApiErrorResponse::InternalServerError)
|
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||||
.attach_printable("Add Card Failed"),
|
.attach_printable("Add Card Failed"),
|
||||||
@ -67,14 +67,14 @@ pub async fn add_payment_method(
|
|||||||
&req,
|
&req,
|
||||||
&customer_id,
|
&customer_id,
|
||||||
&payment_method_id,
|
&payment_method_id,
|
||||||
&merchant_id,
|
merchant_id,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|error| {
|
.map_err(|error| {
|
||||||
error.to_duplicate_response(errors::ApiErrorResponse::DuplicatePaymentMethod)
|
error.to_duplicate_response(errors::ApiErrorResponse::DuplicatePaymentMethod)
|
||||||
})?;
|
})?;
|
||||||
Ok(api::PaymentMethodResponse {
|
Ok(api::PaymentMethodResponse {
|
||||||
merchant_id,
|
merchant_id: merchant_id.to_string(),
|
||||||
customer_id: Some(customer_id),
|
customer_id: Some(customer_id),
|
||||||
payment_method_id: payment_method_id.to_string(),
|
payment_method_id: payment_method_id.to_string(),
|
||||||
payment_method: req.payment_method,
|
payment_method: req.payment_method,
|
||||||
@ -124,7 +124,7 @@ pub async fn update_customer_payment_method(
|
|||||||
metadata: req.metadata,
|
metadata: req.metadata,
|
||||||
customer_id: Some(pm.customer_id),
|
customer_id: Some(pm.customer_id),
|
||||||
};
|
};
|
||||||
add_payment_method(state, new_pm, merchant_account.merchant_id).await
|
add_payment_method(state, new_pm, &merchant_account).await
|
||||||
}
|
}
|
||||||
|
|
||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
@ -133,11 +133,25 @@ pub async fn add_card(
|
|||||||
req: api::CreatePaymentMethod,
|
req: api::CreatePaymentMethod,
|
||||||
card: api::CardDetail,
|
card: api::CardDetail,
|
||||||
customer_id: String,
|
customer_id: String,
|
||||||
merchant_id: &str,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> errors::CustomResult<api::PaymentMethodResponse, errors::CardVaultError> {
|
) -> errors::CustomResult<api::PaymentMethodResponse, errors::CardVaultError> {
|
||||||
let locker = &state.conf.locker;
|
let locker = &state.conf.locker;
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
let request = payment_methods::mk_add_card_request(locker, &card, &customer_id, &req)?;
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let locker_id = merchant_account
|
||||||
|
.locker_id
|
||||||
|
.to_owned()
|
||||||
|
.get_required_value("locker_id")
|
||||||
|
.change_context(errors::CardVaultError::SaveCardFailed)?;
|
||||||
|
|
||||||
|
let request = payment_methods::mk_add_card_request(
|
||||||
|
locker,
|
||||||
|
&card,
|
||||||
|
&customer_id,
|
||||||
|
&req,
|
||||||
|
&locker_id,
|
||||||
|
merchant_id,
|
||||||
|
)?;
|
||||||
let response = if !locker.mock_locker {
|
let response = if !locker.mock_locker {
|
||||||
let response = services::call_connector_api(state, request)
|
let response = services::call_connector_api(state, request)
|
||||||
.await
|
.await
|
||||||
@ -278,11 +292,11 @@ pub async fn mock_delete_card<'a>(
|
|||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub async fn get_card_from_legacy_locker<'a>(
|
pub async fn get_card_from_legacy_locker<'a>(
|
||||||
state: &'a routes::AppState,
|
state: &'a routes::AppState,
|
||||||
merchant_id: &'a str,
|
locker_id: &'a str,
|
||||||
card_id: &'a str,
|
card_id: &'a str,
|
||||||
) -> errors::RouterResult<payment_methods::GetCardResponse> {
|
) -> errors::RouterResult<payment_methods::GetCardResponse> {
|
||||||
let locker = &state.conf.locker;
|
let locker = &state.conf.locker;
|
||||||
let request = payment_methods::mk_get_card_request(locker, merchant_id, card_id)
|
let request = payment_methods::mk_get_card_request(locker, locker_id, card_id)
|
||||||
.change_context(errors::ApiErrorResponse::InternalServerError)
|
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||||
.attach_printable("Making get card request failed")?;
|
.attach_printable("Making get card request failed")?;
|
||||||
let get_card_result = if !locker.mock_locker {
|
let get_card_result = if !locker.mock_locker {
|
||||||
@ -519,7 +533,11 @@ pub async fn list_customer_payment_method(
|
|||||||
for pm in resp.into_iter() {
|
for pm in resp.into_iter() {
|
||||||
let payment_token = generate_id(consts::ID_LENGTH, "token");
|
let payment_token = generate_id(consts::ID_LENGTH, "token");
|
||||||
let card = if pm.payment_method == enums::PaymentMethodType::Card {
|
let card = if pm.payment_method == enums::PaymentMethodType::Card {
|
||||||
Some(get_lookup_key_from_locker(state, &payment_token, &pm).await?)
|
let locker_id = merchant_account
|
||||||
|
.locker_id
|
||||||
|
.to_owned()
|
||||||
|
.get_required_value("locker_id")?;
|
||||||
|
Some(get_lookup_key_from_locker(state, &payment_token, &pm, &locker_id).await?)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
@ -557,13 +575,10 @@ pub async fn get_lookup_key_from_locker(
|
|||||||
state: &routes::AppState,
|
state: &routes::AppState,
|
||||||
payment_token: &str,
|
payment_token: &str,
|
||||||
pm: &storage::PaymentMethod,
|
pm: &storage::PaymentMethod,
|
||||||
|
locker_id: &str,
|
||||||
) -> errors::RouterResult<api::CardDetailFromLocker> {
|
) -> errors::RouterResult<api::CardDetailFromLocker> {
|
||||||
let get_card_resp = get_card_from_legacy_locker(
|
let get_card_resp =
|
||||||
state,
|
get_card_from_legacy_locker(state, locker_id, pm.payment_method_id.as_str()).await?;
|
||||||
pm.merchant_id.as_str(),
|
|
||||||
pm.payment_method_id.as_str(),
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
let card_detail = payment_methods::get_card_detail(pm, get_card_resp.card)
|
let card_detail = payment_methods::get_card_detail(pm, get_card_resp.card)
|
||||||
.change_context(errors::ApiErrorResponse::InternalServerError)
|
.change_context(errors::ApiErrorResponse::InternalServerError)
|
||||||
.attach_printable("Get Card Details Failed")?;
|
.attach_printable("Get Card Details Failed")?;
|
||||||
@ -717,6 +732,7 @@ pub async fn get_card_info_from_value(
|
|||||||
pub async fn retrieve_payment_method(
|
pub async fn retrieve_payment_method(
|
||||||
state: &routes::AppState,
|
state: &routes::AppState,
|
||||||
pm: api::PaymentMethodId,
|
pm: api::PaymentMethodId,
|
||||||
|
merchant_account: storage::MerchantAccount,
|
||||||
) -> errors::RouterResponse<api::PaymentMethodResponse> {
|
) -> errors::RouterResponse<api::PaymentMethodResponse> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
let pm = db
|
let pm = db
|
||||||
@ -726,8 +742,9 @@ pub async fn retrieve_payment_method(
|
|||||||
error.to_not_found_response(errors::ApiErrorResponse::PaymentMethodNotFound)
|
error.to_not_found_response(errors::ApiErrorResponse::PaymentMethodNotFound)
|
||||||
})?;
|
})?;
|
||||||
let card = if pm.payment_method == enums::PaymentMethodType::Card {
|
let card = if pm.payment_method == enums::PaymentMethodType::Card {
|
||||||
|
let locker_id = merchant_account.locker_id.get_required_value("locker_id")?;
|
||||||
let get_card_resp =
|
let get_card_resp =
|
||||||
get_card_from_legacy_locker(state, &pm.merchant_id, &pm.payment_method_id).await?;
|
get_card_from_legacy_locker(state, &locker_id, &pm.payment_method_id).await?;
|
||||||
let card_detail = payment_methods::get_card_detail(&pm, get_card_resp.card)
|
let card_detail = payment_methods::get_card_detail(&pm, get_card_resp.card)
|
||||||
.change_context(errors::ApiErrorResponse::InternalServerError)?;
|
.change_context(errors::ApiErrorResponse::InternalServerError)?;
|
||||||
Some(card_detail)
|
Some(card_detail)
|
||||||
|
|||||||
@ -68,16 +68,20 @@ pub fn mk_add_card_request(
|
|||||||
card: &api::CardDetail,
|
card: &api::CardDetail,
|
||||||
customer_id: &str,
|
customer_id: &str,
|
||||||
_req: &api::CreatePaymentMethod,
|
_req: &api::CreatePaymentMethod,
|
||||||
|
locker_id: &str,
|
||||||
|
_merchant_id: &str,
|
||||||
) -> CustomResult<services::Request, errors::CardVaultError> {
|
) -> CustomResult<services::Request, errors::CardVaultError> {
|
||||||
|
#[cfg(feature = "sandbox")]
|
||||||
|
let customer_id = format!("{}::{}", customer_id, _merchant_id);
|
||||||
let add_card_req = AddCardRequest {
|
let add_card_req = AddCardRequest {
|
||||||
card_number: card.card_number.clone(),
|
card_number: card.card_number.clone(),
|
||||||
customer_id,
|
customer_id: &customer_id,
|
||||||
card_exp_month: card.card_exp_month.clone(),
|
card_exp_month: card.card_exp_month.clone(),
|
||||||
card_exp_year: card.card_exp_year.clone(),
|
card_exp_year: card.card_exp_year.clone(),
|
||||||
merchant_id: "m0010", // [#253]: Need mapping for application mid to lockeId
|
merchant_id: locker_id,
|
||||||
email_address: Some("dummy@gmail.com".to_string().into()), //
|
email_address: Some("dummy@gmail.com".to_string().into()), //
|
||||||
name_on_card: Some("juspay".to_string().into()), // [#256]
|
name_on_card: Some("juspay".to_string().into()), // [#256]
|
||||||
nickname: Some("router".to_string()), //
|
nickname: Some("router".to_string()), //
|
||||||
};
|
};
|
||||||
let body = utils::Encode::<AddCardRequest<'_>>::encode(&add_card_req)
|
let body = utils::Encode::<AddCardRequest<'_>>::encode(&add_card_req)
|
||||||
.change_context(errors::CardVaultError::RequestEncodingFailed)?;
|
.change_context(errors::CardVaultError::RequestEncodingFailed)?;
|
||||||
@ -128,11 +132,11 @@ pub fn mk_add_card_response(
|
|||||||
|
|
||||||
pub fn mk_get_card_request<'a>(
|
pub fn mk_get_card_request<'a>(
|
||||||
locker: &Locker,
|
locker: &Locker,
|
||||||
_mid: &'a str,
|
locker_id: &'a str,
|
||||||
card_id: &'a str,
|
card_id: &'a str,
|
||||||
) -> CustomResult<services::Request, errors::CardVaultError> {
|
) -> CustomResult<services::Request, errors::CardVaultError> {
|
||||||
let get_card_req = GetCard {
|
let get_card_req = GetCard {
|
||||||
merchant_id: "m0010", // [#253]: need to assign locker id to every merchant
|
merchant_id: locker_id,
|
||||||
card_id,
|
card_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -74,10 +74,9 @@ where
|
|||||||
.get_trackers(
|
.get_trackers(
|
||||||
state,
|
state,
|
||||||
&validate_result.payment_id,
|
&validate_result.payment_id,
|
||||||
validate_result.merchant_id,
|
|
||||||
&req,
|
&req,
|
||||||
validate_result.mandate_type,
|
validate_result.mandate_type,
|
||||||
validate_result.storage_scheme,
|
&merchant_account,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
@ -323,7 +322,7 @@ where
|
|||||||
&connector,
|
&connector,
|
||||||
customer,
|
customer,
|
||||||
call_connector_action,
|
call_connector_action,
|
||||||
merchant_account.storage_scheme,
|
merchant_account,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -387,7 +386,7 @@ where
|
|||||||
connector,
|
connector,
|
||||||
customer,
|
customer,
|
||||||
CallConnectorAction::Trigger,
|
CallConnectorAction::Trigger,
|
||||||
merchant_account.storage_scheme,
|
merchant_account,
|
||||||
);
|
);
|
||||||
|
|
||||||
join_handlers.push(res);
|
join_handlers.push(res);
|
||||||
|
|||||||
@ -11,10 +11,7 @@ use crate::{
|
|||||||
core::{errors::RouterResult, payments},
|
core::{errors::RouterResult, payments},
|
||||||
routes::AppState,
|
routes::AppState,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -35,7 +32,7 @@ pub trait Feature<F, T> {
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
maybe_customer: &Option<storage::Customer>,
|
maybe_customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self>
|
) -> RouterResult<Self>
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
|
|||||||
@ -10,10 +10,7 @@ use crate::{
|
|||||||
routes::AppState,
|
routes::AppState,
|
||||||
scheduler::metrics,
|
scheduler::metrics,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums as storage_enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -54,7 +51,7 @@ impl Feature<api::Authorize, types::PaymentsAuthorizeData> for types::PaymentsAu
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
storage_scheme: storage_enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
let resp = self
|
let resp = self
|
||||||
.decide_flow(
|
.decide_flow(
|
||||||
@ -63,7 +60,7 @@ impl Feature<api::Authorize, types::PaymentsAuthorizeData> for types::PaymentsAu
|
|||||||
customer,
|
customer,
|
||||||
Some(true),
|
Some(true),
|
||||||
call_connector_action,
|
call_connector_action,
|
||||||
storage_scheme,
|
merchant_account,
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
@ -81,7 +78,7 @@ impl types::PaymentsAuthorizeRouterData {
|
|||||||
maybe_customer: &Option<storage::Customer>,
|
maybe_customer: &Option<storage::Customer>,
|
||||||
confirm: Option<bool>,
|
confirm: Option<bool>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_scheme: storage_enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
match confirm {
|
match confirm {
|
||||||
Some(true) => {
|
Some(true) => {
|
||||||
@ -100,7 +97,10 @@ impl types::PaymentsAuthorizeRouterData {
|
|||||||
.await
|
.await
|
||||||
.map_err(|error| error.to_payment_failed_response())?;
|
.map_err(|error| error.to_payment_failed_response())?;
|
||||||
|
|
||||||
Ok(mandate::mandate_procedure(state, resp, maybe_customer).await?)
|
Ok(
|
||||||
|
mandate::mandate_procedure(state, resp, maybe_customer, merchant_account)
|
||||||
|
.await?,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
_ => Ok(self.clone()),
|
_ => Ok(self.clone()),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,10 +8,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
routes::AppState,
|
routes::AppState,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -44,7 +41,7 @@ impl Feature<api::Void, types::PaymentsCancelData>
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_scheme: enums::MerchantStorageScheme,
|
_merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
self.decide_flow(
|
self.decide_flow(
|
||||||
state,
|
state,
|
||||||
|
|||||||
@ -8,10 +8,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
routes::AppState,
|
routes::AppState,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -45,7 +42,7 @@ impl Feature<api::Capture, types::PaymentsCaptureData>
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_scheme: enums::MerchantStorageScheme,
|
_merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
self.decide_flow(
|
self.decide_flow(
|
||||||
state,
|
state,
|
||||||
|
|||||||
@ -8,10 +8,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
routes::AppState,
|
routes::AppState,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -46,7 +43,7 @@ impl Feature<api::PSync, types::PaymentsSyncData>
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_scheme: enums::MerchantStorageScheme,
|
_merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
self.decide_flow(
|
self.decide_flow(
|
||||||
state,
|
state,
|
||||||
|
|||||||
@ -9,10 +9,7 @@ use crate::{
|
|||||||
payments::{self, transformers, PaymentData},
|
payments::{self, transformers, PaymentData},
|
||||||
},
|
},
|
||||||
routes, services,
|
routes, services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
utils::OptionExt,
|
utils::OptionExt,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -45,7 +42,7 @@ impl Feature<api::Session, types::PaymentsSessionData> for types::PaymentsSessio
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_schema: enums::MerchantStorageScheme,
|
_merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
self.decide_flow(
|
self.decide_flow(
|
||||||
state,
|
state,
|
||||||
|
|||||||
@ -9,10 +9,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
routes::AppState,
|
routes::AppState,
|
||||||
services,
|
services,
|
||||||
types::{
|
types::{self, api, storage},
|
||||||
self, api,
|
|
||||||
storage::{self, enums},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
@ -43,7 +40,7 @@ impl Feature<api::Verify, types::VerifyRequestData> for types::VerifyRouterData
|
|||||||
connector: &api::ConnectorData,
|
connector: &api::ConnectorData,
|
||||||
customer: &Option<storage::Customer>,
|
customer: &Option<storage::Customer>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
self.decide_flow(
|
self.decide_flow(
|
||||||
state,
|
state,
|
||||||
@ -51,7 +48,7 @@ impl Feature<api::Verify, types::VerifyRequestData> for types::VerifyRouterData
|
|||||||
customer,
|
customer,
|
||||||
Some(true),
|
Some(true),
|
||||||
call_connector_action,
|
call_connector_action,
|
||||||
storage_scheme,
|
merchant_account,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
@ -65,7 +62,7 @@ impl types::VerifyRouterData {
|
|||||||
maybe_customer: &Option<storage::Customer>,
|
maybe_customer: &Option<storage::Customer>,
|
||||||
confirm: Option<bool>,
|
confirm: Option<bool>,
|
||||||
call_connector_action: payments::CallConnectorAction,
|
call_connector_action: payments::CallConnectorAction,
|
||||||
_storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<Self> {
|
) -> RouterResult<Self> {
|
||||||
match confirm {
|
match confirm {
|
||||||
Some(true) => {
|
Some(true) => {
|
||||||
@ -83,7 +80,10 @@ impl types::VerifyRouterData {
|
|||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|err| err.to_verify_failed_response())?;
|
.map_err(|err| err.to_verify_failed_response())?;
|
||||||
Ok(mandate::mandate_procedure(state, resp, maybe_customer).await?)
|
Ok(
|
||||||
|
mandate::mandate_procedure(state, resp, maybe_customer, merchant_account)
|
||||||
|
.await?,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
_ => Ok(self.clone()),
|
_ => Ok(self.clone()),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -101,7 +101,7 @@ pub async fn get_token_pm_type_mandate_details(
|
|||||||
state: &AppState,
|
state: &AppState,
|
||||||
request: &api::PaymentsRequest,
|
request: &api::PaymentsRequest,
|
||||||
mandate_type: Option<api::MandateTxnType>,
|
mandate_type: Option<api::MandateTxnType>,
|
||||||
merchant_id: &str,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
Option<String>,
|
Option<String>,
|
||||||
Option<storage_enums::PaymentMethodType>,
|
Option<storage_enums::PaymentMethodType>,
|
||||||
@ -121,7 +121,7 @@ pub async fn get_token_pm_type_mandate_details(
|
|||||||
}
|
}
|
||||||
Some(api::MandateTxnType::RecurringMandateTxn) => {
|
Some(api::MandateTxnType::RecurringMandateTxn) => {
|
||||||
let (token_, payment_method_type_) =
|
let (token_, payment_method_type_) =
|
||||||
get_token_for_recurring_mandate(state, request, merchant_id).await?;
|
get_token_for_recurring_mandate(state, request, merchant_account).await?;
|
||||||
Ok((token_, payment_method_type_, None))
|
Ok((token_, payment_method_type_, None))
|
||||||
}
|
}
|
||||||
None => Ok((
|
None => Ok((
|
||||||
@ -135,13 +135,13 @@ pub async fn get_token_pm_type_mandate_details(
|
|||||||
pub async fn get_token_for_recurring_mandate(
|
pub async fn get_token_for_recurring_mandate(
|
||||||
state: &AppState,
|
state: &AppState,
|
||||||
req: &api::PaymentsRequest,
|
req: &api::PaymentsRequest,
|
||||||
merchant_id: &str,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(Option<String>, Option<storage_enums::PaymentMethodType>)> {
|
) -> RouterResult<(Option<String>, Option<storage_enums::PaymentMethodType>)> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
let mandate_id = req.mandate_id.clone().get_required_value("mandate_id")?;
|
let mandate_id = req.mandate_id.clone().get_required_value("mandate_id")?;
|
||||||
|
|
||||||
let mandate = db
|
let mandate = db
|
||||||
.find_mandate_by_merchant_id_mandate_id(merchant_id, mandate_id.as_str())
|
.find_mandate_by_merchant_id_mandate_id(&merchant_account.merchant_id, mandate_id.as_str())
|
||||||
.await
|
.await
|
||||||
.map_err(|error| error.to_not_found_response(errors::ApiErrorResponse::MandateNotFound))?;
|
.map_err(|error| error.to_not_found_response(errors::ApiErrorResponse::MandateNotFound))?;
|
||||||
|
|
||||||
@ -176,8 +176,11 @@ pub async fn get_token_for_recurring_mandate(
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
let token = Uuid::new_v4().to_string();
|
let token = Uuid::new_v4().to_string();
|
||||||
|
let locker_id = merchant_account
|
||||||
let _ = cards::get_lookup_key_from_locker(state, &token, &payment_method).await?;
|
.locker_id
|
||||||
|
.to_owned()
|
||||||
|
.get_required_value("locker_id")?;
|
||||||
|
let _ = cards::get_lookup_key_from_locker(state, &token, &payment_method, &locker_id).await?;
|
||||||
|
|
||||||
if let Some(payment_method_from_request) = req.payment_method {
|
if let Some(payment_method_from_request) = req.payment_method {
|
||||||
let pm: storage_enums::PaymentMethodType = payment_method_from_request.foreign_into();
|
let pm: storage_enums::PaymentMethodType = payment_method_from_request.foreign_into();
|
||||||
@ -509,7 +512,7 @@ where
|
|||||||
#[instrument(skip_all)]
|
#[instrument(skip_all)]
|
||||||
pub(crate) async fn call_payment_method(
|
pub(crate) async fn call_payment_method(
|
||||||
state: &AppState,
|
state: &AppState,
|
||||||
merchant_id: &str,
|
merchant_account: &storage::MerchantAccount,
|
||||||
payment_method: Option<&api::PaymentMethod>,
|
payment_method: Option<&api::PaymentMethod>,
|
||||||
payment_method_type: Option<storage_enums::PaymentMethodType>,
|
payment_method_type: Option<storage_enums::PaymentMethodType>,
|
||||||
maybe_customer: &Option<storage::Customer>,
|
maybe_customer: &Option<storage::Customer>,
|
||||||
@ -539,7 +542,7 @@ pub(crate) async fn call_payment_method(
|
|||||||
let resp = cards::add_payment_method(
|
let resp = cards::add_payment_method(
|
||||||
state,
|
state,
|
||||||
payment_method_request,
|
payment_method_request,
|
||||||
merchant_id.to_string(),
|
merchant_account,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.attach_printable("Error on adding payment method")?;
|
.attach_printable("Error on adding payment method")?;
|
||||||
@ -567,13 +570,10 @@ pub(crate) async fn call_payment_method(
|
|||||||
metadata: None,
|
metadata: None,
|
||||||
customer_id: None,
|
customer_id: None,
|
||||||
};
|
};
|
||||||
let resp = cards::add_payment_method(
|
let resp =
|
||||||
state,
|
cards::add_payment_method(state, payment_method_request, merchant_account)
|
||||||
payment_method_request,
|
.await
|
||||||
merchant_id.to_string(),
|
.attach_printable("Error on adding payment method")?;
|
||||||
)
|
|
||||||
.await
|
|
||||||
.attach_printable("Error on adding payment method")?;
|
|
||||||
match resp {
|
match resp {
|
||||||
crate::services::BachResponse::Json(payment_method) => Ok(payment_method),
|
crate::services::BachResponse::Json(payment_method) => Ok(payment_method),
|
||||||
_ => Err(report!(errors::ApiErrorResponse::InternalServerError)
|
_ => Err(report!(errors::ApiErrorResponse::InternalServerError)
|
||||||
|
|||||||
@ -88,10 +88,9 @@ pub trait GetTracker<F, D, R>: Send {
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &R,
|
request: &R,
|
||||||
mandate_type: Option<api::MandateTxnType>,
|
mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(BoxedOperation<'a, F, R>, D, Option<CustomerDetails>)>;
|
) -> RouterResult<(BoxedOperation<'a, F, R>, D, Option<CustomerDetails>)>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,16 +32,17 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsCancelRequest>
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsCancelRequest,
|
request: &api::PaymentsCancelRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsCancelRequest>,
|
BoxedOperation<'a, F, api::PaymentsCancelRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
Option<CustomerDetails>,
|
Option<CustomerDetails>,
|
||||||
)> {
|
)> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
.get_payment_intent_id()
|
.get_payment_intent_id()
|
||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
|||||||
@ -33,16 +33,17 @@ impl<F: Send + Clone> GetTracker<F, payments::PaymentData<F>, api::PaymentsCaptu
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsCaptureRequest,
|
request: &api::PaymentsCaptureRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsCaptureRequest>,
|
BoxedOperation<'a, F, api::PaymentsCaptureRequest>,
|
||||||
payments::PaymentData<F>,
|
payments::PaymentData<F>,
|
||||||
Option<payments::CustomerDetails>,
|
Option<payments::CustomerDetails>,
|
||||||
)> {
|
)> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
let (payment_intent, mut payment_attempt, currency, amount);
|
let (payment_intent, mut payment_attempt, currency, amount);
|
||||||
|
|
||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
|
|||||||
@ -34,16 +34,17 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsRequest,
|
request: &api::PaymentsRequest,
|
||||||
mandate_type: Option<api::MandateTxnType>,
|
mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsRequest>,
|
BoxedOperation<'a, F, api::PaymentsRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
Option<CustomerDetails>,
|
Option<CustomerDetails>,
|
||||||
)> {
|
)> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
let (mut payment_intent, mut payment_attempt, currency, amount, connector_response);
|
let (mut payment_intent, mut payment_attempt, currency, amount, connector_response);
|
||||||
|
|
||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
@ -51,8 +52,13 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
|
||||||
let (token, payment_method_type, setup_mandate) =
|
let (token, payment_method_type, setup_mandate) =
|
||||||
helpers::get_token_pm_type_mandate_details(state, request, mandate_type, merchant_id)
|
helpers::get_token_pm_type_mandate_details(
|
||||||
.await?;
|
state,
|
||||||
|
request,
|
||||||
|
mandate_type,
|
||||||
|
merchant_account,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
payment_intent = db
|
payment_intent = db
|
||||||
.find_payment_intent_by_payment_id_merchant_id(&payment_id, merchant_id, storage_scheme)
|
.find_payment_intent_by_payment_id_merchant_id(&payment_id, merchant_id, storage_scheme)
|
||||||
|
|||||||
@ -39,10 +39,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsRequest,
|
request: &api::PaymentsRequest,
|
||||||
mandate_type: Option<api::MandateTxnType>,
|
mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsRequest>,
|
BoxedOperation<'a, F, api::PaymentsRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
@ -50,6 +49,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
)> {
|
)> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
|
|
||||||
let (payment_intent, payment_attempt, connector_response);
|
let (payment_intent, payment_attempt, connector_response);
|
||||||
|
|
||||||
let money @ (amount, currency) = payments_create_request_validation(request)?;
|
let money @ (amount, currency) = payments_create_request_validation(request)?;
|
||||||
@ -61,8 +63,13 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
|
||||||
let (token, payment_method_type, setup_mandate) =
|
let (token, payment_method_type, setup_mandate) =
|
||||||
helpers::get_token_pm_type_mandate_details(state, request, mandate_type, merchant_id)
|
helpers::get_token_pm_type_mandate_details(
|
||||||
.await?;
|
state,
|
||||||
|
request,
|
||||||
|
mandate_type,
|
||||||
|
merchant_account,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
let shipping_address = helpers::get_address_for_payment_request(
|
let shipping_address = helpers::get_address_for_payment_request(
|
||||||
db,
|
db,
|
||||||
|
|||||||
@ -66,16 +66,19 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::VerifyRequest> for Paym
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::VerifyRequest,
|
request: &api::VerifyRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: storage_enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::VerifyRequest>,
|
BoxedOperation<'a, F, api::VerifyRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
Option<payments::CustomerDetails>,
|
Option<payments::CustomerDetails>,
|
||||||
)> {
|
)> {
|
||||||
let db = &state.store;
|
let db = &state.store;
|
||||||
|
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
|
|
||||||
let (payment_intent, payment_attempt, connector_response);
|
let (payment_intent, payment_attempt, connector_response);
|
||||||
|
|
||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
|
|||||||
@ -37,10 +37,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsSessionRequest>
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsSessionRequest,
|
request: &api::PaymentsSessionRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsSessionRequest>,
|
BoxedOperation<'a, F, api::PaymentsSessionRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
@ -51,6 +50,8 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsSessionRequest>
|
|||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
|
|
||||||
let mut payment_attempt = db
|
let mut payment_attempt = db
|
||||||
.find_payment_attempt_by_payment_id_merchant_id(
|
.find_payment_attempt_by_payment_id_merchant_id(
|
||||||
|
|||||||
@ -34,10 +34,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsStartRequest> f
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
_request: &api::PaymentsStartRequest,
|
_request: &api::PaymentsStartRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsStartRequest>,
|
BoxedOperation<'a, F, api::PaymentsStartRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
@ -46,6 +45,8 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsStartRequest> f
|
|||||||
let (mut payment_intent, payment_attempt, currency, amount);
|
let (mut payment_intent, payment_attempt, currency, amount);
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
|
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
.get_payment_intent_id()
|
.get_payment_intent_id()
|
||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
|||||||
@ -152,10 +152,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRetrieveRequest
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsRetrieveRequest,
|
request: &api::PaymentsRetrieveRequest,
|
||||||
_mandate_type: Option<api::MandateTxnType>,
|
_mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsRetrieveRequest>,
|
BoxedOperation<'a, F, api::PaymentsRetrieveRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
@ -163,11 +162,11 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRetrieveRequest
|
|||||||
)> {
|
)> {
|
||||||
get_tracker_for_sync(
|
get_tracker_for_sync(
|
||||||
payment_id,
|
payment_id,
|
||||||
merchant_id,
|
&merchant_account.merchant_id,
|
||||||
&*state.store,
|
&*state.store,
|
||||||
request,
|
request,
|
||||||
self,
|
self,
|
||||||
storage_scheme,
|
merchant_account.storage_scheme,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,10 +33,9 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
&'a self,
|
&'a self,
|
||||||
state: &'a AppState,
|
state: &'a AppState,
|
||||||
payment_id: &api::PaymentIdType,
|
payment_id: &api::PaymentIdType,
|
||||||
merchant_id: &str,
|
|
||||||
request: &api::PaymentsRequest,
|
request: &api::PaymentsRequest,
|
||||||
mandate_type: Option<api::MandateTxnType>,
|
mandate_type: Option<api::MandateTxnType>,
|
||||||
storage_scheme: enums::MerchantStorageScheme,
|
merchant_account: &storage::MerchantAccount,
|
||||||
) -> RouterResult<(
|
) -> RouterResult<(
|
||||||
BoxedOperation<'a, F, api::PaymentsRequest>,
|
BoxedOperation<'a, F, api::PaymentsRequest>,
|
||||||
PaymentData<F>,
|
PaymentData<F>,
|
||||||
@ -47,11 +46,18 @@ impl<F: Send + Clone> GetTracker<F, PaymentData<F>, api::PaymentsRequest> for Pa
|
|||||||
let payment_id = payment_id
|
let payment_id = payment_id
|
||||||
.get_payment_intent_id()
|
.get_payment_intent_id()
|
||||||
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
.change_context(errors::ApiErrorResponse::PaymentNotFound)?;
|
||||||
|
let merchant_id = &merchant_account.merchant_id;
|
||||||
|
let storage_scheme = merchant_account.storage_scheme;
|
||||||
|
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
let (token, payment_method_type, setup_mandate) =
|
let (token, payment_method_type, setup_mandate) =
|
||||||
helpers::get_token_pm_type_mandate_details(state, request, mandate_type, merchant_id)
|
helpers::get_token_pm_type_mandate_details(
|
||||||
.await?;
|
state,
|
||||||
|
request,
|
||||||
|
mandate_type,
|
||||||
|
merchant_account,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
payment_attempt = db
|
payment_attempt = db
|
||||||
.find_payment_attempt_by_payment_id_merchant_id(
|
.find_payment_attempt_by_payment_id_merchant_id(
|
||||||
|
|||||||
@ -143,6 +143,7 @@ impl MerchantAccountInterface for MockDb {
|
|||||||
parent_merchant_id: merchant_account.parent_merchant_id,
|
parent_merchant_id: merchant_account.parent_merchant_id,
|
||||||
publishable_key: merchant_account.publishable_key,
|
publishable_key: merchant_account.publishable_key,
|
||||||
storage_scheme: enums::MerchantStorageScheme::PostgresOnly,
|
storage_scheme: enums::MerchantStorageScheme::PostgresOnly,
|
||||||
|
locker_id: merchant_account.locker_id,
|
||||||
};
|
};
|
||||||
accounts.push(account.clone());
|
accounts.push(account.clone());
|
||||||
Ok(account)
|
Ok(account)
|
||||||
|
|||||||
@ -21,9 +21,7 @@ pub async fn create_payment_method_api(
|
|||||||
&req,
|
&req,
|
||||||
json_payload.into_inner(),
|
json_payload.into_inner(),
|
||||||
|state, merchant_account, req| async move {
|
|state, merchant_account, req| async move {
|
||||||
let merchant_id = merchant_account.merchant_id.clone();
|
cards::add_payment_method(state, req, &merchant_account).await
|
||||||
|
|
||||||
cards::add_payment_method(state, req, merchant_id).await
|
|
||||||
},
|
},
|
||||||
api::MerchantAuthentication::ApiKey,
|
api::MerchantAuthentication::ApiKey,
|
||||||
)
|
)
|
||||||
@ -101,7 +99,7 @@ pub async fn payment_method_retrieve_api(
|
|||||||
&state,
|
&state,
|
||||||
&req,
|
&req,
|
||||||
payload,
|
payload,
|
||||||
|state, _, pm| cards::retrieve_payment_method(state, pm),
|
|state, merchant_account, pm| cards::retrieve_payment_method(state, pm, merchant_account),
|
||||||
api::MerchantAuthentication::ApiKey,
|
api::MerchantAuthentication::ApiKey,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|||||||
@ -562,6 +562,7 @@ pub async fn authenticate_merchant<'a>(
|
|||||||
redirect_to_merchant_with_http_post: false,
|
redirect_to_merchant_with_http_post: false,
|
||||||
publishable_key: None,
|
publishable_key: None,
|
||||||
storage_scheme: enums::MerchantStorageScheme::PostgresOnly,
|
storage_scheme: enums::MerchantStorageScheme::PostgresOnly,
|
||||||
|
locker_id: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,6 +15,7 @@ use crate::{
|
|||||||
storage::{self, enums as storage_enums},
|
storage::{self, enums as storage_enums},
|
||||||
transformers::ForeignInto,
|
transformers::ForeignInto,
|
||||||
},
|
},
|
||||||
|
utils::OptionExt,
|
||||||
};
|
};
|
||||||
|
|
||||||
newtype!(
|
newtype!(
|
||||||
@ -24,12 +25,20 @@ newtype!(
|
|||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
pub(crate) trait MandateResponseExt: Sized {
|
pub(crate) trait MandateResponseExt: Sized {
|
||||||
async fn from_db_mandate(state: &AppState, mandate: storage::Mandate) -> RouterResult<Self>;
|
async fn from_db_mandate(
|
||||||
|
state: &AppState,
|
||||||
|
mandate: storage::Mandate,
|
||||||
|
merchant_account: &storage::MerchantAccount,
|
||||||
|
) -> RouterResult<Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl MandateResponseExt for MandateResponse {
|
impl MandateResponseExt for MandateResponse {
|
||||||
async fn from_db_mandate(state: &AppState, mandate: storage::Mandate) -> RouterResult<Self> {
|
async fn from_db_mandate(
|
||||||
|
state: &AppState,
|
||||||
|
mandate: storage::Mandate,
|
||||||
|
merchant_account: &storage::MerchantAccount,
|
||||||
|
) -> RouterResult<Self> {
|
||||||
let db = &*state.store;
|
let db = &*state.store;
|
||||||
let payment_method = db
|
let payment_method = db
|
||||||
.find_payment_method(&mandate.payment_method_id)
|
.find_payment_method(&mandate.payment_method_id)
|
||||||
@ -39,9 +48,13 @@ impl MandateResponseExt for MandateResponse {
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
let card = if payment_method.payment_method == storage_enums::PaymentMethodType::Card {
|
let card = if payment_method.payment_method == storage_enums::PaymentMethodType::Card {
|
||||||
|
let locker_id = merchant_account
|
||||||
|
.locker_id
|
||||||
|
.to_owned()
|
||||||
|
.get_required_value("locker_id")?;
|
||||||
let get_card_resp = payment_methods::cards::get_card_from_legacy_locker(
|
let get_card_resp = payment_methods::cards::get_card_from_legacy_locker(
|
||||||
state,
|
state,
|
||||||
&payment_method.merchant_id,
|
&locker_id,
|
||||||
&payment_method.payment_method_id,
|
&payment_method.payment_method_id,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@ -22,6 +22,7 @@ pub struct MerchantAccount {
|
|||||||
pub parent_merchant_id: Option<String>,
|
pub parent_merchant_id: Option<String>,
|
||||||
pub publishable_key: Option<String>,
|
pub publishable_key: Option<String>,
|
||||||
pub storage_scheme: storage_enums::MerchantStorageScheme,
|
pub storage_scheme: storage_enums::MerchantStorageScheme,
|
||||||
|
pub locker_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default, Insertable, router_derive::DebugAsDisplay)]
|
#[derive(Clone, Debug, Default, Insertable, router_derive::DebugAsDisplay)]
|
||||||
@ -41,6 +42,7 @@ pub struct MerchantAccountNew {
|
|||||||
pub payment_response_hash_key: Option<String>,
|
pub payment_response_hash_key: Option<String>,
|
||||||
pub redirect_to_merchant_with_http_post: Option<bool>,
|
pub redirect_to_merchant_with_http_post: Option<bool>,
|
||||||
pub publishable_key: Option<String>,
|
pub publishable_key: Option<String>,
|
||||||
|
pub locker_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -60,6 +62,7 @@ pub enum MerchantAccountUpdate {
|
|||||||
payment_response_hash_key: Option<String>,
|
payment_response_hash_key: Option<String>,
|
||||||
redirect_to_merchant_with_http_post: Option<bool>,
|
redirect_to_merchant_with_http_post: Option<bool>,
|
||||||
publishable_key: Option<String>,
|
publishable_key: Option<String>,
|
||||||
|
locker_id: Option<String>,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +83,7 @@ pub struct MerchantAccountUpdateInternal {
|
|||||||
payment_response_hash_key: Option<String>,
|
payment_response_hash_key: Option<String>,
|
||||||
redirect_to_merchant_with_http_post: Option<bool>,
|
redirect_to_merchant_with_http_post: Option<bool>,
|
||||||
publishable_key: Option<String>,
|
publishable_key: Option<String>,
|
||||||
|
locker_id: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<MerchantAccountUpdate> for MerchantAccountUpdateInternal {
|
impl From<MerchantAccountUpdate> for MerchantAccountUpdateInternal {
|
||||||
@ -100,6 +104,7 @@ impl From<MerchantAccountUpdate> for MerchantAccountUpdateInternal {
|
|||||||
payment_response_hash_key,
|
payment_response_hash_key,
|
||||||
redirect_to_merchant_with_http_post,
|
redirect_to_merchant_with_http_post,
|
||||||
publishable_key,
|
publishable_key,
|
||||||
|
locker_id,
|
||||||
} => Self {
|
} => Self {
|
||||||
merchant_id: Some(merchant_id),
|
merchant_id: Some(merchant_id),
|
||||||
merchant_name,
|
merchant_name,
|
||||||
@ -115,6 +120,7 @@ impl From<MerchantAccountUpdate> for MerchantAccountUpdateInternal {
|
|||||||
payment_response_hash_key,
|
payment_response_hash_key,
|
||||||
redirect_to_merchant_with_http_post,
|
redirect_to_merchant_with_http_post,
|
||||||
publishable_key,
|
publishable_key,
|
||||||
|
locker_id,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -159,6 +159,7 @@ diesel::table! {
|
|||||||
parent_merchant_id -> Nullable<Varchar>,
|
parent_merchant_id -> Nullable<Varchar>,
|
||||||
publishable_key -> Nullable<Varchar>,
|
publishable_key -> Nullable<Varchar>,
|
||||||
storage_scheme -> MerchantStorageScheme,
|
storage_scheme -> MerchantStorageScheme,
|
||||||
|
locker_id -> Nullable<Varchar>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
-- This file should undo anything in `up.sql`
|
||||||
|
ALTER TABLE merchant_account
|
||||||
|
DROP COLUMN locker_id;
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
-- Your SQL goes here
|
||||||
|
ALTER TABLE merchant_account
|
||||||
|
ADD COLUMN locker_id VARCHAR(64);
|
||||||
Reference in New Issue
Block a user