mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +08:00
177 lines
5.6 KiB
Rust
177 lines
5.6 KiB
Rust
use diesel::{AsChangeset, Identifiable, Insertable, Queryable};
|
|
use serde::{Deserialize, Serialize};
|
|
use time::PrimitiveDateTime;
|
|
|
|
use crate::{enums as storage_enums, schema::refund};
|
|
|
|
#[derive(
|
|
Clone, Debug, Eq, Identifiable, Queryable, PartialEq, serde::Serialize, serde::Deserialize,
|
|
)]
|
|
#[diesel(table_name = refund)]
|
|
pub struct Refund {
|
|
pub id: i32,
|
|
pub internal_reference_id: String,
|
|
pub refund_id: String, //merchant_reference id
|
|
pub payment_id: String,
|
|
pub merchant_id: String,
|
|
pub connector_transaction_id: String,
|
|
pub connector: String,
|
|
pub connector_refund_id: Option<String>,
|
|
pub external_reference_id: Option<String>,
|
|
pub refund_type: storage_enums::RefundType,
|
|
pub total_amount: i64,
|
|
pub currency: storage_enums::Currency,
|
|
pub refund_amount: i64,
|
|
pub refund_status: storage_enums::RefundStatus,
|
|
pub sent_to_gateway: bool,
|
|
pub refund_error_message: Option<String>,
|
|
pub metadata: Option<serde_json::Value>,
|
|
pub refund_arn: Option<String>,
|
|
pub created_at: PrimitiveDateTime,
|
|
pub updated_at: PrimitiveDateTime,
|
|
pub description: Option<String>,
|
|
pub attempt_id: String,
|
|
pub refund_reason: Option<String>,
|
|
}
|
|
|
|
#[derive(
|
|
Clone,
|
|
Debug,
|
|
Default,
|
|
Eq,
|
|
PartialEq,
|
|
Insertable,
|
|
router_derive::DebugAsDisplay,
|
|
serde::Serialize,
|
|
serde::Deserialize,
|
|
router_derive::Setter,
|
|
)]
|
|
#[diesel(table_name = refund)]
|
|
pub struct RefundNew {
|
|
pub refund_id: String,
|
|
pub payment_id: String,
|
|
pub merchant_id: String,
|
|
pub internal_reference_id: String,
|
|
pub external_reference_id: Option<String>,
|
|
pub connector_transaction_id: String,
|
|
pub connector: String,
|
|
pub connector_refund_id: Option<String>,
|
|
pub refund_type: storage_enums::RefundType,
|
|
pub total_amount: i64,
|
|
pub currency: storage_enums::Currency,
|
|
pub refund_amount: i64,
|
|
pub refund_status: storage_enums::RefundStatus,
|
|
pub sent_to_gateway: bool,
|
|
pub refund_error_message: Option<String>,
|
|
pub metadata: Option<serde_json::Value>,
|
|
pub refund_arn: Option<String>,
|
|
pub created_at: Option<PrimitiveDateTime>,
|
|
pub modified_at: Option<PrimitiveDateTime>,
|
|
pub description: Option<String>,
|
|
pub attempt_id: String,
|
|
pub refund_reason: Option<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
|
pub enum RefundUpdate {
|
|
Update {
|
|
connector_refund_id: String,
|
|
refund_status: storage_enums::RefundStatus,
|
|
sent_to_gateway: bool,
|
|
refund_error_message: Option<String>,
|
|
refund_arn: String,
|
|
},
|
|
MetadataAndReasonUpdate {
|
|
metadata: Option<serde_json::Value>,
|
|
reason: Option<String>,
|
|
},
|
|
StatusUpdate {
|
|
connector_refund_id: Option<String>,
|
|
sent_to_gateway: bool,
|
|
refund_status: storage_enums::RefundStatus,
|
|
},
|
|
ErrorUpdate {
|
|
refund_status: Option<storage_enums::RefundStatus>,
|
|
refund_error_message: Option<String>,
|
|
},
|
|
}
|
|
|
|
#[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)]
|
|
#[diesel(table_name = refund)]
|
|
pub struct RefundUpdateInternal {
|
|
connector_refund_id: Option<String>,
|
|
refund_status: Option<storage_enums::RefundStatus>,
|
|
sent_to_gateway: Option<bool>,
|
|
refund_error_message: Option<String>,
|
|
refund_arn: Option<String>,
|
|
metadata: Option<serde_json::Value>,
|
|
refund_reason: Option<String>,
|
|
}
|
|
|
|
impl From<RefundUpdate> for RefundUpdateInternal {
|
|
fn from(refund_update: RefundUpdate) -> Self {
|
|
match refund_update {
|
|
RefundUpdate::Update {
|
|
connector_refund_id,
|
|
refund_status,
|
|
sent_to_gateway,
|
|
refund_error_message,
|
|
refund_arn,
|
|
} => Self {
|
|
connector_refund_id: Some(connector_refund_id),
|
|
refund_status: Some(refund_status),
|
|
sent_to_gateway: Some(sent_to_gateway),
|
|
refund_error_message,
|
|
refund_arn: Some(refund_arn),
|
|
..Default::default()
|
|
},
|
|
RefundUpdate::MetadataAndReasonUpdate { metadata, reason } => Self {
|
|
metadata,
|
|
refund_reason: reason,
|
|
..Default::default()
|
|
},
|
|
RefundUpdate::StatusUpdate {
|
|
connector_refund_id,
|
|
sent_to_gateway,
|
|
refund_status,
|
|
} => Self {
|
|
connector_refund_id,
|
|
sent_to_gateway: Some(sent_to_gateway),
|
|
refund_status: Some(refund_status),
|
|
..Default::default()
|
|
},
|
|
RefundUpdate::ErrorUpdate {
|
|
refund_status,
|
|
refund_error_message,
|
|
} => Self {
|
|
refund_status,
|
|
refund_error_message,
|
|
..Default::default()
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
impl RefundUpdate {
|
|
pub fn apply_changeset(self, source: Refund) -> Refund {
|
|
let pa_update: RefundUpdateInternal = self.into();
|
|
Refund {
|
|
connector_refund_id: pa_update.connector_refund_id,
|
|
refund_status: pa_update.refund_status.unwrap_or(source.refund_status),
|
|
sent_to_gateway: pa_update.sent_to_gateway.unwrap_or(source.sent_to_gateway),
|
|
refund_error_message: pa_update.refund_error_message,
|
|
refund_arn: pa_update.refund_arn,
|
|
metadata: pa_update.metadata,
|
|
..source
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
|
|
pub struct RefundCoreWorkflow {
|
|
pub refund_internal_reference_id: String,
|
|
pub connector_transaction_id: String,
|
|
pub merchant_id: String,
|
|
pub payment_id: String,
|
|
}
|