refactor(router): nest the straight through algorithm column in payment attempt (#1040)

This commit is contained in:
ItsMeShashank
2023-05-04 19:24:34 +05:30
committed by GitHub
parent f0464bc4f5
commit 64fa21eb4f
7 changed files with 57 additions and 13 deletions

10
Cargo.lock generated
View File

@ -2949,7 +2949,7 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry" name = "opentelemetry"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
dependencies = [ dependencies = [
"opentelemetry_api", "opentelemetry_api",
"opentelemetry_sdk", "opentelemetry_sdk",
@ -2958,7 +2958,7 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry-otlp" name = "opentelemetry-otlp"
version = "0.11.0" version = "0.11.0"
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@ -2975,7 +2975,7 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry-proto" name = "opentelemetry-proto"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
dependencies = [ dependencies = [
"futures", "futures",
"futures-util", "futures-util",
@ -2987,7 +2987,7 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry_api" name = "opentelemetry_api"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
dependencies = [ dependencies = [
"fnv", "fnv",
"futures-channel", "futures-channel",
@ -3002,7 +3002,7 @@ dependencies = [
[[package]] [[package]]
name = "opentelemetry_sdk" name = "opentelemetry_sdk"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"crossbeam-channel", "crossbeam-channel",

View File

@ -263,6 +263,40 @@ pub enum RoutingAlgorithm {
Single(api_enums::RoutableConnectors), Single(api_enums::RoutableConnectors),
} }
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(
tag = "type",
content = "data",
rename_all = "snake_case",
from = "StraightThroughAlgorithmSerde",
into = "StraightThroughAlgorithmSerde"
)]
pub enum StraightThroughAlgorithm {
Single(api_enums::RoutableConnectors),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum StraightThroughAlgorithmSerde {
Direct(StraightThroughAlgorithm),
Nested { algorithm: StraightThroughAlgorithm },
}
impl From<StraightThroughAlgorithmSerde> for StraightThroughAlgorithm {
fn from(value: StraightThroughAlgorithmSerde) -> Self {
match value {
StraightThroughAlgorithmSerde::Direct(algorithm) => algorithm,
StraightThroughAlgorithmSerde::Nested { algorithm } => algorithm,
}
}
}
impl From<StraightThroughAlgorithm> for StraightThroughAlgorithmSerde {
fn from(value: StraightThroughAlgorithm) -> Self {
Self::Nested { algorithm: value }
}
}
#[derive(Clone, Debug, Deserialize, ToSchema, Serialize)] #[derive(Clone, Debug, Deserialize, ToSchema, Serialize)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct PrimaryBusinessDetails { pub struct PrimaryBusinessDetails {

View File

@ -1079,8 +1079,8 @@ where
.attach_printable("Invalid straight through algorithm format in payment attempt")?, .attach_printable("Invalid straight through algorithm format in payment attempt")?,
}; };
let request_straight_through: Option<api::RoutingAlgorithm> = request_straight_through let request_straight_through: Option<api::StraightThroughAlgorithm> = request_straight_through
.map(|val| val.parse_value("RoutingAlgorithm")) .map(|val| val.parse_value("StraightThroughAlgorithm"))
.transpose() .transpose()
.change_context(errors::ApiErrorResponse::InternalServerError) .change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Invalid straight through routing rules format")?; .attach_printable("Invalid straight through routing rules format")?;
@ -1108,7 +1108,7 @@ where
pub fn decide_connector( pub fn decide_connector(
state: &AppState, state: &AppState,
merchant_account: &storage::MerchantAccount, merchant_account: &storage::MerchantAccount,
request_straight_through: Option<api::RoutingAlgorithm>, request_straight_through: Option<api::StraightThroughAlgorithm>,
routing_data: &mut storage::RoutingData, routing_data: &mut storage::RoutingData,
) -> RouterResult<api::ConnectorCallType> { ) -> RouterResult<api::ConnectorCallType> {
if let Some(ref connector_name) = routing_data.routed_through { if let Some(ref connector_name) = routing_data.routed_through {
@ -1125,7 +1125,7 @@ pub fn decide_connector(
if let Some(routing_algorithm) = request_straight_through { if let Some(routing_algorithm) = request_straight_through {
let connector_name = match &routing_algorithm { let connector_name = match &routing_algorithm {
api::RoutingAlgorithm::Single(conn) => conn.to_string(), api::StraightThroughAlgorithm::Single(conn) => conn.to_string(),
}; };
let connector_data = api::ConnectorData::get_connector_by_name( let connector_data = api::ConnectorData::get_connector_by_name(
@ -1143,7 +1143,7 @@ pub fn decide_connector(
if let Some(ref routing_algorithm) = routing_data.algorithm { if let Some(ref routing_algorithm) = routing_data.algorithm {
let connector_name = match routing_algorithm { let connector_name = match routing_algorithm {
api::RoutingAlgorithm::Single(conn) => conn.to_string(), api::StraightThroughAlgorithm::Single(conn) => conn.to_string(),
}; };
let connector_data = api::ConnectorData::get_connector_by_name( let connector_data = api::ConnectorData::get_connector_by_name(

View File

@ -2,8 +2,8 @@ pub use api_models::admin::{
MerchantAccountCreate, MerchantAccountDeleteResponse, MerchantAccountResponse, MerchantAccountCreate, MerchantAccountDeleteResponse, MerchantAccountResponse,
MerchantAccountUpdate, MerchantConnectorCreate, MerchantConnectorDeleteResponse, MerchantAccountUpdate, MerchantConnectorCreate, MerchantConnectorDeleteResponse,
MerchantConnectorDetails, MerchantConnectorDetailsWrap, MerchantConnectorId, MerchantDetails, MerchantConnectorDetails, MerchantConnectorDetailsWrap, MerchantConnectorId, MerchantDetails,
MerchantId, PaymentMethodsEnabled, RoutingAlgorithm, ToggleKVRequest, ToggleKVResponse, MerchantId, PaymentMethodsEnabled, RoutingAlgorithm, StraightThroughAlgorithm, ToggleKVRequest,
WebhookDetails, ToggleKVResponse, WebhookDetails,
}; };
use common_utils::ext_traits::ValueExt; use common_utils::ext_traits::ValueExt;

View File

@ -5,7 +5,7 @@ pub use storage_models::payment_attempt::{
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RoutingData { pub struct RoutingData {
pub routed_through: Option<String>, pub routed_through: Option<String>,
pub algorithm: Option<api_models::admin::RoutingAlgorithm>, pub algorithm: Option<api_models::admin::StraightThroughAlgorithm>,
} }
#[cfg(feature = "kv_store")] #[cfg(feature = "kv_store")]

View File

@ -0,0 +1,7 @@
-- This file should undo anything in `up.sql`
UPDATE payment_attempt
SET straight_through_algorithm = CASE WHEN straight_through_algorithm->>'algorithm' IS NULL THEN
NULL
ELSE
straight_through_algorithm->'algorithm'
END;

View File

@ -0,0 +1,3 @@
-- Your SQL goes here
UPDATE payment_attempt
SET straight_through_algorithm = jsonb_build_object('algorithm', straight_through_algorithm);