Files
2023-01-14 22:57:36 +05:30

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,
}