mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	feat: add support for merchant to pass public key and ttl for encrypting payload (#4456)
This commit is contained in:
		| @ -1042,6 +1042,9 @@ pub struct BusinessProfileUpdate { | |||||||
|  |  | ||||||
|     /// External 3DS authentication details |     /// External 3DS authentication details | ||||||
|     pub authentication_connector_details: Option<AuthenticationConnectorDetails>, |     pub authentication_connector_details: Option<AuthenticationConnectorDetails>, | ||||||
|  |  | ||||||
|  |     /// Merchant's config to support extended card info feature | ||||||
|  |     pub extended_card_info_config: Option<ExtendedCardInfoConfig>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, ToSchema)] | #[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, ToSchema)] | ||||||
| @ -1095,3 +1098,9 @@ pub struct ExtendedCardInfoChoice { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl common_utils::events::ApiEventMetric for ExtendedCardInfoChoice {} | impl common_utils::events::ApiEventMetric for ExtendedCardInfoChoice {} | ||||||
|  |  | ||||||
|  | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] | ||||||
|  | pub struct ExtendedCardInfoConfig { | ||||||
|  |     pub public_key: Secret<String>, | ||||||
|  |     pub ttl_in_secs: u16, | ||||||
|  | } | ||||||
|  | |||||||
| @ -36,6 +36,7 @@ pub struct BusinessProfile { | |||||||
|     pub session_expiry: Option<i64>, |     pub session_expiry: Option<i64>, | ||||||
|     pub authentication_connector_details: Option<serde_json::Value>, |     pub authentication_connector_details: Option<serde_json::Value>, | ||||||
|     pub is_extended_card_info_enabled: Option<bool>, |     pub is_extended_card_info_enabled: Option<bool>, | ||||||
|  |     pub extended_card_info_config: Option<pii::SecretSerdeValue>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | ||||||
| @ -63,6 +64,7 @@ pub struct BusinessProfileNew { | |||||||
|     pub session_expiry: Option<i64>, |     pub session_expiry: Option<i64>, | ||||||
|     pub authentication_connector_details: Option<serde_json::Value>, |     pub authentication_connector_details: Option<serde_json::Value>, | ||||||
|     pub is_extended_card_info_enabled: Option<bool>, |     pub is_extended_card_info_enabled: Option<bool>, | ||||||
|  |     pub extended_card_info_config: Option<pii::SecretSerdeValue>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | ||||||
| @ -87,6 +89,7 @@ pub struct BusinessProfileUpdateInternal { | |||||||
|     pub session_expiry: Option<i64>, |     pub session_expiry: Option<i64>, | ||||||
|     pub authentication_connector_details: Option<serde_json::Value>, |     pub authentication_connector_details: Option<serde_json::Value>, | ||||||
|     pub is_extended_card_info_enabled: Option<bool>, |     pub is_extended_card_info_enabled: Option<bool>, | ||||||
|  |     pub extended_card_info_config: Option<pii::SecretSerdeValue>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] | ||||||
| @ -109,6 +112,7 @@ pub enum BusinessProfileUpdate { | |||||||
|         payment_link_config: Option<serde_json::Value>, |         payment_link_config: Option<serde_json::Value>, | ||||||
|         session_expiry: Option<i64>, |         session_expiry: Option<i64>, | ||||||
|         authentication_connector_details: Option<serde_json::Value>, |         authentication_connector_details: Option<serde_json::Value>, | ||||||
|  |         extended_card_info_config: Option<pii::SecretSerdeValue>, | ||||||
|     }, |     }, | ||||||
|     ExtendedCardInfoUpdate { |     ExtendedCardInfoUpdate { | ||||||
|         is_extended_card_info_enabled: Option<bool>, |         is_extended_card_info_enabled: Option<bool>, | ||||||
| @ -136,6 +140,7 @@ impl From<BusinessProfileUpdate> for BusinessProfileUpdateInternal { | |||||||
|                 payment_link_config, |                 payment_link_config, | ||||||
|                 session_expiry, |                 session_expiry, | ||||||
|                 authentication_connector_details, |                 authentication_connector_details, | ||||||
|  |                 extended_card_info_config, | ||||||
|             } => Self { |             } => Self { | ||||||
|                 profile_name, |                 profile_name, | ||||||
|                 modified_at, |                 modified_at, | ||||||
| @ -154,6 +159,7 @@ impl From<BusinessProfileUpdate> for BusinessProfileUpdateInternal { | |||||||
|                 payment_link_config, |                 payment_link_config, | ||||||
|                 session_expiry, |                 session_expiry, | ||||||
|                 authentication_connector_details, |                 authentication_connector_details, | ||||||
|  |                 extended_card_info_config, | ||||||
|                 ..Default::default() |                 ..Default::default() | ||||||
|             }, |             }, | ||||||
|             BusinessProfileUpdate::ExtendedCardInfoUpdate { |             BusinessProfileUpdate::ExtendedCardInfoUpdate { | ||||||
| @ -190,6 +196,7 @@ impl From<BusinessProfileNew> for BusinessProfile { | |||||||
|             session_expiry: new.session_expiry, |             session_expiry: new.session_expiry, | ||||||
|             authentication_connector_details: new.authentication_connector_details, |             authentication_connector_details: new.authentication_connector_details, | ||||||
|             is_extended_card_info_enabled: new.is_extended_card_info_enabled, |             is_extended_card_info_enabled: new.is_extended_card_info_enabled, | ||||||
|  |             extended_card_info_config: new.extended_card_info_config, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -215,6 +222,7 @@ impl BusinessProfileUpdate { | |||||||
|             session_expiry, |             session_expiry, | ||||||
|             authentication_connector_details, |             authentication_connector_details, | ||||||
|             is_extended_card_info_enabled, |             is_extended_card_info_enabled, | ||||||
|  |             extended_card_info_config, | ||||||
|         } = self.into(); |         } = self.into(); | ||||||
|         BusinessProfile { |         BusinessProfile { | ||||||
|             profile_name: profile_name.unwrap_or(source.profile_name), |             profile_name: profile_name.unwrap_or(source.profile_name), | ||||||
| @ -237,6 +245,7 @@ impl BusinessProfileUpdate { | |||||||
|             session_expiry, |             session_expiry, | ||||||
|             authentication_connector_details, |             authentication_connector_details, | ||||||
|             is_extended_card_info_enabled, |             is_extended_card_info_enabled, | ||||||
|  |             extended_card_info_config, | ||||||
|             ..source |             ..source | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -194,6 +194,7 @@ diesel::table! { | |||||||
|         session_expiry -> Nullable<Int8>, |         session_expiry -> Nullable<Int8>, | ||||||
|         authentication_connector_details -> Nullable<Jsonb>, |         authentication_connector_details -> Nullable<Jsonb>, | ||||||
|         is_extended_card_info_enabled -> Nullable<Bool>, |         is_extended_card_info_enabled -> Nullable<Bool>, | ||||||
|  |         extended_card_info_config -> Nullable<Jsonb>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -439,6 +439,7 @@ pub async fn update_business_profile_cascade( | |||||||
|             payment_link_config: None, |             payment_link_config: None, | ||||||
|             session_expiry: None, |             session_expiry: None, | ||||||
|             authentication_connector_details: None, |             authentication_connector_details: None, | ||||||
|  |             extended_card_info_config: None, | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         let update_futures = business_profiles.iter().map(|business_profile| async { |         let update_futures = business_profiles.iter().map(|business_profile| async { | ||||||
| @ -1648,6 +1649,19 @@ pub async fn update_business_profile( | |||||||
|         }) |         }) | ||||||
|         .transpose()?; |         .transpose()?; | ||||||
|  |  | ||||||
|  |     let extended_card_info_config = request | ||||||
|  |         .extended_card_info_config | ||||||
|  |         .as_ref() | ||||||
|  |         .map(|config| { | ||||||
|  |             config | ||||||
|  |                 .encode_to_value() | ||||||
|  |                 .change_context(errors::ApiErrorResponse::InvalidDataValue { | ||||||
|  |                     field_name: "extended_card_info_config", | ||||||
|  |                 }) | ||||||
|  |         }) | ||||||
|  |         .transpose()? | ||||||
|  |         .map(Secret::new); | ||||||
|  |  | ||||||
|     let business_profile_update = storage::business_profile::BusinessProfileUpdate::Update { |     let business_profile_update = storage::business_profile::BusinessProfileUpdate::Update { | ||||||
|         profile_name: request.profile_name, |         profile_name: request.profile_name, | ||||||
|         modified_at: Some(date_time::now()), |         modified_at: Some(date_time::now()), | ||||||
| @ -1676,6 +1690,7 @@ pub async fn update_business_profile( | |||||||
|             .change_context(errors::ApiErrorResponse::InvalidDataValue { |             .change_context(errors::ApiErrorResponse::InvalidDataValue { | ||||||
|                 field_name: "authentication_connector_details", |                 field_name: "authentication_connector_details", | ||||||
|             })?, |             })?, | ||||||
|  |         extended_card_info_config, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     let updated_business_profile = db |     let updated_business_profile = db | ||||||
|  | |||||||
| @ -263,6 +263,7 @@ pub async fn update_business_profile_active_algorithm_ref( | |||||||
|         payment_link_config: None, |         payment_link_config: None, | ||||||
|         session_expiry: None, |         session_expiry: None, | ||||||
|         authentication_connector_details: None, |         authentication_connector_details: None, | ||||||
|  |         extended_card_info_config: None, | ||||||
|     }; |     }; | ||||||
|     db.update_business_profile_by_profile_id(current_business_profile, business_profile_update) |     db.update_business_profile_by_profile_id(current_business_profile, business_profile_update) | ||||||
|         .await |         .await | ||||||
|  | |||||||
| @ -176,6 +176,7 @@ impl ForeignTryFrom<(domain::MerchantAccount, BusinessProfileCreate)> | |||||||
|                     field_name: "authentication_connector_details", |                     field_name: "authentication_connector_details", | ||||||
|                 })?, |                 })?, | ||||||
|             is_extended_card_info_enabled: None, |             is_extended_card_info_enabled: None, | ||||||
|  |             extended_card_info_config: None, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,3 @@ | |||||||
|  | -- This file should undo anything in `up.sql` | ||||||
|  |  | ||||||
|  | ALTER TABLE business_profile DROP COLUMN IF EXISTS extended_card_info_config; | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | -- Your SQL goes here | ||||||
|  |  | ||||||
|  | ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS extended_card_info_config JSONB DEFAULT NULL; | ||||||
		Reference in New Issue
	
	Block a user
	 Chethan Rao
					Chethan Rao