Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 70 additions & 6 deletions connector-template/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,17 @@ use hyperswitch_interfaces::{
types::{self, Response},
webhooks,
};
use std::sync::LazyLock;

use common_enums::enums;
use hyperswitch_interfaces::api::ConnectorSpecifications;
use hyperswitch_domain_models::router_response_types::{ConnectorInfo, SupportedPaymentMethods};
use crate::{
constants::headers,
types::ResponseRouterData,
utils,
};
use hyperswitch_domain_models::payment_method_data::PaymentMethodData;

use transformers as {{project-name | downcase}};

Expand Down Expand Up @@ -147,13 +153,39 @@ impl ConnectorCommon for {{project-name | downcase | pascal_case}} {
reason: response.reason,
attempt_status: None,
connector_transaction_id: None,
network_advice_code: None,
network_decline_code: None,
network_error_message: None,
})
}
}


impl ConnectorValidation for {{project-name | downcase | pascal_case}}
{
//TODO: implement functions when support enabled
fn validate_mandate_payment(
&self,
_pm_type: Option<enums::PaymentMethodType>,
pm_data: PaymentMethodData,
) -> CustomResult<(), errors::ConnectorError> {
match pm_data {
PaymentMethodData::Card(_) => Err(errors::ConnectorError::NotImplemented(
"validate_mandate_payment does not support cards".to_string(),
)
.into()),
_ => Ok(()),
}
}

fn validate_psync_reference_id(
&self,
_data: &PaymentsSyncData,
_is_three_ds: bool,
_status: enums::AttemptStatus,
_connector_meta_data: Option<common_utils::pii::SecretSerdeValue>,
) -> CustomResult<(), errors::ConnectorError> {
Ok(())
}
}

impl
Expand Down Expand Up @@ -194,7 +226,10 @@ impl
self.common_get_content_type()
}

fn get_url(&self, _req: &PaymentsAuthorizeRouterData, _connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
fn get_url(
&self,
_req: &PaymentsAuthorizeRouterData,
_connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
}

Expand Down Expand Up @@ -425,7 +460,10 @@ impl
self.common_get_content_type()
}

fn get_url(&self, _req: &RefundsRouterData<Execute>, _connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
fn get_url(
&self,
_req: &RefundsRouterData<Execute>,
_connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
}

Expand Down Expand Up @@ -487,7 +525,9 @@ impl
self.common_get_content_type()
}

fn get_url(&self, _req: &RefundSyncRouterData,_connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
fn get_url(
&self,
_req: &RefundSyncRouterData,_connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
}

Expand Down Expand Up @@ -552,5 +592,29 @@ impl webhooks::IncomingWebhook for {{project-name | downcase | pascal_case}} {
}
}

impl ConnectorSpecifications for {{project-name | downcase | pascal_case}} {}

static {{project-name | upcase}}_SUPPORTED_PAYMENT_METHODS: LazyLock<SupportedPaymentMethods> =
LazyLock::new(|| {
SupportedPaymentMethods::new()
});

static {{project-name | upcase}}_CONNECTOR_INFO: ConnectorInfo = ConnectorInfo {
display_name: "{{project-name | downcase | pascal_case}}",
description: "{{project-name | downcase | pascal_case}} connector",
connector_type: enums::PaymentConnectorCategory::PaymentGateway,
};

static {{project-name | upcase}}_SUPPORTED_WEBHOOK_FLOWS: [enums::EventClass; 0] = [];

impl ConnectorSpecifications for {{project-name | downcase | pascal_case}} {
fn get_connector_about(&self) -> Option<&'static ConnectorInfo> {
Some(&{{project-name | upcase}}_CONNECTOR_INFO)
}

fn get_supported_payment_methods(&self) -> Option<&'static SupportedPaymentMethods> {
Some(&*{{project-name | upcase}}_SUPPORTED_PAYMENT_METHODS)
}

