mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-26 19:04:36 +08:00
224 lines
7.9 KiB
Rust
224 lines
7.9 KiB
Rust
use common_enums::enums;
|
|
use serde::{Deserialize, Serialize};
|
|
use masking::Secret;
|
|
use common_utils::types::{StringMinorUnit};
|
|
use hyperswitch_domain_models::{
|
|
payment_method_data::PaymentMethodData,
|
|
router_data::{ConnectorAuthType, RouterData},
|
|
router_flow_types::refunds::{Execute, RSync},
|
|
router_request_types::ResponseId,
|
|
router_response_types::{PaymentsResponseData, RefundsResponseData},
|
|
types::{PaymentsAuthorizeRouterData, RefundsRouterData},
|
|
};
|
|
use hyperswitch_interfaces::errors;
|
|
use crate::types::{RefundsResponseRouterData, ResponseRouterData};
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
pub struct {{project-name | downcase | pascal_case}}RouterData<T> {
|
|
pub amount: StringMinorUnit, // The type of amount that a connector accepts, for example, String, i64, f64, etc.
|
|
pub router_data: T,
|
|
}
|
|
|
|
impl<T>
|
|
From<(
|
|
StringMinorUnit,
|
|
T,
|
|
)> for {{project-name | downcase | pascal_case}}RouterData<T>
|
|
{
|
|
fn from(
|
|
(amount, item): (
|
|
StringMinorUnit,
|
|
T,
|
|
),
|
|
) -> Self {
|
|
//Todo : use utils to convert the amount to the type of amount that a connector accepts
|
|
Self {
|
|
amount,
|
|
router_data: item,
|
|
}
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
#[derive(Default, Debug, Serialize, PartialEq)]
|
|
pub struct {{project-name | downcase | pascal_case}}PaymentsRequest {
|
|
amount: StringMinorUnit,
|
|
card: {{project-name | downcase | pascal_case}}Card
|
|
}
|
|
|
|
#[derive(Default, Debug, Serialize, Eq, PartialEq)]
|
|
pub struct {{project-name | downcase | pascal_case}}Card {
|
|
number: cards::CardNumber,
|
|
expiry_month: Secret<String>,
|
|
expiry_year: Secret<String>,
|
|
cvc: Secret<String>,
|
|
complete: bool,
|
|
}
|
|
|
|
impl TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&PaymentsAuthorizeRouterData>> for {{project-name | downcase | pascal_case}}PaymentsRequest {
|
|
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(_) => {
|
|
Err(errors::ConnectorError::NotImplemented("Card payment method not implemented".to_string()).into())
|
|
},
|
|
_ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()),
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
// Auth Struct
|
|
pub struct {{project-name | downcase | pascal_case}}AuthType {
|
|
pub(super) api_key: Secret<String>
|
|
}
|
|
|
|
impl TryFrom<&ConnectorAuthType> for {{project-name | downcase | pascal_case}}AuthType {
|
|
type Error = error_stack::Report<errors::ConnectorError>;
|
|
fn try_from(auth_type: &ConnectorAuthType) -> Result<Self, Self::Error> {
|
|
match auth_type {
|
|
ConnectorAuthType::HeaderKey { api_key } => Ok(Self {
|
|
api_key: api_key.to_owned(),
|
|
}),
|
|
_ => Err(errors::ConnectorError::FailedToObtainAuthType.into()),
|
|
}
|
|
}
|
|
}
|
|
// PaymentsResponse
|
|
//TODO: Append the remaining status flags
|
|
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum {{project-name | downcase | pascal_case}}PaymentStatus {
|
|
Succeeded,
|
|
Failed,
|
|
#[default]
|
|
Processing,
|
|
}
|
|
|
|
impl From<{{project-name | downcase | pascal_case}}PaymentStatus> for common_enums::AttemptStatus {
|
|
fn from(item: {{project-name | downcase | pascal_case}}PaymentStatus) -> Self {
|
|
match item {
|
|
{{project-name | downcase | pascal_case}}PaymentStatus::Succeeded => Self::Charged,
|
|
{{project-name | downcase | pascal_case}}PaymentStatus::Failed => Self::Failure,
|
|
{{project-name | downcase | pascal_case}}PaymentStatus::Processing => Self::Authorizing,
|
|
}
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
pub struct {{project-name | downcase | pascal_case}}PaymentsResponse {
|
|
status: {{project-name | downcase | pascal_case}}PaymentStatus,
|
|
id: String,
|
|
}
|
|
|
|
impl<F,T> TryFrom<ResponseRouterData<F, {{project-name | downcase | pascal_case}}PaymentsResponse, T, PaymentsResponseData>> for RouterData<F, T, PaymentsResponseData> {
|
|
type Error = error_stack::Report<errors::ConnectorError>;
|
|
fn try_from(item: ResponseRouterData<F, {{project-name | downcase | pascal_case}}PaymentsResponse, T, PaymentsResponseData>) -> Result<Self,Self::Error> {
|
|
Ok(Self {
|
|
status: common_enums::AttemptStatus::from(item.response.status),
|
|
response: Ok(PaymentsResponseData::TransactionResponse {
|
|
resource_id: ResponseId::ConnectorTransactionId(item.response.id),
|
|
redirection_data: Box::new(None),
|
|
mandate_reference: Box::new(None),
|
|
connector_metadata: None,
|
|
network_txn_id: None,
|
|
connector_response_reference_id: None,
|
|
incremental_authorization_allowed: None,
|
|
charges: None,
|
|
}),
|
|
..item.data
|
|
})
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
// REFUND :
|
|
// Type definition for RefundRequest
|
|
#[derive(Default, Debug, Serialize)]
|
|
pub struct {{project-name | downcase | pascal_case}}RefundRequest {
|
|
pub amount: StringMinorUnit
|
|
}
|
|
|
|
impl<F> TryFrom<&{{project-name | downcase | pascal_case}}RouterData<&RefundsRouterData<F>>> for {{project-name | downcase | pascal_case}}RefundRequest {
|
|
type Error = error_stack::Report<errors::ConnectorError>;
|
|
fn try_from(item: &{{project-name | downcase | pascal_case}}RouterData<&RefundsRouterData<F>>) -> Result<Self,Self::Error> {
|
|
Ok(Self {
|
|
amount: item.amount.to_owned(),
|
|
})
|
|
}
|
|
}
|
|
|
|
// Type definition for Refund Response
|
|
|
|
#[allow(dead_code)]
|
|
#[derive(Debug, Copy, Serialize, Default, Deserialize, Clone)]
|
|
pub enum RefundStatus {
|
|
Succeeded,
|
|
Failed,
|
|
#[default]
|
|
Processing,
|
|
}
|
|
|
|
impl From<RefundStatus> for enums::RefundStatus {
|
|
fn from(item: RefundStatus) -> Self {
|
|
match item {
|
|
RefundStatus::Succeeded => Self::Success,
|
|
RefundStatus::Failed => Self::Failure,
|
|
RefundStatus::Processing => Self::Pending,
|
|
//TODO: Review mapping
|
|
}
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
|
|
pub struct RefundResponse {
|
|
id: String,
|
|
status: RefundStatus
|
|
}
|
|
|
|
impl TryFrom<RefundsResponseRouterData<Execute, RefundResponse>>
|
|
for RefundsRouterData<Execute>
|
|
{
|
|
type Error = error_stack::Report<errors::ConnectorError>;
|
|
fn try_from(
|
|
item: RefundsResponseRouterData<Execute, RefundResponse>,
|
|
) -> Result<Self, Self::Error> {
|
|
Ok(Self {
|
|
response: Ok(RefundsResponseData {
|
|
connector_refund_id: item.response.id.to_string(),
|
|
refund_status: enums::RefundStatus::from(item.response.status),
|
|
}),
|
|
..item.data
|
|
})
|
|
}
|
|
}
|
|
|
|
impl TryFrom<RefundsResponseRouterData<RSync, RefundResponse>> for RefundsRouterData<RSync>
|
|
{
|
|
type Error = error_stack::Report<errors::ConnectorError>;
|
|
fn try_from(item: RefundsResponseRouterData<RSync, RefundResponse>) -> Result<Self,Self::Error> {
|
|
Ok(Self {
|
|
response: Ok(RefundsResponseData {
|
|
connector_refund_id: item.response.id.to_string(),
|
|
refund_status: enums::RefundStatus::from(item.response.status),
|
|
}),
|
|
..item.data
|
|
})
|
|
}
|
|
}
|
|
|
|
//TODO: Fill the struct with respective fields
|
|
#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
|
|
pub struct {{project-name | downcase | pascal_case}}ErrorResponse {
|
|
pub status_code: u16,
|
|
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>,
|
|
}
|