feat(router): add an api to enable connector_agnostic_mit feature (#4480)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Shankar Singh C
2024-05-07 12:50:59 +05:30
committed by GitHub
parent a72f040d92
commit e769abe501
11 changed files with 105 additions and 1 deletions

View File

@ -1100,6 +1100,13 @@ pub struct ExtendedCardInfoChoice {
impl common_utils::events::ApiEventMetric for ExtendedCardInfoChoice {} impl common_utils::events::ApiEventMetric for ExtendedCardInfoChoice {}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
pub struct ConnectorAgnosticMitChoice {
pub enabled: bool,
}
impl common_utils::events::ApiEventMetric for ConnectorAgnosticMitChoice {}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
pub struct ExtendedCardInfoConfig { pub struct ExtendedCardInfoConfig {
/// Merchant public key /// Merchant public key

View File

@ -37,6 +37,7 @@ pub struct BusinessProfile {
pub authentication_connector_details: Option<serde_json::Value>, pub authentication_connector_details: Option<serde_json::Value>,
pub is_extended_card_info_enabled: Option<bool>, pub is_extended_card_info_enabled: Option<bool>,
pub extended_card_info_config: Option<pii::SecretSerdeValue>, pub extended_card_info_config: Option<pii::SecretSerdeValue>,
pub is_connector_agnostic_mit_enabled: Option<bool>,
} }
#[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)] #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay)]
@ -65,6 +66,7 @@ pub struct BusinessProfileNew {
pub authentication_connector_details: Option<serde_json::Value>, pub authentication_connector_details: Option<serde_json::Value>,
pub is_extended_card_info_enabled: Option<bool>, pub is_extended_card_info_enabled: Option<bool>,
pub extended_card_info_config: Option<pii::SecretSerdeValue>, pub extended_card_info_config: Option<pii::SecretSerdeValue>,
pub is_connector_agnostic_mit_enabled: Option<bool>,
} }
#[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)]
@ -90,6 +92,7 @@ pub struct BusinessProfileUpdateInternal {
pub authentication_connector_details: Option<serde_json::Value>, pub authentication_connector_details: Option<serde_json::Value>,
pub is_extended_card_info_enabled: Option<bool>, pub is_extended_card_info_enabled: Option<bool>,
pub extended_card_info_config: Option<pii::SecretSerdeValue>, pub extended_card_info_config: Option<pii::SecretSerdeValue>,
pub is_connector_agnostic_mit_enabled: Option<bool>,
} }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
@ -117,6 +120,9 @@ pub enum BusinessProfileUpdate {
ExtendedCardInfoUpdate { ExtendedCardInfoUpdate {
is_extended_card_info_enabled: Option<bool>, is_extended_card_info_enabled: Option<bool>,
}, },
ConnectorAgnosticMitUpdate {
is_connector_agnostic_mit_enabled: Option<bool>,
},
} }
impl From<BusinessProfileUpdate> for BusinessProfileUpdateInternal { impl From<BusinessProfileUpdate> for BusinessProfileUpdateInternal {
@ -168,6 +174,12 @@ impl From<BusinessProfileUpdate> for BusinessProfileUpdateInternal {
is_extended_card_info_enabled, is_extended_card_info_enabled,
..Default::default() ..Default::default()
}, },
BusinessProfileUpdate::ConnectorAgnosticMitUpdate {
is_connector_agnostic_mit_enabled,
} => Self {
is_connector_agnostic_mit_enabled,
..Default::default()
},
} }
} }
} }
@ -195,6 +207,7 @@ impl From<BusinessProfileNew> for BusinessProfile {
payment_link_config: new.payment_link_config, payment_link_config: new.payment_link_config,
session_expiry: new.session_expiry, session_expiry: new.session_expiry,
authentication_connector_details: new.authentication_connector_details, authentication_connector_details: new.authentication_connector_details,
is_connector_agnostic_mit_enabled: new.is_connector_agnostic_mit_enabled,
is_extended_card_info_enabled: new.is_extended_card_info_enabled, is_extended_card_info_enabled: new.is_extended_card_info_enabled,
extended_card_info_config: new.extended_card_info_config, extended_card_info_config: new.extended_card_info_config,
} }
@ -223,6 +236,7 @@ impl BusinessProfileUpdate {
authentication_connector_details, authentication_connector_details,
is_extended_card_info_enabled, is_extended_card_info_enabled,
extended_card_info_config, extended_card_info_config,
is_connector_agnostic_mit_enabled,
} = self.into(); } = self.into();
BusinessProfile { BusinessProfile {
profile_name: profile_name.unwrap_or(source.profile_name), profile_name: profile_name.unwrap_or(source.profile_name),
@ -245,6 +259,7 @@ impl BusinessProfileUpdate {
session_expiry, session_expiry,
authentication_connector_details, authentication_connector_details,
is_extended_card_info_enabled, is_extended_card_info_enabled,
is_connector_agnostic_mit_enabled,
extended_card_info_config, extended_card_info_config,
..source ..source
} }

View File

@ -194,6 +194,7 @@ diesel::table! {
authentication_connector_details -> Nullable<Jsonb>, authentication_connector_details -> Nullable<Jsonb>,
is_extended_card_info_enabled -> Nullable<Bool>, is_extended_card_info_enabled -> Nullable<Bool>,
extended_card_info_config -> Nullable<Jsonb>, extended_card_info_config -> Nullable<Jsonb>,
is_connector_agnostic_mit_enabled -> Nullable<Bool>,
} }
} }

View File