fn get_supported_webhook_flows(&self) -> Option<&'static [enums::EventClass]> {
Some(&{{project-name | upcase}}_SUPPORTED_WEBHOOK_FLOWS)
}
}
21 changes: 11 additions & 10 deletions connector-template/test.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use hyperswitch_domain_models::payment_method_data::{Card, PaymentMethodData};
use masking::Secret;
use router::{
types::{self, api, storage::enums,
Expand All @@ -12,13 +13,13 @@ impl ConnectorActions for {{project-name | downcase | pascal_case}}Test {}
impl utils::Connector for {{project-name | downcase | pascal_case}}Test {
fn get_data(&self) -> api::ConnectorData {
use router::connector::{{project-name | downcase | pascal_case}};
api::ConnectorData {
connector: Box::new({{project-name | downcase | pascal_case}}::new()),
connector_name: types::Connector::{{project-name | downcase | pascal_case}},
get_token: types::api::GetToken::Connector,
merchant_connector_id: None,
}
}
utils::construct_connector_data_old(
Box::new({{project-name | downcase | pascal_case}}::new()),
types::Connector::Plaid,
api::GetToken::Connector,
None,
)
}

fn get_auth_token(&self) -> types::ConnectorAuthType {
utils::to_connector_auth_type(
Expand Down Expand Up @@ -287,7 +288,7 @@ async fn should_fail_payment_for_incorrect_cvc() {
let response = CONNECTOR
.make_payment(
Some(types::PaymentsAuthorizeData {
payment_method_data: types::api::PaymentMethodData::Card(api::Card {
payment_method_data: PaymentMethodData::Card(Card {
card_cvc: Secret::new("12345".to_string()),
..utils::CCardType::default().0
}),
Expand All @@ -309,7 +310,7 @@ async fn should_fail_payment_for_invalid_exp_month() {
let response = CONNECTOR
.make_payment(
Some(types::PaymentsAuthorizeData {
payment_method_data: api::PaymentMethodData::Card(api::Card {
payment_method_data: PaymentMethodData::Card(Card {
card_exp_month: Secret::new("20".to_string()),
..utils::CCardType::default().0
}),
Expand All @@ -331,7 +332,7 @@ async fn should_fail_payment_for_incorrect_expiry_year() {
let response = CONNECTOR
.make_payment(
Some(types::PaymentsAuthorizeData {
payment_method_data: api::PaymentMethodData::Card(api::Card {
payment_method_data: PaymentMethodData::Card(Card {
card_exp_year: Secret::new("2000".to_string()),
..utils::CCardType::default().0
}),
Expand Down
29 changes: 10 additions & 19 deletions connector-template/transformers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ use hyperswitch_domain_models::{
types::{PaymentsAuthorizeRouterData, RefundsRouterData},
};
use hyperswitch_interfaces::errors;
use crate::{
types::{RefundsResponseRouterData, ResponseRouterData},
utils::PaymentsAuthorizeRequestData,
};
use crate::types::{RefundsResponseRouterData, ResponseRouterData};

//TODO: Fill the struct with respective fields
pub struct {{project-name | downcase | pascal_case}}RouterData<T> {
Expand Down Expand Up @@ -62,21 +59,12 @@ impl TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&PaymentsAutho
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&PaymentsAuthorizeRouterData>) -> Result<Self,Self::Error> {
match item.router_data.request.payment_method_data.clone() {
PaymentMethodData::Card(req_card) => {
let card = {{project-name | downcase | pascal_case}}Card {
number: req_card.card_number,
expiry_month: req_card.card_exp_month,
expiry_year: req_card.card_exp_year,
cvc: req_card.card_cvc,
complete: item.router_data.request.is_auto_capture()?,
};
Ok(Self {
amount: item.amount.clone(),
card,
})
}
PaymentMethodData::Card(_) => {
Err(errors::ConnectorError::NotImplemented("Card payment method not implemented".to_string()).into())
},
_ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
}

}
}

Expand All @@ -99,7 +87,7 @@ impl TryFrom<&ConnectorAuthType> for {{project-name | downcase | pascal_case}}Au
}
// PaymentsResponse
//TODO: Append the remaining status flags
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum {{project-name | downcase | pascal_case}}PaymentStatus {
Succeeded,
Expand Down Expand Up @@ -165,7 +153,7 @@ impl<F> TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&RefundsRou
// Type definition for Refund Response

#[allow(dead_code)]
#[derive(Debug, Serialize, Default, Deserialize, Clone)]
#[derive(Debug, Copy, Serialize, Default, Deserialize, Clone)]
pub enum RefundStatus {
Succeeded,
Failed,
Expand Down Expand Up @@ -229,4 +217,7 @@ pub struct {{project-name | downcase | pascal_case}}ErrorResponse {
pub code: String,
pub message: String,
pub reason: Option<String>,
pub network_advice_code: Option<String>,
pub network_decline_code: Option<String>,
pub network_error_message: Option<String>,
}
Original file line number Diff line number Diff line change
Expand Up @@ -5030,7 +5030,7 @@ macro_rules! default_imp_for_revenue_recovery {
};
}

default_imp_for_revenue_recovery! {
default_imp_for_revenue_recovery!(
connectors::Vgs,
connectors::Aci,
connectors::Adyen,
Expand Down Expand Up @@ -5136,7 +5136,7 @@ default_imp_for_revenue_recovery! {
connectors::Xendit,
connectors::Zen,
connectors::Zsl
}
);

#[cfg(all(feature = "v2", feature = "revenue_recovery"))]
macro_rules! default_imp_for_billing_connector_payment_sync {
Expand Down
Loading
Loading