diff --git a/api-reference-v2/openapi_spec.json b/api-reference-v2/openapi_spec.json index e1a745fd9b..63777d5283 100644 --- a/api-reference-v2/openapi_spec.json +++ b/api-reference-v2/openapi_spec.json @@ -14585,6 +14585,7 @@ "id", "status", "amount", + "customer_id", "connector", "client_secret", "created", @@ -14606,6 +14607,13 @@ "amount": { "$ref": "#/components/schemas/ConfirmIntentAmountDetailsResponse" }, + "customer_id": { + "type": "string", + "description": "The identifier for the customer", + "example": "12345_cus_01926c58bc6e77c09e809964e72af8c8", + "maxLength": 64, + "minLength": 32 + }, "connector": { "type": "string", "description": "The connector used for the payment", @@ -16330,6 +16338,7 @@ "id", "status", "amount", + "customer_id", "client_secret", "created" ], @@ -16347,6 +16356,13 @@ "amount": { "$ref": "#/components/schemas/ConfirmIntentAmountDetailsResponse" }, + "customer_id": { + "type": "string", + "description": "The identifier for the customer", + "example": "12345_cus_01926c58bc6e77c09e809964e72af8c8", + "maxLength": 64, + "minLength": 32 + }, "connector": { "type": "string", "description": "The connector used for the payment", diff --git a/crates/api_models/src/events/customer.rs b/crates/api_models/src/events/customer.rs index 891fb0e9d3..55a55fbcec 100644 --- a/crates/api_models/src/events/customer.rs +++ b/crates/api_models/src/events/customer.rs @@ -1,6 +1,8 @@ use common_utils::events::{ApiEventMetric, ApiEventsType}; -use crate::customers::{CustomerDeleteResponse, CustomerRequest, CustomerResponse}; +use crate::customers::{ + CustomerDeleteResponse, CustomerRequest, CustomerResponse, CustomerUpdateRequestInternal, +}; #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] impl ApiEventMetric for CustomerDeleteResponse { @@ -55,7 +57,7 @@ impl ApiEventMetric for CustomerResponse { } #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] -impl ApiEventMetric for crate::customers::CustomerUpdateRequestInternal { +impl ApiEventMetric for CustomerUpdateRequestInternal { fn get_api_event_type(&self) -> Option { Some(ApiEventsType::Customer { customer_id: self.customer_id.clone(), @@ -64,7 +66,7 @@ impl ApiEventMetric for crate::customers::CustomerUpdateRequestInternal { } #[cfg(all(feature = "v2", feature = "customer_v2"))] -impl ApiEventMetric for crate::customers::CustomerUpdateRequestInternal { +impl ApiEventMetric for CustomerUpdateRequestInternal { fn get_api_event_type(&self) -> Option { Some(ApiEventsType::Customer { customer_id: Some(self.id.clone()), diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 1c2a5c5a71..0ae906f3dc 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -4803,6 +4803,15 @@ pub struct PaymentsConfirmIntentResponse { /// Amount related information for this payment and attempt pub amount: ConfirmIntentAmountDetailsResponse, + /// The identifier for the customer + #[schema( + min_length = 32, + max_length = 64, + example = "12345_cus_01926c58bc6e77c09e809964e72af8c8", + value_type = String + )] + pub customer_id: Option, + /// The connector used for the payment #[schema(example = "stripe")] pub connector: String, @@ -4872,6 +4881,15 @@ pub struct PaymentsRetrieveResponse { /// Amount related information for this payment and attempt pub amount: ConfirmIntentAmountDetailsResponse, + /// The identifier for the customer + #[schema( + min_length = 32, + max_length = 64, + example = "12345_cus_01926c58bc6e77c09e809964e72af8c8", + value_type = String + )] + pub customer_id: Option, + /// The connector used for the payment #[schema(example = "stripe")] pub connector: Option, diff --git a/crates/router/src/core/customers.rs b/crates/router/src/core/customers.rs index 059ac4c2f3..65bbf736f1 100644 --- a/crates/router/src/core/customers.rs +++ b/crates/router/src/core/customers.rs @@ -568,7 +568,7 @@ pub async fn delete_customer( ) -> errors::CustomerResponse { let db = &*state.store; let key_manager_state = &(&state).into(); - id.fetch_domain_model_and_update_and_generate_delete_customer_response( + id.redact_customer_details_and_generate_response( db, &key_store, &merchant_account, @@ -585,7 +585,7 @@ pub async fn delete_customer( ))] #[async_trait::async_trait] impl CustomerDeleteBridge for id_type::GlobalCustomerId { - async fn fetch_domain_model_and_update_and_generate_delete_customer_response<'a>( + async fn redact_customer_details_and_generate_response<'a>( &'a self, db: &'a dyn StorageInterface, key_store: &'a domain::MerchantKeyStore, @@ -717,7 +717,7 @@ impl CustomerDeleteBridge for id_type::GlobalCustomerId { #[async_trait::async_trait] trait CustomerDeleteBridge { - async fn fetch_domain_model_and_update_and_generate_delete_customer_response<'a>( + async fn redact_customer_details_and_generate_response<'a>( &'a self, db: &'a dyn StorageInterface, key_store: &'a domain::MerchantKeyStore, @@ -742,7 +742,7 @@ pub async fn delete_customer( let db = &*state.store; let key_manager_state = &(&state).into(); customer_id - .fetch_domain_model_and_update_and_generate_delete_customer_response( + .redact_customer_details_and_generate_response( db, &key_store, &merchant_account, @@ -759,7 +759,7 @@ pub async fn delete_customer( ))] #[async_trait::async_trait] impl CustomerDeleteBridge for id_type::CustomerId { - async fn fetch_domain_model_and_update_and_generate_delete_customer_response<'a>( + async fn redact_customer_details_and_generate_response<'a>( &'a self, db: &'a dyn StorageInterface, key_store: &'a domain::MerchantKeyStore, diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index 15f01074c9..1e39831af1 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -1238,6 +1238,7 @@ where id: payment_intent.id.clone(), status: payment_intent.status, amount, + customer_id: payment_intent.customer_id.clone(), connector, client_secret: payment_intent.client_secret.clone(), created: payment_intent.created_at, @@ -1311,6 +1312,7 @@ where id: payment_intent.id.clone(), status: payment_intent.status, amount, + customer_id: payment_intent.customer_id.clone(), connector, billing: payment_address .get_payment_billing()