@ -1739,6 +1739,47 @@ pub async fn extended_card_info_toggle(
Ok(service_api::ApplicationResponse::Json(ext_card_info_choice)) Ok(service_api::ApplicationResponse::Json(ext_card_info_choice))
} }
pub async fn connector_agnostic_mit_toggle(
state: AppState,
merchant_id: &str,
profile_id: &str,
connector_agnostic_mit_choice: admin_types::ConnectorAgnosticMitChoice,
) -> RouterResponse<admin_types::ConnectorAgnosticMitChoice> {
let db = state.store.as_ref();
let business_profile = db
.find_business_profile_by_profile_id(profile_id)
.await
.to_not_found_response(errors::ApiErrorResponse::BusinessProfileNotFound {
id: profile_id.to_string(),
})?;
if business_profile.merchant_id != merchant_id {
Err(errors::ApiErrorResponse::AccessForbidden {
resource: profile_id.to_string(),
})?
}
if business_profile.is_connector_agnostic_mit_enabled
!= Some(connector_agnostic_mit_choice.enabled)
{
let business_profile_update =
storage::business_profile::BusinessProfileUpdate::ConnectorAgnosticMitUpdate {
is_connector_agnostic_mit_enabled: Some(connector_agnostic_mit_choice.enabled),
};
db.update_business_profile_by_profile_id(business_profile, business_profile_update)
.await
.to_not_found_response(errors::ApiErrorResponse::BusinessProfileNotFound {
id: profile_id.to_owned(),
})?;
}
Ok(service_api::ApplicationResponse::Json(
connector_agnostic_mit_choice,
))
}
pub(crate) fn validate_auth_and_metadata_type( pub(crate) fn validate_auth_and_metadata_type(
connector_name: api_models::enums::Connector, connector_name: api_models::enums::Connector,
val: &types::ConnectorAuthType, val: &types::ConnectorAuthType,

View File

@ -589,6 +589,32 @@ pub async fn business_profiles_list(
) )
.await .await
} }
#[instrument(skip_all, fields(flow = ?Flow::ToggleConnectorAgnosticMit))]
pub async fn toggle_connector_agnostic_mit(
state: web::Data<AppState>,
req: HttpRequest,
path: web::Path<(String, String)>,
json_payload: web::Json<api_models::admin::ConnectorAgnosticMitChoice>,
) -> HttpResponse {
let flow = Flow::ToggleConnectorAgnosticMit;
let (merchant_id, profile_id) = path.into_inner();
Box::pin(api::server_wrap(
flow,
state,
&req,
json_payload.into_inner(),
|state, _, req, _| connector_agnostic_mit_toggle(state, &merchant_id, &profile_id, req),
auth::auth_type(
&auth::ApiKeyAuth,
&auth::JWTAuth(Permission::RoutingWrite),
req.headers(),
),
api_locking::LockAction::NotApplicable,
))
.await
}
/// Merchant Account - KV Status /// Merchant Account - KV Status
/// ///
/// Toggle KV mode for the Merchant Account /// Toggle KV mode for the Merchant Account

View File

@ -1131,6 +1131,10 @@ impl BusinessProfile {
.service( .service(
web::resource("/toggle_extended_card_info") web::resource("/toggle_extended_card_info")
.route(web::post().to(toggle_extended_card_info)), .route(web::post().to(toggle_extended_card_info)),
)
.service(
web::resource("/toggle_connector_agnostic_mit")
.route(web::post().to(toggle_connector_agnostic_mit)),
), ),
) )
} }

View File

@ -168,7 +168,8 @@ impl From<Flow> for ApiIdentifier {
| Flow::BusinessProfileRetrieve | Flow::BusinessProfileRetrieve
| Flow::BusinessProfileDelete | Flow::BusinessProfileDelete
| Flow::BusinessProfileList | Flow::BusinessProfileList
| Flow::ToggleExtendedCardInfo => Self::Business, | Flow::ToggleExtendedCardInfo
| Flow::ToggleConnectorAgnosticMit => Self::Business,
Flow::PaymentLinkRetrieve Flow::PaymentLinkRetrieve
| Flow::PaymentLinkInitiate | Flow::PaymentLinkInitiate

View File

@ -175,6 +175,7 @@ impl ForeignTryFrom<(domain::MerchantAccount, BusinessProfileCreate)>
.change_context(errors::ApiErrorResponse::InvalidDataValue { .change_context(errors::ApiErrorResponse::InvalidDataValue {
field_name: "authentication_connector_details", field_name: "authentication_connector_details",
})?, })?,
is_connector_agnostic_mit_enabled: None,
is_extended_card_info_enabled: None, is_extended_card_info_enabled: None,
extended_card_info_config: None, extended_card_info_config: None,
}) })

View File

@ -406,6 +406,8 @@ pub enum Flow {
RetrievePollStatus, RetrievePollStatus,
/// Toggles the extended card info feature in profile level /// Toggles the extended card info feature in profile level
ToggleExtendedCardInfo, ToggleExtendedCardInfo,
/// Toggles the extended card info feature in profile level
ToggleConnectorAgnosticMit,
/// Get the extended card info associated to a payment_id /// Get the extended card info associated to a payment_id
GetExtendedCardInfo, GetExtendedCardInfo,
} }

View File

@ -0,0 +1,3 @@
-- This file should undo anything in `up.sql`
ALTER TABLE business_profile DROP COLUMN IF EXISTS is_connector_agnostic_mit_enabled;

View File

@ -0,0 +1,3 @@
-- Your SQL goes here
ALTER TABLE business_profile ADD COLUMN IF NOT EXISTS is_connector_agnostic_mit_enabled BOOLEAN DEFAULT FALSE;