mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 10:06:32 +08:00 
			
		
		
		
	feat(router): saving verified domains to business_profile table (#2109)
This commit is contained in:
		| @ -1012,6 +1012,9 @@ pub struct BusinessProfileCreate { | |||||||
|         deserialize_with = "payout_routing_algorithm::deserialize_option" |         deserialize_with = "payout_routing_algorithm::deserialize_option" | ||||||
|     )] |     )] | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |  | ||||||
|  |     /// Verified applepay domains for a particular profile | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, ToSchema, Serialize)] | #[derive(Clone, Debug, ToSchema, Serialize)] | ||||||
| @ -1073,6 +1076,9 @@ pub struct BusinessProfileResponse { | |||||||
|         deserialize_with = "payout_routing_algorithm::deserialize_option" |         deserialize_with = "payout_routing_algorithm::deserialize_option" | ||||||
|     )] |     )] | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |  | ||||||
|  |     /// Verified applepay domains for a particular profile | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Deserialize, ToSchema)] | #[derive(Clone, Debug, Deserialize, ToSchema)] | ||||||
| @ -1127,4 +1133,7 @@ pub struct BusinessProfileUpdate { | |||||||
|         deserialize_with = "payout_routing_algorithm::deserialize_option" |         deserialize_with = "payout_routing_algorithm::deserialize_option" | ||||||
|     )] |     )] | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |  | ||||||
|  |     /// Verified applepay domains for a particular profile | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ pub struct ApplepayMerchantVerificationConfigs { | |||||||
| #[serde(rename_all = "camelCase")] | #[serde(rename_all = "camelCase")] | ||||||
| pub struct ApplepayMerchantVerificationRequest { | pub struct ApplepayMerchantVerificationRequest { | ||||||
|     pub domain_names: Vec<String>, |     pub domain_names: Vec<String>, | ||||||
|  |     pub business_profile_id: String, | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Response to be sent for the verify/applepay api | /// Response to be sent for the verify/applepay api | ||||||
|  | |||||||
| @ -30,6 +30,8 @@ pub struct BusinessProfile { | |||||||
|     pub frm_routing_algorithm: Option<serde_json::Value>, |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub is_recon_enabled: bool, |     pub is_recon_enabled: bool, | ||||||
|  |     #[diesel(deserialize_as = super::OptionalDieselArray<String>)] | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | ||||||
| @ -51,6 +53,8 @@ pub struct BusinessProfileNew { | |||||||
|     pub frm_routing_algorithm: Option<serde_json::Value>, |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub is_recon_enabled: bool, |     pub is_recon_enabled: bool, | ||||||
|  |     #[diesel(deserialize_as = super::OptionalDieselArray<String>)] | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | ||||||
| @ -69,6 +73,8 @@ pub struct BusinessProfileUpdateInternal { | |||||||
|     pub frm_routing_algorithm: Option<serde_json::Value>, |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|     pub is_recon_enabled: Option<bool>, |     pub is_recon_enabled: Option<bool>, | ||||||
|  |     #[diesel(deserialize_as = super::OptionalDieselArray<String>)] | ||||||
|  |     pub applepay_verified_domains: Option<Vec<String>>, | ||||||
| } | } | ||||||
|  |  | ||||||
| impl From<BusinessProfileNew> for BusinessProfile { | impl From<BusinessProfileNew> for BusinessProfile { | ||||||
| @ -90,6 +96,7 @@ impl From<BusinessProfileNew> for BusinessProfile { | |||||||
|             frm_routing_algorithm: new.frm_routing_algorithm, |             frm_routing_algorithm: new.frm_routing_algorithm, | ||||||
|             payout_routing_algorithm: new.payout_routing_algorithm, |             payout_routing_algorithm: new.payout_routing_algorithm, | ||||||
|             is_recon_enabled: new.is_recon_enabled, |             is_recon_enabled: new.is_recon_enabled, | ||||||
|  |             applepay_verified_domains: new.applepay_verified_domains, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -78,6 +78,7 @@ diesel::table! { | |||||||
|         frm_routing_algorithm -> Nullable<Jsonb>, |         frm_routing_algorithm -> Nullable<Jsonb>, | ||||||
|         payout_routing_algorithm -> Nullable<Jsonb>, |         payout_routing_algorithm -> Nullable<Jsonb>, | ||||||
|         is_recon_enabled -> Bool, |         is_recon_enabled -> Bool, | ||||||
|  |         applepay_verified_domains -> Nullable<Array<Nullable<Text>>>, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -1166,6 +1166,7 @@ pub async fn update_business_profile( | |||||||
|         frm_routing_algorithm: request.frm_routing_algorithm, |         frm_routing_algorithm: request.frm_routing_algorithm, | ||||||
|         payout_routing_algorithm: request.payout_routing_algorithm, |         payout_routing_algorithm: request.payout_routing_algorithm, | ||||||
|         is_recon_enabled: None, |         is_recon_enabled: None, | ||||||
|  |         applepay_verified_domains: request.applepay_verified_domains, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     let updated_business_profile = db |     let updated_business_profile = db | ||||||
|  | |||||||
| @ -70,6 +70,7 @@ impl ForeignTryFrom<storage::business_profile::BusinessProfile> for BusinessProf | |||||||
|             intent_fulfillment_time: item.intent_fulfillment_time, |             intent_fulfillment_time: item.intent_fulfillment_time, | ||||||
|             frm_routing_algorithm: item.frm_routing_algorithm, |             frm_routing_algorithm: item.frm_routing_algorithm, | ||||||
|             payout_routing_algorithm: item.payout_routing_algorithm, |             payout_routing_algorithm: item.payout_routing_algorithm, | ||||||
|  |             applepay_verified_domains: item.applepay_verified_domains, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -136,6 +137,7 @@ impl ForeignTryFrom<(domain::MerchantAccount, BusinessProfileCreate)> | |||||||
|                 .payout_routing_algorithm |                 .payout_routing_algorithm | ||||||
|                 .or(merchant_account.payout_routing_algorithm), |                 .or(merchant_account.payout_routing_algorithm), | ||||||
|             is_recon_enabled: merchant_account.is_recon_enabled, |             is_recon_enabled: merchant_account.is_recon_enabled, | ||||||
|  |             applepay_verified_domains: request.applepay_verified_domains, | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| use actix_web::web; | use actix_web::web; | ||||||
| #[cfg(all(feature = "olap", feature = "kms"))] | #[cfg(all(feature = "olap", feature = "kms"))] | ||||||
| use api_models::verifications::{self, ApplepayMerchantResponse}; | use api_models::verifications::{self, ApplepayMerchantResponse}; | ||||||
|  | use common_utils::errors::CustomResult; | ||||||
|  | use diesel_models::business_profile::{BusinessProfile, BusinessProfileUpdateInternal}; | ||||||
| use error_stack::{Report, ResultExt}; | use error_stack::{Report, ResultExt}; | ||||||
| #[cfg(feature = "kms")] | #[cfg(feature = "kms")] | ||||||
| use external_services::kms; | use external_services::kms; | ||||||
| @ -19,7 +21,7 @@ pub async fn verify_merchant_creds_for_applepay( | |||||||
|     _req: &actix_web::HttpRequest, |     _req: &actix_web::HttpRequest, | ||||||
|     body: web::Json<verifications::ApplepayMerchantVerificationRequest>, |     body: web::Json<verifications::ApplepayMerchantVerificationRequest>, | ||||||
|     kms_config: &kms::KmsConfig, |     kms_config: &kms::KmsConfig, | ||||||
| ) -> common_utils::errors::CustomResult< | ) -> CustomResult< | ||||||
|     services::ApplicationResponse<ApplepayMerchantResponse>, |     services::ApplicationResponse<ApplepayMerchantResponse>, | ||||||
|     api_error_response::ApiErrorResponse, |     api_error_response::ApiErrorResponse, | ||||||
| > { | > { | ||||||
| @ -30,7 +32,6 @@ pub async fn verify_merchant_creds_for_applepay( | |||||||
|     let encrypted_cert = &state.conf.applepay_merchant_configs.merchant_cert; |     let encrypted_cert = &state.conf.applepay_merchant_configs.merchant_cert; | ||||||
|     let encrypted_key = &state.conf.applepay_merchant_configs.merchant_cert_key; |     let encrypted_key = &state.conf.applepay_merchant_configs.merchant_cert_key; | ||||||
|     let applepay_endpoint = &state.conf.applepay_merchant_configs.applepay_endpoint; |     let applepay_endpoint = &state.conf.applepay_merchant_configs.applepay_endpoint; | ||||||
|  |  | ||||||
|     let applepay_internal_merchant_identifier = kms::get_kms_client(kms_config) |     let applepay_internal_merchant_identifier = kms::get_kms_client(kms_config) | ||||||
|         .await |         .await | ||||||
|         .decrypt(encrypted_merchant_identifier) |         .decrypt(encrypted_merchant_identifier) | ||||||
| @ -84,10 +85,19 @@ pub async fn verify_merchant_creds_for_applepay( | |||||||
|  |  | ||||||
|     // Error is already logged |     // Error is already logged | ||||||
|     Ok(match applepay_response { |     Ok(match applepay_response { | ||||||
|         Ok(_) => services::api::ApplicationResponse::Json(ApplepayMerchantResponse { |         Ok(_) => { | ||||||
|  |             check_existence_and_add_domain_to_db( | ||||||
|  |                 state, | ||||||
|  |                 body.business_profile_id.clone(), | ||||||
|  |                 body.domain_names.clone(), | ||||||
|  |             ) | ||||||
|  |             .await | ||||||
|  |             .change_context(api_error_response::ApiErrorResponse::InternalServerError)?; | ||||||
|  |             services::api::ApplicationResponse::Json(ApplepayMerchantResponse { | ||||||
|                 status_code: "200".to_string(), |                 status_code: "200".to_string(), | ||||||
|                 status_message: "Applepay verification Completed".to_string(), |                 status_message: "Applepay verification Completed".to_string(), | ||||||
|         }), |             }) | ||||||
|  |         } | ||||||
|         Err(error) => { |         Err(error) => { | ||||||
|             logger::error!(?error); |             logger::error!(?error); | ||||||
|             services::api::ApplicationResponse::Json(ApplepayMerchantResponse { |             services::api::ApplicationResponse::Json(ApplepayMerchantResponse { | ||||||
| @ -98,6 +108,52 @@ pub async fn verify_merchant_creds_for_applepay( | |||||||
|     }) |     }) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Checks whether or not the domain verified is already present in db if not adds it | ||||||
|  | async fn check_existence_and_add_domain_to_db( | ||||||
|  |     state: &AppState, | ||||||
|  |     business_profile_id: String, | ||||||
|  |     domain_from_req: Vec<String>, | ||||||
|  | ) -> CustomResult<BusinessProfile, errors::StorageError> { | ||||||
|  |     let business_profile = state | ||||||
|  |         .store | ||||||
|  |         .find_business_profile_by_profile_id(&business_profile_id) | ||||||
|  |         .await?; | ||||||
|  |     let business_profile_to_update = business_profile.clone(); | ||||||
|  |     let mut already_verified_domains = business_profile | ||||||
|  |         .applepay_verified_domains | ||||||
|  |         .unwrap_or_default(); | ||||||
|  |  | ||||||
|  |     let mut new_verified_domains: Vec<String> = domain_from_req | ||||||
|  |         .into_iter() | ||||||
|  |         .filter(|req_domain| !already_verified_domains.contains(req_domain)) | ||||||
|  |         .collect(); | ||||||
|  |  | ||||||
|  |     already_verified_domains.append(&mut new_verified_domains); | ||||||
|  |  | ||||||
|  |     let update_business_profile = BusinessProfileUpdateInternal { | ||||||
|  |         applepay_verified_domains: Some(already_verified_domains), | ||||||
|  |         profile_name: Some(business_profile.profile_name), | ||||||
|  |         modified_at: Some(business_profile.modified_at), | ||||||
|  |         return_url: business_profile.return_url, | ||||||
|  |         enable_payment_response_hash: Some(business_profile.enable_payment_response_hash), | ||||||
|  |         payment_response_hash_key: business_profile.payment_response_hash_key, | ||||||
|  |         redirect_to_merchant_with_http_post: Some( | ||||||
|  |             business_profile.redirect_to_merchant_with_http_post, | ||||||
|  |         ), | ||||||
|  |         webhook_details: business_profile.webhook_details, | ||||||
|  |         metadata: business_profile.metadata, | ||||||
|  |         routing_algorithm: business_profile.routing_algorithm, | ||||||
|  |         intent_fulfillment_time: business_profile.intent_fulfillment_time, | ||||||
|  |         frm_routing_algorithm: business_profile.frm_routing_algorithm, | ||||||
|  |         payout_routing_algorithm: business_profile.payout_routing_algorithm, | ||||||
|  |         is_recon_enabled: Some(business_profile.is_recon_enabled), | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     state | ||||||
|  |         .store | ||||||
|  |         .update_business_profile_by_profile_id(business_profile_to_update, update_business_profile) | ||||||
|  |         .await | ||||||
|  | } | ||||||
| fn log_applepay_verification_response_if_error( | fn log_applepay_verification_response_if_error( | ||||||
|     response: &Result<Result<types::Response, types::Response>, Report<errors::ApiClientError>>, |     response: &Result<Result<types::Response, types::Response>, Report<errors::ApiClientError>>, | ||||||
| ) { | ) { | ||||||
|  | |||||||
| @ -0,0 +1,2 @@ | |||||||
|  | ALTER TABLE business_profile DROP COLUMN IF EXISTS applepay_verified_domains; | ||||||
|  |  | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | ALTER TABLE business_profile | ||||||
|  | ADD COLUMN IF NOT EXISTS applepay_verified_domains text[]; | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Prajjwal Kumar
					Prajjwal Kumar