diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json index a2440cfccd..9467ac0820 100644 --- a/api-reference-v2/openapi_spec.json +++ b/api-reference-v2/openapi_spec.json @@ -8853,6 +8853,11 @@ "maxLength": 64, "minLength": 1 }, + "connector_customer_ids": { + "type": "object", + "description": "Connector specific customer reference ids", + "nullable": true + }, "name": { "type": "string", "description": "The customer's name", diff --git a/crates/api_models/Cargo.toml b/crates/api_models/Cargo.toml index 2b84c50bba..f89558e626 100644 --- a/crates/api_models/Cargo.toml +++ b/crates/api_models/Cargo.toml @@ -17,7 +17,7 @@ olap = [] openapi = ["common_enums/openapi", "olap", "recon", "dummy_connector", "olap"] recon = [] v1 = ["common_utils/v1"] -v2 = ["common_utils/v2", "customer_v2"] +v2 = ["common_types/v2", "common_utils/v2", "customer_v2"] customer_v2 = ["common_utils/customer_v2"] payment_methods_v2 = ["common_utils/payment_methods_v2"] dynamic_routing = [] diff --git a/crates/api_models/src/customers.rs b/crates/api_models/src/customers.rs index d78564ae53..eb61cae6e4 100644 --- a/crates/api_models/src/customers.rs +++ b/crates/api_models/src/customers.rs @@ -182,6 +182,9 @@ pub struct CustomerResponse { /// The identifier for the customer object #[schema(value_type = String, max_length = 64, min_length = 1, example = "cus_y3oqhf46pyzuxjbcn2giaqnb44")] pub merchant_reference_id: Option, + /// Connector specific customer reference ids + #[schema(value_type = Option, example = json!({"mca_hwySG2NtpzX0qr7toOy8": "cus_Rnm2pDKGyQi506"}))] + pub connector_customer_ids: Option, /// The customer's name #[schema(max_length = 255, value_type = Option, example = "Jon Test")] pub name: crypto::OptionalEncryptableName, diff --git a/crates/common_types/src/customers.rs b/crates/common_types/src/customers.rs new file mode 100644 index 0000000000..1d53630cad --- /dev/null +++ b/crates/common_types/src/customers.rs @@ -0,0 +1,30 @@ +//! Customer related types + +/// HashMap containing MerchantConnectorAccountId and corresponding customer id +#[cfg(feature = "v2")] +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, diesel::AsExpression)] +#[diesel(sql_type = diesel::sql_types::Jsonb)] +#[serde(transparent)] +pub struct ConnectorCustomerMap( + std::collections::HashMap, +); + +#[cfg(feature = "v2")] +common_utils::impl_to_sql_from_sql_json!(ConnectorCustomerMap); + +#[cfg(feature = "v2")] +impl std::ops::Deref for ConnectorCustomerMap { + type Target = + std::collections::HashMap; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +#[cfg(feature = "v2")] +impl std::ops::DerefMut for ConnectorCustomerMap { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} diff --git a/crates/common_types/src/lib.rs b/crates/common_types/src/lib.rs index 4d3d2380e2..589a77e3a5 100644 --- a/crates/common_types/src/lib.rs +++ b/crates/common_types/src/lib.rs @@ -2,6 +2,7 @@ #![warn(missing_docs, missing_debug_implementations)] +pub mod customers; pub mod domain; pub mod payment_methods; pub mod payments; diff --git a/crates/diesel_models/src/customers.rs b/crates/diesel_models/src/customers.rs index b0d4535ddb..24fe34c15d 100644 --- a/crates/diesel_models/src/customers.rs +++ b/crates/diesel_models/src/customers.rs @@ -76,7 +76,7 @@ pub struct CustomerNew { pub description: Option, pub created_at: PrimitiveDateTime, pub metadata: Option, - pub connector_customer: Option, + pub connector_customer: Option, pub modified_at: PrimitiveDateTime, pub default_payment_method_id: Option, pub updated_by: Option, @@ -158,7 +158,7 @@ pub struct Customer { pub description: Option, pub created_at: PrimitiveDateTime, pub metadata: Option, - pub connector_customer: Option, + pub connector_customer: Option, pub modified_at: PrimitiveDateTime, pub default_payment_method_id: Option, pub updated_by: Option, @@ -236,7 +236,7 @@ pub struct CustomerUpdateInternal { pub phone_country_code: Option, pub metadata: Option, pub modified_at: PrimitiveDateTime, - pub connector_customer: Option, + pub connector_customer: Option, pub default_payment_method_id: Option>, pub updated_by: Option, pub default_billing_address: Option, @@ -283,31 +283,3 @@ impl CustomerUpdateInternal { } } } - -#[cfg(all(feature = "v2", feature = "customer_v2"))] -#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize, diesel::AsExpression)] -#[diesel(sql_type = diesel::sql_types::Jsonb)] -#[serde(transparent)] -pub struct ConnectorCustomerMap( - std::collections::HashMap, -); - -#[cfg(all(feature = "v2", feature = "customer_v2"))] -common_utils::impl_to_sql_from_sql_json!(ConnectorCustomerMap); - -#[cfg(all(feature = "v2", feature = "customer_v2"))] -impl std::ops::Deref for ConnectorCustomerMap { - type Target = - std::collections::HashMap; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -#[cfg(all(feature = "v2", feature = "customer_v2"))] -impl std::ops::DerefMut for ConnectorCustomerMap { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} diff --git a/crates/hyperswitch_domain_models/src/customer.rs b/crates/hyperswitch_domain_models/src/customer.rs index 02c25d722c..384bc5ab42 100644 --- a/crates/hyperswitch_domain_models/src/customer.rs +++ b/crates/hyperswitch_domain_models/src/customer.rs @@ -56,7 +56,7 @@ pub struct Customer { pub description: Option, pub created_at: PrimitiveDateTime, pub metadata: Option, - pub connector_customer: Option, + pub connector_customer: Option, pub modified_at: PrimitiveDateTime, pub default_payment_method_id: Option, pub updated_by: Option, @@ -334,7 +334,7 @@ pub struct CustomerGeneralUpdate { pub description: Option, pub phone_country_code: Option, pub metadata: Option, - pub connector_customer: Box>, + pub connector_customer: Box>, pub default_billing_address: Option, pub default_shipping_address: Option, pub default_payment_method_id: Option>, @@ -346,7 +346,7 @@ pub struct CustomerGeneralUpdate { pub enum CustomerUpdate { Update(Box), ConnectorCustomer { - connector_customer: Option, + connector_customer: Option, }, UpdateDefaultPaymentMethod { default_payment_method_id: Option>, diff --git a/crates/router/src/types/api/customers.rs b/crates/router/src/types/api/customers.rs index 5b37fb2add..63ebfe4993 100644 --- a/crates/router/src/types/api/customers.rs +++ b/crates/router/src/types/api/customers.rs @@ -50,6 +50,7 @@ impl ForeignFrom for CustomerResponse { customers::CustomerResponse { id: cust.id, merchant_reference_id: cust.merchant_reference_id, + connector_customer_ids: cust.connector_customer, name: cust.name, email: cust.email, phone: cust.phone,