mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	refactor(merchant_account_v2): recreate id for merchant_account v2  (#5439)
				
					
				
			Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
		| @ -440,7 +440,7 @@ pub struct MerchantAccountResponse { | |||||||
| pub struct MerchantAccountResponse { | pub struct MerchantAccountResponse { | ||||||
|     /// The identifier for the Merchant Account |     /// The identifier for the Merchant Account | ||||||
|     #[schema(max_length = 64, example = "y3oqhf46pyzuxjbcn2giaqnb44")] |     #[schema(max_length = 64, example = "y3oqhf46pyzuxjbcn2giaqnb44")] | ||||||
|     pub id: String, |     pub id: id_type::MerchantId, | ||||||
|  |  | ||||||
|     /// Name of the Merchant Account |     /// Name of the Merchant Account | ||||||
|     #[schema(value_type = String,example = "NewAge Retailer")] |     #[schema(value_type = String,example = "NewAge Retailer")] | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| use common_utils::{encryption::Encryption, id_type, pii}; | use common_utils::{encryption::Encryption, pii}; | ||||||
| use diesel::{AsChangeset, Identifiable, Insertable, Queryable, Selectable}; | use diesel::{AsChangeset, Identifiable, Insertable, Queryable, Selectable}; | ||||||
|  |  | ||||||
| use crate::enums as storage_enums; | use crate::enums as storage_enums; | ||||||
| @ -10,6 +10,9 @@ use crate::schema::merchant_account; | |||||||
| #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
| use crate::schema_v2::merchant_account; | use crate::schema_v2::merchant_account; | ||||||
|  |  | ||||||
|  | /// Note: The order of fields in the struct is important. | ||||||
|  | /// This should be in the same order as the fields in the schema.rs file, otherwise the code will not compile | ||||||
|  | /// If two adjacent columns have the same type, then the compiler will not throw any error, but the fields read / written will be interchanged | ||||||
| #[cfg(all( | #[cfg(all( | ||||||
|     any(feature = "v1", feature = "v2"), |     any(feature = "v1", feature = "v2"), | ||||||
|     not(feature = "merchant_account_v2") |     not(feature = "merchant_account_v2") | ||||||
| @ -26,49 +29,7 @@ use crate::schema_v2::merchant_account; | |||||||
| )] | )] | ||||||
| #[diesel(table_name = merchant_account, primary_key(merchant_id), check_for_backend(diesel::pg::Pg))] | #[diesel(table_name = merchant_account, primary_key(merchant_id), check_for_backend(diesel::pg::Pg))] | ||||||
| pub struct MerchantAccount { | pub struct MerchantAccount { | ||||||
|     pub merchant_id: id_type::MerchantId, |     merchant_id: common_utils::id_type::MerchantId, | ||||||
|     pub return_url: Option<String>, |  | ||||||
|     pub enable_payment_response_hash: bool, |  | ||||||
|     pub payment_response_hash_key: Option<String>, |  | ||||||
|     pub redirect_to_merchant_with_http_post: bool, |  | ||||||
|     pub merchant_name: Option<Encryption>, |  | ||||||
|     pub merchant_details: Option<Encryption>, |  | ||||||
|     pub webhook_details: Option<serde_json::Value>, |  | ||||||
|     pub sub_merchants_enabled: Option<bool>, |  | ||||||
|     pub parent_merchant_id: Option<id_type::MerchantId>, |  | ||||||
|     pub publishable_key: Option<String>, |  | ||||||
|     pub storage_scheme: storage_enums::MerchantStorageScheme, |  | ||||||
|     pub locker_id: Option<String>, |  | ||||||
|     pub metadata: Option<pii::SecretSerdeValue>, |  | ||||||
|     pub routing_algorithm: Option<serde_json::Value>, |  | ||||||
|     pub primary_business_details: serde_json::Value, |  | ||||||
|     pub intent_fulfillment_time: Option<i64>, |  | ||||||
|     pub created_at: time::PrimitiveDateTime, |  | ||||||
|     pub modified_at: time::PrimitiveDateTime, |  | ||||||
|     pub frm_routing_algorithm: Option<serde_json::Value>, |  | ||||||
|     pub payout_routing_algorithm: Option<serde_json::Value>, |  | ||||||
|     pub organization_id: id_type::OrganizationId, |  | ||||||
|     pub is_recon_enabled: bool, |  | ||||||
|     pub default_profile: Option<String>, |  | ||||||
|     pub recon_status: storage_enums::ReconStatus, |  | ||||||
|     pub payment_link_config: Option<serde_json::Value>, |  | ||||||
|     pub pm_collect_link_config: Option<serde_json::Value>, |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] |  | ||||||
| #[derive( |  | ||||||
|     Clone, |  | ||||||
|     Debug, |  | ||||||
|     serde::Deserialize, |  | ||||||
|     Identifiable, |  | ||||||
|     serde::Serialize, |  | ||||||
|     Queryable, |  | ||||||
|     router_derive::DebugAsDisplay, |  | ||||||
|     Selectable, |  | ||||||
| )] |  | ||||||
| #[diesel(table_name = merchant_account, primary_key(merchant_id), check_for_backend(diesel::pg::Pg))] |  | ||||||
| pub struct MerchantAccount { |  | ||||||
|     pub merchant_id: id_type::MerchantId, |  | ||||||
|     pub return_url: Option<String>, |     pub return_url: Option<String>, | ||||||
|     pub enable_payment_response_hash: bool, |     pub enable_payment_response_hash: bool, | ||||||
|     pub payment_response_hash_key: Option<String>, |     pub payment_response_hash_key: Option<String>, | ||||||
| @ -89,7 +50,190 @@ pub struct MerchantAccount { | |||||||
|     pub modified_at: time::PrimitiveDateTime, |     pub modified_at: time::PrimitiveDateTime, | ||||||
|     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 organization_id: id_type::OrganizationId, |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|  |     pub is_recon_enabled: bool, | ||||||
|  |     pub default_profile: Option<String>, | ||||||
|  |     pub recon_status: storage_enums::ReconStatus, | ||||||
|  |     pub payment_link_config: Option<serde_json::Value>, | ||||||
|  |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all( | ||||||
|  |     any(feature = "v1", feature = "v2"), | ||||||
|  |     not(feature = "merchant_account_v2") | ||||||
|  | ))] | ||||||
|  | pub struct MerchantAccountSetter { | ||||||
|  |     pub merchant_id: common_utils::id_type::MerchantId, | ||||||
|  |     pub return_url: Option<String>, | ||||||
|  |     pub enable_payment_response_hash: bool, | ||||||
|  |     pub payment_response_hash_key: Option<String>, | ||||||
|  |     pub redirect_to_merchant_with_http_post: bool, | ||||||
|  |     pub merchant_name: Option<Encryption>, | ||||||
|  |     pub merchant_details: Option<Encryption>, | ||||||
|  |     pub webhook_details: Option<serde_json::Value>, | ||||||
|  |     pub sub_merchants_enabled: Option<bool>, | ||||||
|  |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|  |     pub publishable_key: Option<String>, | ||||||
|  |     pub storage_scheme: storage_enums::MerchantStorageScheme, | ||||||
|  |     pub locker_id: Option<String>, | ||||||
|  |     pub metadata: Option<pii::SecretSerdeValue>, | ||||||
|  |     pub routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub primary_business_details: serde_json::Value, | ||||||
|  |     pub intent_fulfillment_time: Option<i64>, | ||||||
|  |     pub created_at: time::PrimitiveDateTime, | ||||||
|  |     pub modified_at: time::PrimitiveDateTime, | ||||||
|  |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|  |     pub is_recon_enabled: bool, | ||||||
|  |     pub default_profile: Option<String>, | ||||||
|  |     pub recon_status: storage_enums::ReconStatus, | ||||||
|  |     pub payment_link_config: Option<serde_json::Value>, | ||||||
|  |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all( | ||||||
|  |     any(feature = "v1", feature = "v2"), | ||||||
|  |     not(feature = "merchant_account_v2") | ||||||
|  | ))] | ||||||
|  | impl From<MerchantAccountSetter> for MerchantAccount { | ||||||
|  |     fn from(item: MerchantAccountSetter) -> Self { | ||||||
|  |         Self { | ||||||
|  |             merchant_id: item.merchant_id, | ||||||
|  |             return_url: item.return_url, | ||||||
|  |             enable_payment_response_hash: item.enable_payment_response_hash, | ||||||
|  |             payment_response_hash_key: item.payment_response_hash_key, | ||||||
|  |             redirect_to_merchant_with_http_post: item.redirect_to_merchant_with_http_post, | ||||||
|  |             merchant_name: item.merchant_name, | ||||||
|  |             merchant_details: item.merchant_details, | ||||||
|  |             webhook_details: item.webhook_details, | ||||||
|  |             sub_merchants_enabled: item.sub_merchants_enabled, | ||||||
|  |             parent_merchant_id: item.parent_merchant_id, | ||||||
|  |             publishable_key: item.publishable_key, | ||||||
|  |             storage_scheme: item.storage_scheme, | ||||||
|  |             locker_id: item.locker_id, | ||||||
|  |             metadata: item.metadata, | ||||||
|  |             routing_algorithm: item.routing_algorithm, | ||||||
|  |             primary_business_details: item.primary_business_details, | ||||||
|  |             intent_fulfillment_time: item.intent_fulfillment_time, | ||||||
|  |             created_at: item.created_at, | ||||||
|  |             modified_at: item.modified_at, | ||||||
|  |             frm_routing_algorithm: item.frm_routing_algorithm, | ||||||
|  |             payout_routing_algorithm: item.payout_routing_algorithm, | ||||||
|  |             organization_id: item.organization_id, | ||||||
|  |             is_recon_enabled: item.is_recon_enabled, | ||||||
|  |             default_profile: item.default_profile, | ||||||
|  |             recon_status: item.recon_status, | ||||||
|  |             payment_link_config: item.payment_link_config, | ||||||
|  |             pm_collect_link_config: item.pm_collect_link_config, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /// Note: The order of fields in the struct is important. | ||||||
|  | /// This should be in the same order as the fields in the schema.rs file, otherwise the code will not compile | ||||||
|  | /// If two adjacent columns have the same type, then the compiler will not throw any error, but the fields read / written will be interchanged | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | #[derive( | ||||||
|  |     Clone, | ||||||
|  |     Debug, | ||||||
|  |     serde::Deserialize, | ||||||
|  |     Identifiable, | ||||||
|  |     serde::Serialize, | ||||||
|  |     Queryable, | ||||||
|  |     router_derive::DebugAsDisplay, | ||||||
|  |     Selectable, | ||||||
|  | )] | ||||||
|  | #[diesel(table_name = merchant_account, primary_key(id), check_for_backend(diesel::pg::Pg))] | ||||||
|  | pub struct MerchantAccount { | ||||||
|  |     pub return_url: Option<String>, | ||||||
|  |     pub enable_payment_response_hash: bool, | ||||||
|  |     pub payment_response_hash_key: Option<String>, | ||||||
|  |     pub redirect_to_merchant_with_http_post: bool, | ||||||
|  |     pub merchant_name: Option<Encryption>, | ||||||
|  |     pub merchant_details: Option<Encryption>, | ||||||
|  |     pub webhook_details: Option<serde_json::Value>, | ||||||
|  |     pub sub_merchants_enabled: Option<bool>, | ||||||
|  |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|  |     pub publishable_key: Option<String>, | ||||||
|  |     pub storage_scheme: storage_enums::MerchantStorageScheme, | ||||||
|  |     pub locker_id: Option<String>, | ||||||
|  |     pub metadata: Option<pii::SecretSerdeValue>, | ||||||
|  |     pub routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub primary_business_details: serde_json::Value, | ||||||
|  |     pub intent_fulfillment_time: Option<i64>, | ||||||
|  |     pub created_at: time::PrimitiveDateTime, | ||||||
|  |     pub modified_at: time::PrimitiveDateTime, | ||||||
|  |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|  |     pub is_recon_enabled: bool, | ||||||
|  |     pub default_profile: Option<String>, | ||||||
|  |     pub recon_status: storage_enums::ReconStatus, | ||||||
|  |     pub payment_link_config: Option<serde_json::Value>, | ||||||
|  |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
|  |     pub id: common_utils::id_type::MerchantId, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | impl From<MerchantAccountSetter> for MerchantAccount { | ||||||
|  |     fn from(item: MerchantAccountSetter) -> Self { | ||||||
|  |         Self { | ||||||
|  |             id: item.id, | ||||||
|  |             return_url: item.return_url, | ||||||
|  |             enable_payment_response_hash: item.enable_payment_response_hash, | ||||||
|  |             payment_response_hash_key: item.payment_response_hash_key, | ||||||
|  |             redirect_to_merchant_with_http_post: item.redirect_to_merchant_with_http_post, | ||||||
|  |             merchant_name: item.merchant_name, | ||||||
|  |             merchant_details: item.merchant_details, | ||||||
|  |             webhook_details: item.webhook_details, | ||||||
|  |             sub_merchants_enabled: item.sub_merchants_enabled, | ||||||
|  |             parent_merchant_id: item.parent_merchant_id, | ||||||
|  |             publishable_key: item.publishable_key, | ||||||
|  |             storage_scheme: item.storage_scheme, | ||||||
|  |             locker_id: item.locker_id, | ||||||
|  |             metadata: item.metadata, | ||||||
|  |             routing_algorithm: item.routing_algorithm, | ||||||
|  |             primary_business_details: item.primary_business_details, | ||||||
|  |             intent_fulfillment_time: item.intent_fulfillment_time, | ||||||
|  |             created_at: item.created_at, | ||||||
|  |             modified_at: item.modified_at, | ||||||
|  |             frm_routing_algorithm: item.frm_routing_algorithm, | ||||||
|  |             payout_routing_algorithm: item.payout_routing_algorithm, | ||||||
|  |             organization_id: item.organization_id, | ||||||
|  |             is_recon_enabled: item.is_recon_enabled, | ||||||
|  |             default_profile: item.default_profile, | ||||||
|  |             recon_status: item.recon_status, | ||||||
|  |             payment_link_config: item.payment_link_config, | ||||||
|  |             pm_collect_link_config: item.pm_collect_link_config, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | pub struct MerchantAccountSetter { | ||||||
|  |     pub id: common_utils::id_type::MerchantId, | ||||||
|  |     pub return_url: Option<String>, | ||||||
|  |     pub enable_payment_response_hash: bool, | ||||||
|  |     pub payment_response_hash_key: Option<String>, | ||||||
|  |     pub redirect_to_merchant_with_http_post: bool, | ||||||
|  |     pub merchant_name: Option<Encryption>, | ||||||
|  |     pub merchant_details: Option<Encryption>, | ||||||
|  |     pub webhook_details: Option<serde_json::Value>, | ||||||
|  |     pub sub_merchants_enabled: Option<bool>, | ||||||
|  |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|  |     pub publishable_key: Option<String>, | ||||||
|  |     pub storage_scheme: storage_enums::MerchantStorageScheme, | ||||||
|  |     pub locker_id: Option<String>, | ||||||
|  |     pub metadata: Option<pii::SecretSerdeValue>, | ||||||
|  |     pub routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub primary_business_details: serde_json::Value, | ||||||
|  |     pub intent_fulfillment_time: Option<i64>, | ||||||
|  |     pub created_at: time::PrimitiveDateTime, | ||||||
|  |     pub modified_at: time::PrimitiveDateTime, | ||||||
|  |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|     pub is_recon_enabled: bool, |     pub is_recon_enabled: bool, | ||||||
|     pub default_profile: Option<String>, |     pub default_profile: Option<String>, | ||||||
|     pub recon_status: storage_enums::ReconStatus, |     pub recon_status: storage_enums::ReconStatus, | ||||||
| @ -98,21 +242,35 @@ pub struct MerchantAccount { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl MerchantAccount { | impl MerchantAccount { | ||||||
|     pub fn get_id(&self) -> &id_type::MerchantId { |     #[cfg(all( | ||||||
|  |         any(feature = "v1", feature = "v2"), | ||||||
|  |         not(feature = "merchant_account_v2") | ||||||
|  |     ))] | ||||||
|  |     /// Get the unique identifier of MerchantAccount | ||||||
|  |     pub fn get_id(&self) -> &common_utils::id_type::MerchantId { | ||||||
|         &self.merchant_id |         &self.merchant_id | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  |     pub fn get_id(&self) -> &common_utils::id_type::MerchantId { | ||||||
|  |         &self.id | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[cfg(all( | ||||||
|  |     any(feature = "v1", feature = "v2"), | ||||||
|  |     not(feature = "merchant_account_v2") | ||||||
|  | ))] | ||||||
| #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | ||||||
| #[diesel(table_name = merchant_account)] | #[diesel(table_name = merchant_account)] | ||||||
| pub struct MerchantAccountNew { | pub struct MerchantAccountNew { | ||||||
|     pub merchant_id: id_type::MerchantId, |     pub merchant_id: common_utils::id_type::MerchantId, | ||||||
|     pub merchant_name: Option<Encryption>, |     pub merchant_name: Option<Encryption>, | ||||||
|     pub merchant_details: Option<Encryption>, |     pub merchant_details: Option<Encryption>, | ||||||
|     pub return_url: Option<String>, |     pub return_url: Option<String>, | ||||||
|     pub webhook_details: Option<serde_json::Value>, |     pub webhook_details: Option<serde_json::Value>, | ||||||
|     pub sub_merchants_enabled: Option<bool>, |     pub sub_merchants_enabled: Option<bool>, | ||||||
|     pub parent_merchant_id: Option<id_type::MerchantId>, |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|     pub enable_payment_response_hash: Option<bool>, |     pub enable_payment_response_hash: Option<bool>, | ||||||
|     pub payment_response_hash_key: Option<String>, |     pub payment_response_hash_key: Option<String>, | ||||||
|     pub redirect_to_merchant_with_http_post: Option<bool>, |     pub redirect_to_merchant_with_http_post: Option<bool>, | ||||||
| @ -126,7 +284,7 @@ pub struct MerchantAccountNew { | |||||||
|     pub modified_at: time::PrimitiveDateTime, |     pub modified_at: time::PrimitiveDateTime, | ||||||
|     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 organization_id: id_type::OrganizationId, |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|     pub is_recon_enabled: bool, |     pub is_recon_enabled: bool, | ||||||
|     pub default_profile: Option<String>, |     pub default_profile: Option<String>, | ||||||
|     pub recon_status: storage_enums::ReconStatus, |     pub recon_status: storage_enums::ReconStatus, | ||||||
| @ -134,6 +292,38 @@ pub struct MerchantAccountNew { | |||||||
|     pub pm_collect_link_config: Option<serde_json::Value>, |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] | ||||||
|  | #[diesel(table_name = merchant_account)] | ||||||
|  | pub struct MerchantAccountNew { | ||||||
|  |     pub merchant_name: Option<Encryption>, | ||||||
|  |     pub merchant_details: Option<Encryption>, | ||||||
|  |     pub return_url: Option<String>, | ||||||
|  |     pub webhook_details: Option<serde_json::Value>, | ||||||
|  |     pub sub_merchants_enabled: Option<bool>, | ||||||
|  |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|  |     pub enable_payment_response_hash: Option<bool>, | ||||||
|  |     pub payment_response_hash_key: Option<String>, | ||||||
|  |     pub redirect_to_merchant_with_http_post: Option<bool>, | ||||||
|  |     pub publishable_key: Option<String>, | ||||||
|  |     pub locker_id: Option<String>, | ||||||
|  |     pub metadata: Option<pii::SecretSerdeValue>, | ||||||
|  |     pub routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub primary_business_details: serde_json::Value, | ||||||
|  |     pub intent_fulfillment_time: Option<i64>, | ||||||
|  |     pub created_at: time::PrimitiveDateTime, | ||||||
|  |     pub modified_at: time::PrimitiveDateTime, | ||||||
|  |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|  |     pub is_recon_enabled: bool, | ||||||
|  |     pub default_profile: Option<String>, | ||||||
|  |     pub recon_status: storage_enums::ReconStatus, | ||||||
|  |     pub payment_link_config: Option<serde_json::Value>, | ||||||
|  |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
|  |     pub id: common_utils::id_type::MerchantId, | ||||||
|  | } | ||||||
|  |  | ||||||
| #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] | ||||||
| #[diesel(table_name = merchant_account)] | #[diesel(table_name = merchant_account)] | ||||||
| pub struct MerchantAccountUpdateInternal { | pub struct MerchantAccountUpdateInternal { | ||||||
| @ -142,7 +332,7 @@ pub struct MerchantAccountUpdateInternal { | |||||||
|     pub return_url: Option<String>, |     pub return_url: Option<String>, | ||||||
|     pub webhook_details: Option<serde_json::Value>, |     pub webhook_details: Option<serde_json::Value>, | ||||||
|     pub sub_merchants_enabled: Option<bool>, |     pub sub_merchants_enabled: Option<bool>, | ||||||
|     pub parent_merchant_id: Option<id_type::MerchantId>, |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|     pub enable_payment_response_hash: Option<bool>, |     pub enable_payment_response_hash: Option<bool>, | ||||||
|     pub payment_response_hash_key: Option<String>, |     pub payment_response_hash_key: Option<String>, | ||||||
|     pub redirect_to_merchant_with_http_post: Option<bool>, |     pub redirect_to_merchant_with_http_post: Option<bool>, | ||||||
| @ -156,7 +346,7 @@ pub struct MerchantAccountUpdateInternal { | |||||||
|     pub intent_fulfillment_time: Option<i64>, |     pub intent_fulfillment_time: Option<i64>, | ||||||
|     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 organization_id: Option<id_type::OrganizationId>, |     pub organization_id: Option<common_utils::id_type::OrganizationId>, | ||||||
|     pub is_recon_enabled: bool, |     pub is_recon_enabled: bool, | ||||||
|     pub default_profile: Option<Option<String>>, |     pub default_profile: Option<Option<String>>, | ||||||
|     pub recon_status: Option<storage_enums::ReconStatus>, |     pub recon_status: Option<storage_enums::ReconStatus>, | ||||||
|  | |||||||
| @ -5,9 +5,9 @@ use super::generics; | |||||||
|     any(feature = "v1", feature = "v2"), |     any(feature = "v1", feature = "v2"), | ||||||
|     not(feature = "merchant_account_v2") |     not(feature = "merchant_account_v2") | ||||||
| ))] | ))] | ||||||
| use crate::schema::merchant_account::dsl; | use crate::schema::merchant_account::dsl::{self, merchant_id as dsl_identifier}; | ||||||
| #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
| use crate::schema_v2::merchant_account::dsl; | use crate::schema_v2::merchant_account::dsl::{self, id as dsl_identifier}; | ||||||
| use crate::{ | use crate::{ | ||||||
|     errors, |     errors, | ||||||
|     merchant_account::{MerchantAccount, MerchantAccountNew, MerchantAccountUpdateInternal}, |     merchant_account::{MerchantAccount, MerchantAccountNew, MerchantAccountUpdateInternal}, | ||||||
| @ -28,7 +28,7 @@ impl MerchantAccount { | |||||||
|     ) -> StorageResult<Self> { |     ) -> StorageResult<Self> { | ||||||
|         match generics::generic_update_by_id::<<Self as HasTable>::Table, _, _, _>( |         match generics::generic_update_by_id::<<Self as HasTable>::Table, _, _, _>( | ||||||
|             conn, |             conn, | ||||||
|             self.merchant_id.clone(), |             self.get_id().to_owned(), | ||||||
|             merchant_account, |             merchant_account, | ||||||
|         ) |         ) | ||||||
|         .await |         .await | ||||||
| @ -43,7 +43,7 @@ impl MerchantAccount { | |||||||
|  |  | ||||||
|     pub async fn update_with_specific_fields( |     pub async fn update_with_specific_fields( | ||||||
|         conn: &PgPooledConn, |         conn: &PgPooledConn, | ||||||
|         merchant_id: &common_utils::id_type::MerchantId, |         identifier: &common_utils::id_type::MerchantId, | ||||||
|         merchant_account: MerchantAccountUpdateInternal, |         merchant_account: MerchantAccountUpdateInternal, | ||||||
|     ) -> StorageResult<Self> { |     ) -> StorageResult<Self> { | ||||||
|         generics::generic_update_with_unique_predicate_get_result::< |         generics::generic_update_with_unique_predicate_get_result::< | ||||||
| @ -53,7 +53,7 @@ impl MerchantAccount { | |||||||
|             _, |             _, | ||||||
|         >( |         >( | ||||||
|             conn, |             conn, | ||||||
|             dsl::merchant_id.eq(merchant_id.to_owned()), |             dsl_identifier.eq(identifier.to_owned()), | ||||||
|             merchant_account, |             merchant_account, | ||||||
|         ) |         ) | ||||||
|         .await |         .await | ||||||
| @ -61,22 +61,22 @@ impl MerchantAccount { | |||||||
|  |  | ||||||
|     pub async fn delete_by_merchant_id( |     pub async fn delete_by_merchant_id( | ||||||
|         conn: &PgPooledConn, |         conn: &PgPooledConn, | ||||||
|         merchant_id: &common_utils::id_type::MerchantId, |         identifier: &common_utils::id_type::MerchantId, | ||||||
|     ) -> StorageResult<bool> { |     ) -> StorageResult<bool> { | ||||||
|         generics::generic_delete::<<Self as HasTable>::Table, _>( |         generics::generic_delete::<<Self as HasTable>::Table, _>( | ||||||
|             conn, |             conn, | ||||||
|             dsl::merchant_id.eq(merchant_id.to_owned()), |             dsl_identifier.eq(identifier.to_owned()), | ||||||
|         ) |         ) | ||||||
|         .await |         .await | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub async fn find_by_merchant_id( |     pub async fn find_by_merchant_id( | ||||||
|         conn: &PgPooledConn, |         conn: &PgPooledConn, | ||||||
|         merchant_id: &common_utils::id_type::MerchantId, |         identifier: &common_utils::id_type::MerchantId, | ||||||
|     ) -> StorageResult<Self> { |     ) -> StorageResult<Self> { | ||||||
|         generics::generic_find_one::<<Self as HasTable>::Table, _, _>( |         generics::generic_find_one::<<Self as HasTable>::Table, _, _>( | ||||||
|             conn, |             conn, | ||||||
|             dsl::merchant_id.eq(merchant_id.to_owned()), |             dsl_identifier.eq(identifier.to_owned()), | ||||||
|         ) |         ) | ||||||
|         .await |         .await | ||||||
|     } |     } | ||||||
| @ -120,13 +120,7 @@ impl MerchantAccount { | |||||||
|             _, |             _, | ||||||
|             <<Self as HasTable>::Table as Table>::PrimaryKey, |             <<Self as HasTable>::Table as Table>::PrimaryKey, | ||||||
|             _, |             _, | ||||||
|         >( |         >(conn, dsl_identifier.eq_any(merchant_ids), None, None, None) | ||||||
|             conn, |  | ||||||
|             dsl::merchant_id.eq_any(merchant_ids), |  | ||||||
|             None, |  | ||||||
|             None, |  | ||||||
|             None, |  | ||||||
|         ) |  | ||||||
|         .await |         .await | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -136,7 +130,7 @@ impl MerchantAccount { | |||||||
|     ) -> StorageResult<Vec<Self>> { |     ) -> StorageResult<Vec<Self>> { | ||||||
|         generics::generic_update_with_results::<<Self as HasTable>::Table, _, _, _>( |         generics::generic_update_with_results::<<Self as HasTable>::Table, _, _, _>( | ||||||
|             conn, |             conn, | ||||||
|             dsl::merchant_id.ne_all(vec![""]), |             dsl_identifier.ne_all(vec![""]), | ||||||
|             merchant_account, |             merchant_account, | ||||||
|         ) |         ) | ||||||
|         .await |         .await | ||||||
|  | |||||||
| @ -633,9 +633,7 @@ diesel::table! { | |||||||
|     use diesel::sql_types::*; |     use diesel::sql_types::*; | ||||||
|     use crate::enums::diesel_exports::*; |     use crate::enums::diesel_exports::*; | ||||||
|  |  | ||||||
|     merchant_account (merchant_id) { |     merchant_account (id) { | ||||||
|         #[max_length = 64] |  | ||||||
|         merchant_id -> Varchar, |  | ||||||
|         #[max_length = 255] |         #[max_length = 255] | ||||||
|         return_url -> Nullable<Varchar>, |         return_url -> Nullable<Varchar>, | ||||||
|         enable_payment_response_hash -> Bool, |         enable_payment_response_hash -> Bool, | ||||||
| @ -669,6 +667,8 @@ diesel::table! { | |||||||
|         recon_status -> ReconStatus, |         recon_status -> ReconStatus, | ||||||
|         payment_link_config -> Nullable<Jsonb>, |         payment_link_config -> Nullable<Jsonb>, | ||||||
|         pm_collect_link_config -> Nullable<Jsonb>, |         pm_collect_link_config -> Nullable<Jsonb>, | ||||||
|  |         #[max_length = 64] | ||||||
|  |         id -> Varchar, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -126,9 +126,10 @@ impl From<MerchantAccountSetter> for MerchantAccount { | |||||||
| } | } | ||||||
|  |  | ||||||
| #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
| #[derive(Clone, Debug, serde::Serialize)] | #[derive(Clone)] | ||||||
| pub struct MerchantAccount { | /// Set the private fields of merchant account | ||||||
|     merchant_id: common_utils::id_type::MerchantId, | pub struct MerchantAccountSetter { | ||||||
|  |     pub id: common_utils::id_type::MerchantId, | ||||||
|     pub return_url: Option<String>, |     pub return_url: Option<String>, | ||||||
|     pub enable_payment_response_hash: bool, |     pub enable_payment_response_hash: bool, | ||||||
|     pub payment_response_hash_key: Option<String>, |     pub payment_response_hash_key: Option<String>, | ||||||
| @ -137,7 +138,74 @@ pub struct MerchantAccount { | |||||||
|     pub merchant_details: OptionalEncryptableValue, |     pub merchant_details: OptionalEncryptableValue, | ||||||
|     pub webhook_details: Option<serde_json::Value>, |     pub webhook_details: Option<serde_json::Value>, | ||||||
|     pub sub_merchants_enabled: Option<bool>, |     pub sub_merchants_enabled: Option<bool>, | ||||||
|     pub parent_merchant_id: Option<String>, |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|  |     pub publishable_key: String, | ||||||
|  |     pub storage_scheme: MerchantStorageScheme, | ||||||
|  |     pub locker_id: Option<String>, | ||||||
|  |     pub metadata: Option<pii::SecretSerdeValue>, | ||||||
|  |     pub routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub primary_business_details: serde_json::Value, | ||||||
|  |     pub frm_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub created_at: time::PrimitiveDateTime, | ||||||
|  |     pub modified_at: time::PrimitiveDateTime, | ||||||
|  |     pub intent_fulfillment_time: Option<i64>, | ||||||
|  |     pub payout_routing_algorithm: Option<serde_json::Value>, | ||||||
|  |     pub organization_id: common_utils::id_type::OrganizationId, | ||||||
|  |     pub is_recon_enabled: bool, | ||||||
|  |     pub default_profile: Option<String>, | ||||||
|  |     pub recon_status: diesel_models::enums::ReconStatus, | ||||||
|  |     pub payment_link_config: Option<serde_json::Value>, | ||||||
|  |     pub pm_collect_link_config: Option<serde_json::Value>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | impl From<MerchantAccountSetter> for MerchantAccount { | ||||||
|  |     fn from(item: MerchantAccountSetter) -> Self { | ||||||
|  |         Self { | ||||||
|  |             id: item.id, | ||||||
|  |             return_url: item.return_url, | ||||||
|  |             enable_payment_response_hash: item.enable_payment_response_hash, | ||||||
|  |             payment_response_hash_key: item.payment_response_hash_key, | ||||||
|  |             redirect_to_merchant_with_http_post: item.redirect_to_merchant_with_http_post, | ||||||
|  |             merchant_name: item.merchant_name, | ||||||
|  |             merchant_details: item.merchant_details, | ||||||
|  |             webhook_details: item.webhook_details, | ||||||
|  |             sub_merchants_enabled: item.sub_merchants_enabled, | ||||||
|  |             parent_merchant_id: item.parent_merchant_id, | ||||||
|  |             publishable_key: item.publishable_key, | ||||||
|  |             storage_scheme: item.storage_scheme, | ||||||
|  |             locker_id: item.locker_id, | ||||||
|  |             metadata: item.metadata, | ||||||
|  |             routing_algorithm: item.routing_algorithm, | ||||||
|  |             primary_business_details: item.primary_business_details, | ||||||
|  |             frm_routing_algorithm: item.frm_routing_algorithm, | ||||||
|  |             created_at: item.created_at, | ||||||
|  |             modified_at: item.modified_at, | ||||||
|  |             intent_fulfillment_time: item.intent_fulfillment_time, | ||||||
|  |             payout_routing_algorithm: item.payout_routing_algorithm, | ||||||
|  |             organization_id: item.organization_id, | ||||||
|  |             is_recon_enabled: item.is_recon_enabled, | ||||||
|  |             default_profile: item.default_profile, | ||||||
|  |             recon_status: item.recon_status, | ||||||
|  |             payment_link_config: item.payment_link_config, | ||||||
|  |             pm_collect_link_config: item.pm_collect_link_config, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  | #[derive(Clone, Debug, serde::Serialize)] | ||||||
|  | pub struct MerchantAccount { | ||||||
|  |     id: common_utils::id_type::MerchantId, | ||||||
|  |     pub return_url: Option<String>, | ||||||
|  |     pub enable_payment_response_hash: bool, | ||||||
|  |     pub payment_response_hash_key: Option<String>, | ||||||
|  |     pub redirect_to_merchant_with_http_post: bool, | ||||||
|  |     pub merchant_name: OptionalEncryptableName, | ||||||
|  |     pub merchant_details: OptionalEncryptableValue, | ||||||
|  |     pub webhook_details: Option<serde_json::Value>, | ||||||
|  |     pub sub_merchants_enabled: Option<bool>, | ||||||
|  |     pub parent_merchant_id: Option<common_utils::id_type::MerchantId>, | ||||||
|     pub publishable_key: String, |     pub publishable_key: String, | ||||||
|     pub storage_scheme: MerchantStorageScheme, |     pub storage_scheme: MerchantStorageScheme, | ||||||
|     pub locker_id: Option<String>, |     pub locker_id: Option<String>, | ||||||
| @ -158,10 +226,20 @@ pub struct MerchantAccount { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl MerchantAccount { | impl MerchantAccount { | ||||||
|  |     #[cfg(all( | ||||||
|  |         any(feature = "v1", feature = "v2"), | ||||||
|  |         not(feature = "merchant_account_v2") | ||||||
|  |     ))] | ||||||
|     /// Get the unique identifier of MerchantAccount |     /// Get the unique identifier of MerchantAccount | ||||||
|     pub fn get_id(&self) -> &common_utils::id_type::MerchantId { |     pub fn get_id(&self) -> &common_utils::id_type::MerchantId { | ||||||
|         &self.merchant_id |         &self.merchant_id | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[cfg(all(feature = "v2", feature = "merchant_account_v2"))] | ||||||
|  |     /// Get the unique identifier of MerchantAccount | ||||||
|  |     pub fn get_id(&self) -> &common_utils::id_type::MerchantId { | ||||||
|  |         &self.id | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| #[allow(clippy::large_enum_variant)] | #[allow(clippy::large_enum_variant)] | ||||||
| @ -278,8 +356,10 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|     type DstType = diesel_models::merchant_account::MerchantAccount; |     type DstType = diesel_models::merchant_account::MerchantAccount; | ||||||
|     type NewDstType = diesel_models::merchant_account::MerchantAccountNew; |     type NewDstType = diesel_models::merchant_account::MerchantAccountNew; | ||||||
|     async fn convert(self) -> CustomResult<Self::DstType, ValidationError> { |     async fn convert(self) -> CustomResult<Self::DstType, ValidationError> { | ||||||
|         Ok(diesel_models::merchant_account::MerchantAccount { |         let id = self.get_id().to_owned(); | ||||||
|             merchant_id: self.merchant_id, |  | ||||||
|  |         let setter = diesel_models::merchant_account::MerchantAccountSetter { | ||||||
|  |             id, | ||||||
|             return_url: self.return_url, |             return_url: self.return_url, | ||||||
|             enable_payment_response_hash: self.enable_payment_response_hash, |             enable_payment_response_hash: self.enable_payment_response_hash, | ||||||
|             payment_response_hash_key: self.payment_response_hash_key, |             payment_response_hash_key: self.payment_response_hash_key, | ||||||
| @ -306,7 +386,9 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|             recon_status: self.recon_status, |             recon_status: self.recon_status, | ||||||
|             payment_link_config: self.payment_link_config, |             payment_link_config: self.payment_link_config, | ||||||
|             pm_collect_link_config: self.pm_collect_link_config, |             pm_collect_link_config: self.pm_collect_link_config, | ||||||
|         }) |         }; | ||||||
|  |  | ||||||
|  |         Ok(diesel_models::MerchantAccount::from(setter)) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async fn convert_back( |     async fn convert_back( | ||||||
| @ -318,6 +400,7 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|     where |     where | ||||||
|         Self: Sized, |         Self: Sized, | ||||||
|     { |     { | ||||||
|  |         let id = item.get_id().to_owned(); | ||||||
|         let publishable_key = |         let publishable_key = | ||||||
|             item.publishable_key |             item.publishable_key | ||||||
|                 .ok_or(ValidationError::MissingRequiredField { |                 .ok_or(ValidationError::MissingRequiredField { | ||||||
| @ -326,7 +409,7 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|  |  | ||||||
|         async { |         async { | ||||||
|             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { |             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { | ||||||
|                 merchant_id: item.merchant_id, |                 id, | ||||||
|                 return_url: item.return_url, |                 return_url: item.return_url, | ||||||
|                 enable_payment_response_hash: item.enable_payment_response_hash, |                 enable_payment_response_hash: item.enable_payment_response_hash, | ||||||
|                 payment_response_hash_key: item.payment_response_hash_key, |                 payment_response_hash_key: item.payment_response_hash_key, | ||||||
| @ -374,7 +457,7 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|     async fn construct_new(self) -> CustomResult<Self::NewDstType, ValidationError> { |     async fn construct_new(self) -> CustomResult<Self::NewDstType, ValidationError> { | ||||||
|         let now = date_time::now(); |         let now = date_time::now(); | ||||||
|         Ok(diesel_models::merchant_account::MerchantAccountNew { |         Ok(diesel_models::merchant_account::MerchantAccountNew { | ||||||
|             merchant_id: self.merchant_id, |             id: self.id, | ||||||
|             merchant_name: self.merchant_name.map(Encryption::from), |             merchant_name: self.merchant_name.map(Encryption::from), | ||||||
|             merchant_details: self.merchant_details.map(Encryption::from), |             merchant_details: self.merchant_details.map(Encryption::from), | ||||||
|             return_url: self.return_url, |             return_url: self.return_url, | ||||||
| @ -413,7 +496,7 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|     type DstType = diesel_models::merchant_account::MerchantAccount; |     type DstType = diesel_models::merchant_account::MerchantAccount; | ||||||
|     type NewDstType = diesel_models::merchant_account::MerchantAccountNew; |     type NewDstType = diesel_models::merchant_account::MerchantAccountNew; | ||||||
|     async fn convert(self) -> CustomResult<Self::DstType, ValidationError> { |     async fn convert(self) -> CustomResult<Self::DstType, ValidationError> { | ||||||
|         Ok(diesel_models::merchant_account::MerchantAccount { |         let setter = diesel_models::merchant_account::MerchantAccountSetter { | ||||||
|             merchant_id: self.merchant_id, |             merchant_id: self.merchant_id, | ||||||
|             return_url: self.return_url, |             return_url: self.return_url, | ||||||
|             enable_payment_response_hash: self.enable_payment_response_hash, |             enable_payment_response_hash: self.enable_payment_response_hash, | ||||||
| @ -441,7 +524,9 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|             recon_status: self.recon_status, |             recon_status: self.recon_status, | ||||||
|             payment_link_config: self.payment_link_config, |             payment_link_config: self.payment_link_config, | ||||||
|             pm_collect_link_config: self.pm_collect_link_config, |             pm_collect_link_config: self.pm_collect_link_config, | ||||||
|         }) |         }; | ||||||
|  |  | ||||||
|  |         Ok(diesel_models::MerchantAccount::from(setter)) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async fn convert_back( |     async fn convert_back( | ||||||
| @ -453,14 +538,16 @@ impl super::behaviour::Conversion for MerchantAccount { | |||||||
|     where |     where | ||||||
|         Self: Sized, |         Self: Sized, | ||||||
|     { |     { | ||||||
|  |         let merchant_id = item.get_id().to_owned(); | ||||||
|         let publishable_key = |         let publishable_key = | ||||||
|             item.publishable_key |             item.publishable_key | ||||||
|                 .ok_or(ValidationError::MissingRequiredField { |                 .ok_or(ValidationError::MissingRequiredField { | ||||||
|                     field_name: "publishable_key".to_string(), |                     field_name: "publishable_key".to_string(), | ||||||
|                 })?; |                 })?; | ||||||
|  |  | ||||||
|         async { |         async { | ||||||
|             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { |             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { | ||||||
|                 merchant_id: item.merchant_id, |                 merchant_id, | ||||||
|                 return_url: item.return_url, |                 return_url: item.return_url, | ||||||
|                 enable_payment_response_hash: item.enable_payment_response_hash, |                 enable_payment_response_hash: item.enable_payment_response_hash, | ||||||
|                 payment_response_hash_key: item.payment_response_hash_key, |                 payment_response_hash_key: item.payment_response_hash_key, | ||||||
|  | |||||||
| @ -554,7 +554,7 @@ impl behaviour::Conversion for PaymentIntent { | |||||||
|     { |     { | ||||||
|         async { |         async { | ||||||
|             let inner_decrypt = |             let inner_decrypt = | ||||||
|                 |inner| decrypt_optional(state, inner, key_manager_identifier, key.peek()); |                 |inner| decrypt_optional(state, inner, key_manager_identifier.clone(), key.peek()); | ||||||
|             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { |             Ok::<Self, error_stack::Report<common_utils::errors::CryptoError>>(Self { | ||||||
|                 payment_id: storage_model.payment_id, |                 payment_id: storage_model.payment_id, | ||||||
|                 merchant_id: storage_model.merchant_id, |                 merchant_id: storage_model.merchant_id, | ||||||
|  | |||||||
| @ -412,7 +412,10 @@ impl MerchantAccountCreateBridge for api::MerchantAccountCreate { | |||||||
| #[cfg(feature = "olap")] | #[cfg(feature = "olap")] | ||||||
| enum CreateOrValidateOrganization { | enum CreateOrValidateOrganization { | ||||||
|     /// Creates a new organization |     /// Creates a new organization | ||||||
|     #[cfg(any(feature = "v1", feature = "v2"))] |     #[cfg(all( | ||||||
|  |         any(feature = "v1", feature = "v2"), | ||||||
|  |         not(feature = "merchant_account_v2") | ||||||
|  |     ))] | ||||||
|     Create, |     Create, | ||||||
|     /// Validates if this organization exists in the records |     /// Validates if this organization exists in the records | ||||||
|     Validate { |     Validate { | ||||||
| @ -451,7 +454,10 @@ impl CreateOrValidateOrganization { | |||||||
|         db: &dyn StorageInterface, |         db: &dyn StorageInterface, | ||||||
|     ) -> RouterResult<diesel_models::organization::Organization> { |     ) -> RouterResult<diesel_models::organization::Organization> { | ||||||
|         match self { |         match self { | ||||||
|             #[cfg(any(feature = "v1", feature = "v2"))] |             #[cfg(all( | ||||||
|  |                 any(feature = "v1", feature = "v2"), | ||||||
|  |                 not(feature = "merchant_account_v2") | ||||||
|  |             ))] | ||||||
|             Self::Create => { |             Self::Create => { | ||||||
|                 let new_organization = api_models::organization::OrganizationNew::new(None); |                 let new_organization = api_models::organization::OrganizationNew::new(None); | ||||||
|                 let db_organization = ForeignFrom::foreign_from(new_organization); |                 let db_organization = ForeignFrom::foreign_from(new_organization); | ||||||
| @ -637,17 +643,14 @@ impl MerchantAccountCreateBridge for api::MerchantAccountCreate { | |||||||
|             .await?; |             .await?; | ||||||
|  |  | ||||||
|         let key = key_store.key.into_inner(); |         let key = key_store.key.into_inner(); | ||||||
|         let merchant_id = self |         let id = self.get_merchant_reference_id().to_owned(); | ||||||
|             .get_merchant_reference_id() |  | ||||||
|             .get_string_repr() |  | ||||||
|             .to_owned(); |  | ||||||
|         let key_manager_state = state.into(); |         let key_manager_state = state.into(); | ||||||
|         let identifier = km_types::Identifier::Merchant(merchant_id.clone()); |         let identifier = km_types::Identifier::Merchant(id.clone()); | ||||||
|  |  | ||||||
|         async { |         async { | ||||||
|             Ok::<_, error_stack::Report<common_utils::errors::CryptoError>>( |             Ok::<_, error_stack::Report<common_utils::errors::CryptoError>>( | ||||||
|                 domain::MerchantAccount { |                 domain::MerchantAccount::from(domain::MerchantAccountSetter { | ||||||
|                     merchant_id, |                     id, | ||||||
|                     merchant_name: Some( |                     merchant_name: Some( | ||||||
|                         domain_types::encrypt( |                         domain_types::encrypt( | ||||||
|                             &key_manager_state, |                             &key_manager_state, | ||||||
| @ -695,7 +698,7 @@ impl MerchantAccountCreateBridge for api::MerchantAccountCreate { | |||||||
|                     recon_status: diesel_models::enums::ReconStatus::NotRequested, |                     recon_status: diesel_models::enums::ReconStatus::NotRequested, | ||||||
|                     payment_link_config: None, |                     payment_link_config: None, | ||||||
|                     pm_collect_link_config: None, |                     pm_collect_link_config: None, | ||||||
|                 }, |                 }), | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|         .await |         .await | ||||||
|  | |||||||
| @ -206,7 +206,7 @@ impl CustomerCreateBridge for customers::CustomerRequest { | |||||||
|     ) -> errors::CustomResult<domain::Customer, errors::CustomersErrorResponse> { |     ) -> errors::CustomResult<domain::Customer, errors::CustomersErrorResponse> { | ||||||
|         let _default_customer_billing_address = self.get_default_customer_billing_address(); |         let _default_customer_billing_address = self.get_default_customer_billing_address(); | ||||||
|         let _default_customer_shipping_address = self.get_default_customer_shipping_address(); |         let _default_customer_shipping_address = self.get_default_customer_shipping_address(); | ||||||
|         let merchant_id = merchant_account.merchant_id.clone(); |         let merchant_id = merchant_account.get_id().clone(); | ||||||
|         let key = key_store.key.get_inner().peek(); |         let key = key_store.key.get_inner().peek(); | ||||||
|  |  | ||||||
|         let encrypted_data = types::batch_encrypt( |         let encrypted_data = types::batch_encrypt( | ||||||
| @ -230,14 +230,13 @@ impl CustomerCreateBridge for customers::CustomerRequest { | |||||||
|             customer_id: merchant_reference_id |             customer_id: merchant_reference_id | ||||||
|                 .to_owned() |                 .to_owned() | ||||||
|                 .ok_or(errors::CustomersErrorResponse::InternalServerError)?, // doing this to make it compile, will remove once we start moving to domain models |                 .ok_or(errors::CustomersErrorResponse::InternalServerError)?, // doing this to make it compile, will remove once we start moving to domain models | ||||||
|             merchant_id: merchant_id.to_string(), |             merchant_id, | ||||||
|             name: encryptable_customer.name, |             name: encryptable_customer.name, | ||||||
|             email: encryptable_customer.email, |             email: encryptable_customer.email, | ||||||
|             phone: encryptable_customer.phone, |             phone: encryptable_customer.phone, | ||||||
|             description: self.description.clone(), |             description: self.description.clone(), | ||||||
|             phone_country_code: self.phone_country_code.clone(), |             phone_country_code: self.phone_country_code.clone(), | ||||||
|             metadata: self.metadata.clone(), |             metadata: self.metadata.clone(), | ||||||
|             id: None, |  | ||||||
|             connector_customer: None, |             connector_customer: None, | ||||||
|             address_id: None, |             address_id: None, | ||||||
|             created_at: common_utils::date_time::now(), |             created_at: common_utils::date_time::now(), | ||||||
|  | |||||||
| @ -483,7 +483,7 @@ impl MerchantAccountInterface for MockDb { | |||||||
|         let accounts = self.merchant_accounts.lock().await; |         let accounts = self.merchant_accounts.lock().await; | ||||||
|         let account: Option<domain::MerchantAccount> = accounts |         let account: Option<domain::MerchantAccount> = accounts | ||||||
|             .iter() |             .iter() | ||||||
|             .find(|account| account.merchant_id == *merchant_id) |             .find(|account| account.get_id() == merchant_id) | ||||||
|             .cloned() |             .cloned() | ||||||
|             .async_map(|a| async { |             .async_map(|a| async { | ||||||
|                 a.convert( |                 a.convert( | ||||||
| @ -608,7 +608,7 @@ async fn publish_and_redact_all_merchant_account_cache( | |||||||
| ) -> CustomResult<(), errors::StorageError> { | ) -> CustomResult<(), errors::StorageError> { | ||||||
|     let merchant_ids = merchant_accounts |     let merchant_ids = merchant_accounts | ||||||
|         .iter() |         .iter() | ||||||
|         .map(|m| m.merchant_id.get_string_repr().to_string()); |         .map(|merchant_account| merchant_account.get_id().get_string_repr().to_string()); | ||||||
|     let publishable_keys = merchant_accounts |     let publishable_keys = merchant_accounts | ||||||
|         .iter() |         .iter() | ||||||
|         .filter_map(|m| m.publishable_key.clone()); |         .filter_map(|m| m.publishable_key.clone()); | ||||||
|  | |||||||
| @ -20,8 +20,12 @@ use tokio::sync::oneshot; | |||||||
| use self::settings::Tenant; | use self::settings::Tenant; | ||||||
| #[cfg(feature = "olap")] | #[cfg(feature = "olap")] | ||||||
| use super::blocklist; | use super::blocklist; | ||||||
|  | #[cfg(any(feature = "olap", feature = "oltp"))] | ||||||
|  | use super::currency; | ||||||
| #[cfg(feature = "dummy_connector")] | #[cfg(feature = "dummy_connector")] | ||||||
| use super::dummy_connector::*; | use super::dummy_connector::*; | ||||||
|  | #[cfg(all(any(feature = "olap", feature = "oltp"), not(feature = "customer_v2")))] | ||||||
|  | use super::payment_methods::*; | ||||||
| #[cfg(feature = "payouts")] | #[cfg(feature = "payouts")] | ||||||
| use super::payout_link::*; | use super::payout_link::*; | ||||||
| #[cfg(feature = "payouts")] | #[cfg(feature = "payouts")] | ||||||
| @ -46,8 +50,6 @@ use super::{ | |||||||
| use super::{cache::*, health::*}; | use super::{cache::*, health::*}; | ||||||
| #[cfg(any(feature = "olap", feature = "oltp"))] | #[cfg(any(feature = "olap", feature = "oltp"))] | ||||||
| use super::{configs::*, customers::*, mandates::*, payments::*, refunds::*}; | use super::{configs::*, customers::*, mandates::*, payments::*, refunds::*}; | ||||||
| #[cfg(any(feature = "olap", feature = "oltp"))] |  | ||||||
| use super::{currency, payment_methods::*}; |  | ||||||
| #[cfg(feature = "oltp")] | #[cfg(feature = "oltp")] | ||||||
| use super::{ephemeral_key::*, webhooks::*}; | use super::{ephemeral_key::*, webhooks::*}; | ||||||
| #[cfg(feature = "olap")] | #[cfg(feature = "olap")] | ||||||
| @ -58,8 +60,6 @@ use crate::analytics::AnalyticsProvider; | |||||||
| use crate::routes::fraud_check as frm_routes; | use crate::routes::fraud_check as frm_routes; | ||||||
| #[cfg(all(feature = "recon", feature = "olap"))] | #[cfg(all(feature = "recon", feature = "olap"))] | ||||||
| use crate::routes::recon as recon_routes; | use crate::routes::recon as recon_routes; | ||||||
| #[cfg(all(feature = "olap", not(feature = "v2")))] |  | ||||||
| use crate::routes::verify_connector::payment_connector_verify; |  | ||||||
| pub use crate::{ | pub use crate::{ | ||||||
|     configs::settings, |     configs::settings, | ||||||
|     core::routing, |     core::routing, | ||||||
| @ -1116,7 +1116,7 @@ impl MerchantConnectorAccount { | |||||||
|             route = route |             route = route | ||||||
|                 .service( |                 .service( | ||||||
|                     web::resource("/connectors/verify") |                     web::resource("/connectors/verify") | ||||||
|                         .route(web::post().to(payment_connector_verify)), |                         .route(web::post().to(super::verify_connector::payment_connector_verify)), | ||||||
|                 ) |                 ) | ||||||
|                 .service( |                 .service( | ||||||
|                     web::resource("/{merchant_id}/connectors") |                     web::resource("/{merchant_id}/connectors") | ||||||
|  | |||||||
| @ -91,13 +91,15 @@ impl ForeignTryFrom<domain::MerchantAccount> for MerchantAccountResponse { | |||||||
|     fn foreign_try_from(item: domain::MerchantAccount) -> Result<Self, Self::Error> { |     fn foreign_try_from(item: domain::MerchantAccount) -> Result<Self, Self::Error> { | ||||||
|         use common_utils::ext_traits::OptionExt; |         use common_utils::ext_traits::OptionExt; | ||||||
|  |  | ||||||
|  |         let id = item.get_id().to_owned(); | ||||||
|  |  | ||||||
|         let merchant_name = item |         let merchant_name = item | ||||||
|             .merchant_name |             .merchant_name | ||||||
|             .get_required_value("merchant_name")? |             .get_required_value("merchant_name")? | ||||||
|             .into_inner(); |             .into_inner(); | ||||||
|  |  | ||||||
|         Ok(Self { |         Ok(Self { | ||||||
|             id: item.merchant_id, |             id, | ||||||
|             merchant_name, |             merchant_name, | ||||||
|             merchant_details: item.merchant_details, |             merchant_details: item.merchant_details, | ||||||
|             publishable_key: item.publishable_key, |             publishable_key: item.publishable_key, | ||||||
|  | |||||||
| @ -22,17 +22,14 @@ use api_models::{ | |||||||
| }; | }; | ||||||
| use base64::Engine; | use base64::Engine; | ||||||
| use common_utils::types::keymanager::KeyManagerState; | use common_utils::types::keymanager::KeyManagerState; | ||||||
|  | #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] | ||||||
|  | use common_utils::types::keymanager::{Identifier, ToEncryptable}; | ||||||
| pub use common_utils::{ | pub use common_utils::{ | ||||||
|     crypto, |     crypto, | ||||||
|     ext_traits::{ByteSliceExt, BytesExt, Encode, StringExt, ValueExt}, |     ext_traits::{ByteSliceExt, BytesExt, Encode, StringExt, ValueExt}, | ||||||
|     fp_utils::when, |     fp_utils::when, | ||||||
|     validation::validate_email, |     validation::validate_email, | ||||||
| }; | }; | ||||||
| #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] |  | ||||||
| use common_utils::{ |  | ||||||
|     id_type, |  | ||||||
|     types::keymanager::{Identifier, ToEncryptable}, |  | ||||||
| }; |  | ||||||
| use error_stack::ResultExt; | use error_stack::ResultExt; | ||||||
| use hyperswitch_domain_models::payments::PaymentIntent; | use hyperswitch_domain_models::payments::PaymentIntent; | ||||||
| #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] | #[cfg(all(any(feature = "v1", feature = "v2"), not(feature = "customer_v2")))] | ||||||
| @ -677,15 +674,15 @@ pub trait CustomerAddress { | |||||||
|         address_details: payments::AddressDetails, |         address_details: payments::AddressDetails, | ||||||
|         key: &[u8], |         key: &[u8], | ||||||
|         storage_scheme: storage::enums::MerchantStorageScheme, |         storage_scheme: storage::enums::MerchantStorageScheme, | ||||||
|         merchant_id: id_type::MerchantId, |         merchant_id: common_utils::id_type::MerchantId, | ||||||
|     ) -> CustomResult<storage::AddressUpdate, common_utils::errors::CryptoError>; |     ) -> CustomResult<storage::AddressUpdate, common_utils::errors::CryptoError>; | ||||||
|  |  | ||||||
|     async fn get_domain_address( |     async fn get_domain_address( | ||||||
|         &self, |         &self, | ||||||
|         state: &SessionState, |         state: &SessionState, | ||||||
|         address_details: payments::AddressDetails, |         address_details: payments::AddressDetails, | ||||||
|         merchant_id: &id_type::MerchantId, |         merchant_id: &common_utils::id_type::MerchantId, | ||||||
|         customer_id: &id_type::CustomerId, |         customer_id: &common_utils::id_type::CustomerId, | ||||||
|         key: &[u8], |         key: &[u8], | ||||||
|         storage_scheme: storage::enums::MerchantStorageScheme, |         storage_scheme: storage::enums::MerchantStorageScheme, | ||||||
|     ) -> CustomResult<domain::CustomerAddress, common_utils::errors::CryptoError>; |     ) -> CustomResult<domain::CustomerAddress, common_utils::errors::CryptoError>; | ||||||
| @ -700,7 +697,7 @@ impl CustomerAddress for api_models::customers::CustomerRequest { | |||||||
|         address_details: payments::AddressDetails, |         address_details: payments::AddressDetails, | ||||||
|         key: &[u8], |         key: &[u8], | ||||||
|         storage_scheme: storage::enums::MerchantStorageScheme, |         storage_scheme: storage::enums::MerchantStorageScheme, | ||||||
|         merchant_id: id_type::MerchantId, |         merchant_id: common_utils::id_type::MerchantId, | ||||||
|     ) -> CustomResult<storage::AddressUpdate, common_utils::errors::CryptoError> { |     ) -> CustomResult<storage::AddressUpdate, common_utils::errors::CryptoError> { | ||||||
|         let encrypted_data = batch_encrypt( |         let encrypted_data = batch_encrypt( | ||||||
|             &state.into(), |             &state.into(), | ||||||
| @ -736,8 +733,8 @@ impl CustomerAddress for api_models::customers::CustomerRequest { | |||||||
|         &self, |         &self, | ||||||
|         state: &SessionState, |         state: &SessionState, | ||||||
|         address_details: payments::AddressDetails, |         address_details: payments::AddressDetails, | ||||||
|         merchant_id: &id_type::MerchantId, |         merchant_id: &common_utils::id_type::MerchantId, | ||||||
|         customer_id: &id_type::CustomerId, |         customer_id: &common_utils::id_type::CustomerId, | ||||||
|         key: &[u8], |         key: &[u8], | ||||||
|         storage_scheme: storage::enums::MerchantStorageScheme, |         storage_scheme: storage::enums::MerchantStorageScheme, | ||||||
|     ) -> CustomResult<domain::CustomerAddress, common_utils::errors::CryptoError> { |     ) -> CustomResult<domain::CustomerAddress, common_utils::errors::CryptoError> { | ||||||
| @ -784,7 +781,7 @@ impl CustomerAddress for api_models::customers::CustomerRequest { | |||||||
| pub fn add_apple_pay_flow_metrics( | pub fn add_apple_pay_flow_metrics( | ||||||
|     apple_pay_flow: &Option<domain::ApplePayFlow>, |     apple_pay_flow: &Option<domain::ApplePayFlow>, | ||||||
|     connector: Option<String>, |     connector: Option<String>, | ||||||
|     merchant_id: id_type::MerchantId, |     merchant_id: common_utils::id_type::MerchantId, | ||||||
| ) { | ) { | ||||||
|     if let Some(flow) = apple_pay_flow { |     if let Some(flow) = apple_pay_flow { | ||||||
|         match flow { |         match flow { | ||||||
| @ -818,7 +815,7 @@ pub fn add_apple_pay_payment_status_metrics( | |||||||
|     payment_attempt_status: enums::AttemptStatus, |     payment_attempt_status: enums::AttemptStatus, | ||||||
|     apple_pay_flow: Option<domain::ApplePayFlow>, |     apple_pay_flow: Option<domain::ApplePayFlow>, | ||||||
|     connector: Option<String>, |     connector: Option<String>, | ||||||
|     merchant_id: id_type::MerchantId, |     merchant_id: common_utils::id_type::MerchantId, | ||||||
| ) { | ) { | ||||||
|     if payment_attempt_status == enums::AttemptStatus::Charged { |     if payment_attempt_status == enums::AttemptStatus::Charged { | ||||||
|         if let Some(flow) = apple_pay_flow { |         if let Some(flow) = apple_pay_flow { | ||||||
|  | |||||||
| @ -0,0 +1,2 @@ | |||||||
|  | -- This file should undo anything in `up.sql` | ||||||
|  | ALTER TABLE merchant_account DROP id; | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | -- Your SQL goes here | ||||||
|  | -- Adding a new column called `id` which will be the new primary key for v2 | ||||||
|  | -- Note that even though this will be the new primary key, the v1 application would still fill in null values | ||||||
|  | ALTER TABLE merchant_account | ||||||
|  | ADD COLUMN id VARCHAR(64); | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | -- This file should undo anything in `up.sql` | ||||||
|  | -- The new primary key for v2 merchant account will be `id` | ||||||
|  | ALTER TABLE merchant_account DROP CONSTRAINT merchant_account_pkey; | ||||||
|  |  | ||||||
|  | -- In order to run this query, the merchant_id column should be unique and not null | ||||||
|  | -- We need to backfill the id, a simple strategy will be to copy the values of id to merchant_id | ||||||
|  | -- Query to update the merchant_id column with values of id | ||||||
|  | UPDATE merchant_account | ||||||
|  | SET merchant_id = id; | ||||||
|  |  | ||||||
|  | -- Note: This command might not run successfully for the existing table | ||||||
|  | -- This is because there will be some rows ( which are created via v2 application ) which will have id as empty | ||||||
|  | -- A backfill might be required to run this query | ||||||
|  | -- However if this is being run on a fresh database, this should succeed | ||||||
|  | ALTER TABLE merchant_account | ||||||
|  | ADD PRIMARY KEY (merchant_id); | ||||||
| @ -0,0 +1,17 @@ | |||||||
|  | -- Your SQL goes here | ||||||
|  | -- The new primary key for v2 merchant account will be `id` | ||||||
|  | ALTER TABLE merchant_account DROP CONSTRAINT merchant_account_pkey; | ||||||
|  |  | ||||||
|  | -- In order to make id as primary key, it should be unique and not null | ||||||
|  | -- We need to backfill the id, a simple strategy will be to copy the values of merchant_id to id | ||||||
|  | -- Query to update the id column with values of merchant_id | ||||||
|  | -- Note: This query will lock the table, so it should be run when there is no traffic | ||||||
|  | UPDATE merchant_account | ||||||
|  | SET id = merchant_id; | ||||||
|  |  | ||||||
|  | -- Note: This command might not run successfully for the existing table | ||||||
|  | -- This is because there will be some rows ( which are created via v1 application ) which will have id as empty | ||||||
|  | -- A backfill might be required to run this query | ||||||
|  | -- However if this is being run on a fresh database, this should succeed | ||||||
|  | ALTER TABLE merchant_account | ||||||
|  | ADD PRIMARY KEY (id); | ||||||
| @ -0,0 +1,3 @@ | |||||||
|  | -- This file should undo anything in `up.sql` | ||||||
|  | ALTER TABLE merchant_account | ||||||
|  | ADD COLUMN merchant_id VARCHAR(64); | ||||||
| @ -0,0 +1,4 @@ | |||||||
|  | -- Your SQL goes here | ||||||
|  | -- Note: This query should not be run on higher environments as this leads to data loss | ||||||
|  | -- The application will work fine even without these queries not being run | ||||||
|  | ALTER TABLE merchant_account DROP merchant_id; | ||||||
		Reference in New Issue
	
	Block a user
	 Narayan Bhat
					Narayan Bhat