diff --git a/crates/hyperswitch_connectors/src/connectors/chargebee.rs b/crates/hyperswitch_connectors/src/connectors/chargebee.rs index 632064a893..b9006f9e82 100644 --- a/crates/hyperswitch_connectors/src/connectors/chargebee.rs +++ b/crates/hyperswitch_connectors/src/connectors/chargebee.rs @@ -21,28 +21,32 @@ use hyperswitch_domain_models::{ payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, refunds::{Execute, RSync}, revenue_recovery::InvoiceRecordBack, - subscriptions::GetSubscriptionPlans, + subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, CreateConnectorCustomer, }, router_request_types::{ - revenue_recovery::InvoiceRecordBackRequest, subscriptions::GetSubscriptionPlansRequest, + revenue_recovery::InvoiceRecordBackRequest, + subscriptions::{GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest}, AccessTokenRequestData, ConnectorCustomerData, PaymentMethodTokenizationData, PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, RefundsData, SetupMandateRequestData, }, router_response_types::{ - revenue_recovery::InvoiceRecordBackResponse, subscriptions::GetSubscriptionPlansResponse, + revenue_recovery::InvoiceRecordBackResponse, + subscriptions::{GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse}, ConnectorInfo, PaymentsResponseData, RefundsResponseData, }, types::{ - ConnectorCustomerRouterData, GetSubscriptionPlansRouterData, InvoiceRecordBackRouterData, - PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData, - RefundSyncRouterData, RefundsRouterData, + ConnectorCustomerRouterData, GetSubscriptionPlanPricesRouterData, + GetSubscriptionPlansRouterData, InvoiceRecordBackRouterData, PaymentsAuthorizeRouterData, + PaymentsCaptureRouterData, PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData, }, }; use hyperswitch_interfaces::{ api::{ - self, payments::ConnectorCustomer, subscriptions_v2::GetSubscriptionPlansV2, + self, + payments::ConnectorCustomer, + subscriptions_v2::{GetSubscriptionPlanPricesV2, GetSubscriptionPlansV2}, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, }, @@ -57,7 +61,9 @@ use masking::{Mask, PeekInterface, Secret}; use transformers as chargebee; use crate::{ - connectors::chargebee::transformers::ChargebeeListPlansResponse, + connectors::chargebee::transformers::{ + ChargebeeGetPlanPricesResponse, ChargebeeListPlansResponse, + }, constants::{self, headers}, types::ResponseRouterData, utils, @@ -902,6 +908,123 @@ impl ConnectorIntegration CustomResult { + let item_id = req.request.plan_price_id.to_string(); + let params = format!("?item_id[is]={item_id}"); + Ok(params) +} + +impl + ConnectorIntegration< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, + > for Chargebee +{ + fn get_headers( + &self, + req: &GetSubscriptionPlanPricesRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { + self.build_headers(req, connectors) + } + + fn get_url( + &self, + req: &GetSubscriptionPlanPricesRouterData, + connectors: &Connectors, + ) -> CustomResult { + let query_params = get_chargebee_plan_prices_query_params(req)?; + + let metadata: chargebee::ChargebeeMetadata = + utils::to_connector_meta_from_secret(req.connector_meta_data.clone())?; + + let site = metadata.site.peek(); + + let mut base = self.base_url(connectors).to_string(); + + base = base.replace("{{merchant_endpoint_prefix}}", site); + base = base.replace("$", site); + + if base.contains("{{merchant_endpoint_prefix}}") || base.contains('$') { + return Err(errors::ConnectorError::InvalidConnectorConfig { + config: "Chargebee base_url has an unresolved placeholder (expected `$` or `{{merchant_endpoint_prefix}}`).", + } + .into()); + } + + if !base.ends_with('/') { + base.push('/'); + } + + let url = format!("{base}v2/item_prices{query_params}"); + Ok(url) + } + // check if get_content_type is required + fn build_request( + &self, + req: &GetSubscriptionPlanPricesRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + Ok(Some( + RequestBuilder::new() + .method(Method::Get) + .url(&types::GetSubscriptionPlanPricesType::get_url( + self, req, connectors, + )?) + .attach_default_headers() + .headers(types::GetSubscriptionPlanPricesType::get_headers( + self, req, connectors, + )?) + .build(), + )) + } + + fn handle_response( + &self, + data: &GetSubscriptionPlanPricesRouterData, + event_builder: Option<&mut ConnectorEvent>, + res: Response, + ) -> CustomResult { + let response: ChargebeeGetPlanPricesResponse = res + .response + .parse_struct("chargebee ChargebeeGetPlanPricesResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + event_builder.map(|i| i.set_response_body(&response)); + router_env::logger::info!(connector_response=?response); + RouterData::try_from(ResponseRouterData { + response, + data: data.clone(), + http_code: res.status_code, + }) + } + + fn get_error_response( + &self, + res: Response, + event_builder: Option<&mut ConnectorEvent>, + ) -> CustomResult { + self.build_error_response(res, event_builder) + } +} + +impl GetSubscriptionPlanPricesV2 for Chargebee {} + +impl + ConnectorIntegrationV2< + GetSubscriptionPlanPrices, + hyperswitch_domain_models::router_data_v2::flow_common_types::GetSubscriptionPlanPricesData, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, + > for Chargebee +{ + // TODO: implement functions when support enabled +} + #[async_trait::async_trait] impl webhooks::IncomingWebhook for Chargebee { fn get_webhook_source_verification_signature( diff --git a/crates/hyperswitch_connectors/src/connectors/chargebee/transformers.rs b/crates/hyperswitch_connectors/src/connectors/chargebee/transformers.rs index f5b950a1b0..7d76b86991 100644 --- a/crates/hyperswitch_connectors/src/connectors/chargebee/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/chargebee/transformers.rs @@ -23,7 +23,8 @@ use hyperswitch_domain_models::{ revenue_recovery::InvoiceRecordBackRequest, ConnectorCustomerData, ResponseId, }, router_response_types::{ - revenue_recovery::InvoiceRecordBackResponse, subscriptions::GetSubscriptionPlansResponse, + revenue_recovery::InvoiceRecordBackResponse, + subscriptions::{self, GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse}, ConnectorCustomerResponseData, PaymentsResponseData, RefundsResponseData, }, types::{InvoiceRecordBackRouterData, PaymentsAuthorizeRouterData, RefundsRouterData}, @@ -815,12 +816,10 @@ impl .response .list .into_iter() - .map(|plan| { - hyperswitch_domain_models::router_response_types::subscriptions::SubscriptionPlans { - subscription_provider_plan_id: plan.item.id, - name: plan.item.name, - description: plan.item.description, - } + .map(|plan| subscriptions::SubscriptionPlans { + subscription_provider_plan_id: plan.item.id, + name: plan.item.name, + description: plan.item.description, }) .collect(); Ok(Self { @@ -920,3 +919,98 @@ impl }) } } + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ChargebeeGetPlanPricesResponse { + pub list: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ChargebeeGetPlanPriceList { + pub item_price: ChargebeePlanPriceItem, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ChargebeePlanPriceItem { + pub id: String, + pub name: String, + pub currency_code: common_enums::Currency, + pub free_quantity: i64, + #[serde(default, with = "common_utils::custom_serde::timestamp::option")] + pub created_at: Option, + pub deleted: bool, + pub item_id: Option, + pub period: i64, + pub period_unit: ChargebeePeriodUnit, + pub trial_period: Option, + pub trial_period_unit: ChargebeeTrialPeriodUnit, + pub price: MinorUnit, + pub pricing_model: ChargebeePricingModel, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ChargebeePricingModel { + FlatFee, + PerUnit, + Tiered, + Volume, + Stairstep, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ChargebeePeriodUnit { + Day, + Week, + Month, + Year, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ChargebeeTrialPeriodUnit { + Day, + Month, +} + +impl + TryFrom< + ResponseRouterData, + > for RouterData +{ + type Error = error_stack::Report; + fn try_from( + item: ResponseRouterData< + F, + ChargebeeGetPlanPricesResponse, + T, + GetSubscriptionPlanPricesResponse, + >, + ) -> Result { + let plan_prices = item + .response + .list + .into_iter() + .map(|prices| subscriptions::SubscriptionPlanPrices { + price_id: prices.item_price.id, + plan_id: prices.item_price.item_id, + amount: prices.item_price.price, + currency: prices.item_price.currency_code, + interval: match prices.item_price.period_unit { + ChargebeePeriodUnit::Day => subscriptions::PeriodUnit::Day, + ChargebeePeriodUnit::Week => subscriptions::PeriodUnit::Week, + ChargebeePeriodUnit::Month => subscriptions::PeriodUnit::Month, + ChargebeePeriodUnit::Year => subscriptions::PeriodUnit::Year, + }, + interval_count: prices.item_price.period, + trial_period: prices.item_price.trial_period, + trial_period_unit: match prices.item_price.trial_period_unit { + ChargebeeTrialPeriodUnit::Day => Some(subscriptions::PeriodUnit::Day), + ChargebeeTrialPeriodUnit::Month => Some(subscriptions::PeriodUnit::Month), + }, + }) + .collect(); + Ok(Self { + response: Ok(GetSubscriptionPlanPricesResponse { list: plan_prices }), + ..item.data + }) + } +} diff --git a/crates/hyperswitch_connectors/src/connectors/recurly.rs b/crates/hyperswitch_connectors/src/connectors/recurly.rs index 769d987909..abadb7cb19 100644 --- a/crates/hyperswitch_connectors/src/connectors/recurly.rs +++ b/crates/hyperswitch_connectors/src/connectors/recurly.rs @@ -9,22 +9,27 @@ use error_stack::report; use error_stack::ResultExt; use hyperswitch_domain_models::{ router_data::{ConnectorAuthType, ErrorResponse}, - router_data_v2::{flow_common_types::GetSubscriptionPlansData, UasFlowData}, + router_data_v2::{ + flow_common_types::{GetSubscriptionPlanPricesData, GetSubscriptionPlansData}, + UasFlowData, + }, router_flow_types::{ - subscriptions::GetSubscriptionPlans, + subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, unified_authentication_service::{ Authenticate, AuthenticationConfirmation, PostAuthenticate, PreAuthenticate, }, }, router_request_types::{ - subscriptions::GetSubscriptionPlansRequest, + subscriptions::{GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest}, unified_authentication_service::{ UasAuthenticationRequestData, UasAuthenticationResponseData, UasConfirmationRequestData, UasPostAuthenticationRequestData, UasPreAuthenticationRequestData, }, }, - router_response_types::subscriptions::GetSubscriptionPlansResponse, + router_response_types::subscriptions::{ + GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse, + }, }; #[cfg(all(feature = "v2", feature = "revenue_recovery"))] use hyperswitch_domain_models::{ @@ -151,6 +156,18 @@ impl > for Recurly { } + +impl api::subscriptions_v2::GetSubscriptionPlanPricesV2 for Recurly {} + +impl + ConnectorIntegrationV2< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesData, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, + > for Recurly +{ +} #[cfg(all(feature = "v2", feature = "revenue_recovery"))] impl api::revenue_recovery_v2::RevenueRecoveryRecordBackV2 for Recurly {} #[cfg(all(feature = "v2", feature = "revenue_recovery"))] diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index 85cb37aef2..96fbfb6b31 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -39,7 +39,7 @@ use hyperswitch_domain_models::{ PostCaptureVoid, PostProcessing, PostSessionTokens, PreProcessing, Reject, SdkSessionUpdate, UpdateMetadata, }, - subscriptions::GetSubscriptionPlans, + subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, webhooks::VerifyWebhookSource, AccessTokenAuthentication, Authenticate, AuthenticationConfirmation, ExternalVaultCreateFlow, ExternalVaultDeleteFlow, ExternalVaultInsertFlow, @@ -47,7 +47,7 @@ use hyperswitch_domain_models::{ }, router_request_types::{ authentication, - subscriptions::GetSubscriptionPlansRequest, + subscriptions::{GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest}, unified_authentication_service::{ UasAuthenticationRequestData, UasAuthenticationResponseData, UasConfirmationRequestData, UasPostAuthenticationRequestData, @@ -66,11 +66,11 @@ use hyperswitch_domain_models::{ VerifyWebhookSourceRequestData, }, router_response_types::{ - subscriptions::GetSubscriptionPlansResponse, AcceptDisputeResponse, - AuthenticationResponseData, DefendDisputeResponse, DisputeSyncResponse, - FetchDisputesResponse, GiftCardBalanceCheckResponseData, MandateRevokeResponseData, - PaymentsResponseData, RetrieveFileResponse, SubmitEvidenceResponse, - TaxCalculationResponseData, UploadFileResponse, VaultResponseData, + subscriptions::{GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse}, + AcceptDisputeResponse, AuthenticationResponseData, DefendDisputeResponse, + DisputeSyncResponse, FetchDisputesResponse, GiftCardBalanceCheckResponseData, + MandateRevokeResponseData, PaymentsResponseData, RetrieveFileResponse, + SubmitEvidenceResponse, TaxCalculationResponseData, UploadFileResponse, VaultResponseData, VerifyWebhookSourceResponseData, }, }; @@ -130,7 +130,7 @@ use hyperswitch_interfaces::{ PaymentsPreAuthenticate, PaymentsPreProcessing, TaxCalculation, }, revenue_recovery::RevenueRecovery, - subscriptions::{GetSubscriptionPlansFlow, Subscriptions}, + subscriptions::{GetSubscriptionPlanPricesFlow, GetSubscriptionPlansFlow, Subscriptions}, vault::{ ExternalVault, ExternalVaultCreate, ExternalVaultDelete, ExternalVaultInsert, ExternalVaultRetrieve, @@ -6948,6 +6948,14 @@ macro_rules! default_imp_for_subscriptions { GetSubscriptionPlansResponse > for $path::$connector {} + impl GetSubscriptionPlanPricesFlow for $path::$connector {} + impl + ConnectorIntegration< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse + > for $path::$connector + {} )* }; } @@ -9219,6 +9227,21 @@ impl { } +#[cfg(feature = "dummy_connector")] +impl Subscriptions for connectors::DummyConnector {} + +#[cfg(feature = "dummy_connector")] +impl GetSubscriptionPlanPricesFlow for connectors::DummyConnector {} +#[cfg(feature = "dummy_connector")] +impl + ConnectorIntegration< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, + > for connectors::DummyConnector +{ +} + #[cfg(feature = "dummy_connector")] impl GetSubscriptionPlansFlow for connectors::DummyConnector {} #[cfg(feature = "dummy_connector")] @@ -9230,6 +9253,3 @@ impl > for connectors::DummyConnector { } - -#[cfg(feature = "dummy_connector")] -impl Subscriptions for connectors::DummyConnector {} diff --git a/crates/hyperswitch_domain_models/src/router_data_v2/flow_common_types.rs b/crates/hyperswitch_domain_models/src/router_data_v2/flow_common_types.rs index 471d222764..759e2f9943 100644 --- a/crates/hyperswitch_domain_models/src/router_data_v2/flow_common_types.rs +++ b/crates/hyperswitch_domain_models/src/router_data_v2/flow_common_types.rs @@ -153,6 +153,9 @@ pub struct InvoiceRecordBackData; #[derive(Debug, Clone)] pub struct GetSubscriptionPlansData; +#[derive(Debug, Clone)] +pub struct GetSubscriptionPlanPricesData; + #[derive(Debug, Clone)] pub struct UasFlowData { pub authenticate_by: String, diff --git a/crates/hyperswitch_domain_models/src/router_flow_types.rs b/crates/hyperswitch_domain_models/src/router_flow_types.rs index f8b10105b4..dc5418ac8c 100644 --- a/crates/hyperswitch_domain_models/src/router_flow_types.rs +++ b/crates/hyperswitch_domain_models/src/router_flow_types.rs @@ -12,7 +12,6 @@ pub mod subscriptions; pub mod unified_authentication_service; pub mod vault; pub mod webhooks; - pub use access_token_auth::*; pub use dispute::*; pub use files::*; diff --git a/crates/hyperswitch_domain_models/src/router_flow_types/subscriptions.rs b/crates/hyperswitch_domain_models/src/router_flow_types/subscriptions.rs index a71b81e7d3..4f277c0767 100644 --- a/crates/hyperswitch_domain_models/src/router_flow_types/subscriptions.rs +++ b/crates/hyperswitch_domain_models/src/router_flow_types/subscriptions.rs @@ -1,2 +1,5 @@ #[derive(Debug, Clone)] pub struct GetSubscriptionPlans; + +#[derive(Debug, Clone)] +pub struct GetSubscriptionPlanPrices; diff --git a/crates/hyperswitch_domain_models/src/router_request_types/subscriptions.rs b/crates/hyperswitch_domain_models/src/router_request_types/subscriptions.rs index 19751de25f..bc9049d10f 100644 --- a/crates/hyperswitch_domain_models/src/router_request_types/subscriptions.rs +++ b/crates/hyperswitch_domain_models/src/router_request_types/subscriptions.rs @@ -3,3 +3,8 @@ pub struct GetSubscriptionPlansRequest { pub limit: Option, pub offset: Option, } + +#[derive(Debug, Clone)] +pub struct GetSubscriptionPlanPricesRequest { + pub plan_price_id: String, +} diff --git a/crates/hyperswitch_domain_models/src/router_response_types/subscriptions.rs b/crates/hyperswitch_domain_models/src/router_response_types/subscriptions.rs index fd6fd7965b..0b06a6aa26 100644 --- a/crates/hyperswitch_domain_models/src/router_response_types/subscriptions.rs +++ b/crates/hyperswitch_domain_models/src/router_response_types/subscriptions.rs @@ -1,3 +1,5 @@ +use common_enums::Currency; + #[derive(Debug, Clone)] pub struct GetSubscriptionPlansResponse { pub list: Vec, @@ -9,3 +11,28 @@ pub struct SubscriptionPlans { pub name: String, pub description: Option, } + +#[derive(Debug, Clone)] +pub struct GetSubscriptionPlanPricesResponse { + pub list: Vec, +} + +#[derive(Debug, Clone)] +pub struct SubscriptionPlanPrices { + pub price_id: String, + pub plan_id: Option, + pub amount: common_utils::types::MinorUnit, + pub currency: Currency, + pub interval: PeriodUnit, + pub interval_count: i64, + pub trial_period: Option, + pub trial_period_unit: Option, +} + +#[derive(Debug, Clone)] +pub enum PeriodUnit { + Day, + Week, + Month, + Year, +} diff --git a/crates/hyperswitch_domain_models/src/types.rs b/crates/hyperswitch_domain_models/src/types.rs index 15b1a3086a..cc57f7f82f 100644 --- a/crates/hyperswitch_domain_models/src/types.rs +++ b/crates/hyperswitch_domain_models/src/types.rs @@ -4,21 +4,23 @@ use crate::{ router_data::{AccessToken, AccessTokenAuthenticationResponse, RouterData}, router_data_v2::{self, RouterDataV2}, router_flow_types::{ - mandate_revoke::MandateRevoke, revenue_recovery::InvoiceRecordBack, - subscriptions::GetSubscriptionPlans, AccessTokenAuth, AccessTokenAuthentication, - Authenticate, AuthenticationConfirmation, Authorize, AuthorizeSessionToken, - BillingConnectorInvoiceSync, BillingConnectorPaymentsSync, CalculateTax, Capture, - CompleteAuthorize, CreateConnectorCustomer, CreateOrder, Execute, ExternalVaultProxy, - GiftCardBalanceCheck, IncrementalAuthorization, PSync, PaymentMethodToken, - PostAuthenticate, PostCaptureVoid, PostSessionTokens, PreAuthenticate, PreProcessing, - RSync, SdkSessionUpdate, Session, SetupMandate, UpdateMetadata, VerifyWebhookSource, Void, + mandate_revoke::MandateRevoke, + revenue_recovery::InvoiceRecordBack, + subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, + AccessTokenAuth, AccessTokenAuthentication, Authenticate, AuthenticationConfirmation, + Authorize, AuthorizeSessionToken, BillingConnectorInvoiceSync, + BillingConnectorPaymentsSync, CalculateTax, Capture, CompleteAuthorize, + CreateConnectorCustomer, CreateOrder, Execute, ExternalVaultProxy, GiftCardBalanceCheck, + IncrementalAuthorization, PSync, PaymentMethodToken, PostAuthenticate, PostCaptureVoid, + PostSessionTokens, PreAuthenticate, PreProcessing, RSync, SdkSessionUpdate, Session, + SetupMandate, UpdateMetadata, VerifyWebhookSource, Void, }, router_request_types::{ revenue_recovery::{ BillingConnectorInvoiceSyncRequest, BillingConnectorPaymentsSyncRequest, InvoiceRecordBackRequest, }, - subscriptions::GetSubscriptionPlansRequest, + subscriptions::{GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest}, unified_authentication_service::{ UasAuthenticationRequestData, UasAuthenticationResponseData, UasConfirmationRequestData, UasPostAuthenticationRequestData, @@ -40,7 +42,7 @@ use crate::{ BillingConnectorInvoiceSyncResponse, BillingConnectorPaymentsSyncResponse, InvoiceRecordBackResponse, }, - subscriptions::GetSubscriptionPlansResponse, + subscriptions::{GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse}, GiftCardBalanceCheckResponseData, MandateRevokeResponseData, PaymentsResponseData, RefundsResponseData, TaxCalculationResponseData, VaultResponseData, VerifyWebhookSourceResponseData, @@ -172,6 +174,12 @@ pub type InvoiceRecordBackRouterDataV2 = RouterDataV2< InvoiceRecordBackResponse, >; +pub type GetSubscriptionPlanPricesRouterData = RouterData< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, +>; + pub type VaultRouterData = RouterData; pub type VaultRouterDataV2 = RouterDataV2< diff --git a/crates/hyperswitch_interfaces/src/api.rs b/crates/hyperswitch_interfaces/src/api.rs index fe16681d4c..b71f20ec55 100644 --- a/crates/hyperswitch_interfaces/src/api.rs +++ b/crates/hyperswitch_interfaces/src/api.rs @@ -81,8 +81,8 @@ pub use self::payouts::*; pub use self::payouts_v2::*; pub use self::{payments::*, refunds::*, vault::*, vault_v2::*}; use crate::{ - connector_integration_v2::ConnectorIntegrationV2, consts, errors, - events::connector_api_logs::ConnectorEvent, metrics, types, webhooks, + api::subscriptions::Subscriptions, connector_integration_v2::ConnectorIntegrationV2, consts, + errors, events::connector_api_logs::ConnectorEvent, metrics, types, webhooks, }; /// Connector trait @@ -106,7 +106,7 @@ pub trait Connector: + UnifiedAuthenticationService + revenue_recovery::RevenueRecovery + ExternalVault - + subscriptions::Subscriptions + + Subscriptions { } @@ -130,7 +130,7 @@ impl< + UnifiedAuthenticationService + revenue_recovery::RevenueRecovery + ExternalVault - + subscriptions::Subscriptions, + + Subscriptions, > Connector for T { } diff --git a/crates/hyperswitch_interfaces/src/api/subscriptions.rs b/crates/hyperswitch_interfaces/src/api/subscriptions.rs index 1f911940d2..7e710c63d1 100644 --- a/crates/hyperswitch_interfaces/src/api/subscriptions.rs +++ b/crates/hyperswitch_interfaces/src/api/subscriptions.rs @@ -1,9 +1,13 @@ //! Subscriptions Interface for V1 #[cfg(feature = "v1")] use hyperswitch_domain_models::{ - router_flow_types::subscriptions::GetSubscriptionPlans, - router_request_types::subscriptions::GetSubscriptionPlansRequest, - router_response_types::subscriptions::GetSubscriptionPlansResponse, + router_flow_types::subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, + router_request_types::subscriptions::{ + GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest, + }, + router_response_types::subscriptions::{ + GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse, + }, }; #[cfg(feature = "v1")] @@ -22,10 +26,24 @@ pub trait GetSubscriptionPlansFlow: { } +#[cfg(feature = "v1")] +/// trait GetSubscriptionPlanPrices for V1 +pub trait GetSubscriptionPlanPricesFlow: + ConnectorIntegration< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, +> +{ +} + /// trait Subscriptions #[cfg(feature = "v1")] pub trait Subscriptions: - ConnectorCommon + GetSubscriptionPlansFlow + PaymentsConnectorCustomer + ConnectorCommon + + GetSubscriptionPlansFlow + + GetSubscriptionPlanPricesFlow + + PaymentsConnectorCustomer { } @@ -37,6 +55,10 @@ pub trait Subscriptions {} #[cfg(not(feature = "v1"))] pub trait GetSubscriptionPlansFlow {} +/// trait GetSubscriptionPlanPricesFlow (disabled when not V1) +#[cfg(not(feature = "v1"))] +pub trait GetSubscriptionPlanPricesFlow {} + #[cfg(not(feature = "v1"))] /// trait CreateCustomer (disabled when not V1) pub trait ConnectorCustomer {} diff --git a/crates/hyperswitch_interfaces/src/api/subscriptions_v2.rs b/crates/hyperswitch_interfaces/src/api/subscriptions_v2.rs index ba8b54062f..609ab2dbc3 100644 --- a/crates/hyperswitch_interfaces/src/api/subscriptions_v2.rs +++ b/crates/hyperswitch_interfaces/src/api/subscriptions_v2.rs @@ -1,18 +1,25 @@ //! SubscriptionsV2 use hyperswitch_domain_models::{ - router_data_v2::flow_common_types::GetSubscriptionPlansData, - router_flow_types::subscriptions::GetSubscriptionPlans, - router_request_types::subscriptions::GetSubscriptionPlansRequest, - router_response_types::subscriptions::GetSubscriptionPlansResponse, + router_data_v2::flow_common_types::{GetSubscriptionPlanPricesData, GetSubscriptionPlansData}, + router_flow_types::subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, + router_request_types::subscriptions::{ + GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest, + }, + router_response_types::subscriptions::{ + GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse, + }, }; use super::payments_v2::ConnectorCustomerV2; use crate::connector_integration_v2::ConnectorIntegrationV2; /// trait SubscriptionsV2 -pub trait SubscriptionsV2: GetSubscriptionPlansV2 + ConnectorCustomerV2 {} +pub trait SubscriptionsV2: + GetSubscriptionPlansV2 + ConnectorCustomerV2 + GetSubscriptionPlanPricesV2 +{ +} -/// trait GetSubscriptionPlans for V1 +/// trait GetSubscriptionPlans for V2 pub trait GetSubscriptionPlansV2: ConnectorIntegrationV2< GetSubscriptionPlans, @@ -22,3 +29,14 @@ pub trait GetSubscriptionPlansV2: > { } + +/// trait GetSubscriptionPlans for V2 +pub trait GetSubscriptionPlanPricesV2: + ConnectorIntegrationV2< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesData, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, +> +{ +} diff --git a/crates/hyperswitch_interfaces/src/conversion_impls.rs b/crates/hyperswitch_interfaces/src/conversion_impls.rs index 32818ca5d4..d119cf332e 100644 --- a/crates/hyperswitch_interfaces/src/conversion_impls.rs +++ b/crates/hyperswitch_interfaces/src/conversion_impls.rs @@ -11,10 +11,10 @@ use hyperswitch_domain_models::{ flow_common_types::{ AccessTokenFlowData, AuthenticationTokenFlowData, BillingConnectorInvoiceSyncFlowData, BillingConnectorPaymentsSyncFlowData, DisputesFlowData, ExternalAuthenticationFlowData, - ExternalVaultProxyFlowData, FilesFlowData, GetSubscriptionPlansData, - GiftCardBalanceCheckFlowData, InvoiceRecordBackData, MandateRevokeFlowData, - PaymentFlowData, RefundFlowData, UasFlowData, VaultConnectorFlowData, - WebhookSourceVerifyData, + ExternalVaultProxyFlowData, FilesFlowData, GetSubscriptionPlanPricesData, + GetSubscriptionPlansData, GiftCardBalanceCheckFlowData, InvoiceRecordBackData, + MandateRevokeFlowData, PaymentFlowData, RefundFlowData, UasFlowData, + VaultConnectorFlowData, WebhookSourceVerifyData, }, RouterDataV2, }, @@ -836,42 +836,48 @@ impl RouterDataConversion for InvoiceR } } -impl RouterDataConversion for GetSubscriptionPlansData { - fn from_old_router_data( - old_router_data: &RouterData, - ) -> CustomResult, ConnectorError> - where - Self: Sized, - { - let resource_common_data = Self {}; - Ok(RouterDataV2 { - flow: std::marker::PhantomData, - tenant_id: old_router_data.tenant_id.clone(), - resource_common_data, - connector_auth_type: old_router_data.connector_auth_type.clone(), - request: old_router_data.request.clone(), - response: old_router_data.response.clone(), - }) - } +macro_rules! default_router_data_conversion { + ($flow_name:ty) => { + impl RouterDataConversion for $flow_name { + fn from_old_router_data( + old_router_data: &RouterData, + ) -> CustomResult, ConnectorError> + where + Self: Sized, + { + let resource_common_data = Self {}; + Ok(RouterDataV2 { + flow: std::marker::PhantomData, + tenant_id: old_router_data.tenant_id.clone(), + resource_common_data, + connector_auth_type: old_router_data.connector_auth_type.clone(), + request: old_router_data.request.clone(), + response: old_router_data.response.clone(), + }) + } - fn to_old_router_data( - new_router_data: RouterDataV2, - ) -> CustomResult, ConnectorError> - where - Self: Sized, - { - let router_data = get_default_router_data( - new_router_data.tenant_id.clone(), - "get_subscription_plans", - new_router_data.request, - new_router_data.response, - ); - Ok(RouterData { - connector_auth_type: new_router_data.connector_auth_type.clone(), - ..router_data - }) - } + fn to_old_router_data( + new_router_data: RouterDataV2, + ) -> CustomResult, ConnectorError> + where + Self: Sized, + { + let router_data = get_default_router_data( + new_router_data.tenant_id.clone(), + stringify!($flow_name), + new_router_data.request, + new_router_data.response, + ); + Ok(RouterData { + connector_auth_type: new_router_data.connector_auth_type.clone(), + ..router_data + }) + } + } + }; } +default_router_data_conversion!(GetSubscriptionPlansData); +default_router_data_conversion!(GetSubscriptionPlanPricesData); impl RouterDataConversion for UasFlowData { fn from_old_router_data( diff --git a/crates/hyperswitch_interfaces/src/types.rs b/crates/hyperswitch_interfaces/src/types.rs index c34b6aff91..dbb9ddf886 100644 --- a/crates/hyperswitch_interfaces/src/types.rs +++ b/crates/hyperswitch_interfaces/src/types.rs @@ -16,7 +16,7 @@ use hyperswitch_domain_models::{ }, refunds::{Execute, RSync}, revenue_recovery::{BillingConnectorPaymentsSync, InvoiceRecordBack}, - subscriptions::GetSubscriptionPlans, + subscriptions::{GetSubscriptionPlanPrices, GetSubscriptionPlans}, unified_authentication_service::{ Authenticate, AuthenticationConfirmation, PostAuthenticate, PreAuthenticate, }, @@ -32,7 +32,7 @@ use hyperswitch_domain_models::{ BillingConnectorInvoiceSyncRequest, BillingConnectorPaymentsSyncRequest, InvoiceRecordBackRequest, }, - subscriptions::GetSubscriptionPlansRequest, + subscriptions::{GetSubscriptionPlanPricesRequest, GetSubscriptionPlansRequest}, unified_authentication_service::{ UasAuthenticationRequestData, UasAuthenticationResponseData, UasConfirmationRequestData, UasPostAuthenticationRequestData, @@ -57,7 +57,7 @@ use hyperswitch_domain_models::{ BillingConnectorInvoiceSyncResponse, BillingConnectorPaymentsSyncResponse, InvoiceRecordBackResponse, }, - subscriptions::GetSubscriptionPlansResponse, + subscriptions::{GetSubscriptionPlanPricesResponse, GetSubscriptionPlansResponse}, AcceptDisputeResponse, DefendDisputeResponse, DisputeSyncResponse, FetchDisputesResponse, GiftCardBalanceCheckResponseData, MandateRevokeResponseData, PaymentsResponseData, RefundsResponseData, RetrieveFileResponse, SubmitEvidenceResponse, @@ -182,6 +182,13 @@ pub type IncrementalAuthorizationType = dyn ConnectorIntegration< PaymentsResponseData, >; +/// Type alias for ConnectorIntegration +pub type GetSubscriptionPlanPricesType = dyn ConnectorIntegration< + GetSubscriptionPlanPrices, + GetSubscriptionPlanPricesRequest, + GetSubscriptionPlanPricesResponse, +>; + /// Type alias for `ConnectorIntegration` pub type ConnectorCustomerType = dyn ConnectorIntegration; diff --git a/crates/router/src/services/api.rs b/crates/router/src/services/api.rs index e7e03a5f32..4e8970d930 100644 --- a/crates/router/src/services/api.rs +++ b/crates/router/src/services/api.rs @@ -108,6 +108,8 @@ pub type BoxedRevenueRecoveryRecordBackInterface = BoxedConnectorIntegrationInterface; pub type BoxedGetSubscriptionPlansInterface = BoxedConnectorIntegrationInterface; +pub type BoxedGetSubscriptionPlanPricesInterface = + BoxedConnectorIntegrationInterface; pub type BoxedBillingConnectorInvoiceSyncIntegrationInterface = BoxedConnectorIntegrationInterface< T,