use common_utils::types::{ConnectorTransactionId, MinorUnit}; use diesel::{AsChangeset, Identifiable, Insertable, Queryable, Selectable}; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use crate::{enums as storage_enums, schema::captures}; #[derive( Clone, Debug, Eq, PartialEq, Identifiable, Queryable, Selectable, Serialize, Deserialize, )] #[diesel(table_name = captures, primary_key(capture_id), check_for_backend(diesel::pg::Pg))] pub struct Capture { pub capture_id: String, pub payment_id: common_utils::id_type::PaymentId, pub merchant_id: common_utils::id_type::MerchantId, pub status: storage_enums::CaptureStatus, pub amount: MinorUnit, pub currency: Option, pub connector: String, pub error_message: Option, pub error_code: Option, pub error_reason: Option, pub tax_amount: Option, #[serde(with = "common_utils::custom_serde::iso8601")] pub created_at: PrimitiveDateTime, #[serde(with = "common_utils::custom_serde::iso8601")] pub modified_at: PrimitiveDateTime, pub authorized_attempt_id: String, pub connector_capture_id: Option, pub capture_sequence: i16, // reference to the capture at connector side pub connector_response_reference_id: Option, /// INFO: This field is deprecated and replaced by processor_capture_data pub connector_capture_data: Option, pub processor_capture_data: Option, } #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay, Serialize, Deserialize)] #[diesel(table_name = captures)] pub struct CaptureNew { pub capture_id: String, pub payment_id: common_utils::id_type::PaymentId, pub merchant_id: common_utils::id_type::MerchantId, pub status: storage_enums::CaptureStatus, pub amount: MinorUnit, pub currency: Option, pub connector: String, pub error_message: Option, pub error_code: Option, pub error_reason: Option, pub tax_amount: Option, #[serde(with = "common_utils::custom_serde::iso8601")] pub created_at: PrimitiveDateTime, #[serde(with = "common_utils::custom_serde::iso8601")] pub modified_at: PrimitiveDateTime, pub authorized_attempt_id: String, pub connector_capture_id: Option, pub capture_sequence: i16, pub connector_response_reference_id: Option, /// INFO: This field is deprecated and replaced by processor_capture_data pub connector_capture_data: Option, pub processor_capture_data: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum CaptureUpdate { ResponseUpdate { status: storage_enums::CaptureStatus, connector_capture_id: Option, connector_response_reference_id: Option, processor_capture_data: Option, }, ErrorUpdate { status: storage_enums::CaptureStatus, error_code: Option, error_message: Option, error_reason: Option, }, } #[derive(Clone, Debug, Default, AsChangeset, router_derive::DebugAsDisplay)] #[diesel(table_name = captures)] pub struct CaptureUpdateInternal { pub status: Option, pub error_message: Option, pub error_code: Option, pub error_reason: Option, pub modified_at: Option, pub connector_capture_id: Option, pub connector_response_reference_id: Option, pub processor_capture_data: Option, } impl CaptureUpdate { pub fn apply_changeset(self, source: Capture) -> Capture { let CaptureUpdateInternal { status, error_message, error_code, error_reason, modified_at: _, connector_capture_id, connector_response_reference_id, processor_capture_data, } = self.into(); Capture { status: status.unwrap_or(source.status), error_message: error_message.or(source.error_message), error_code: error_code.or(source.error_code), error_reason: error_reason.or(source.error_reason), modified_at: common_utils::date_time::now(), connector_capture_id: connector_capture_id.or(source.connector_capture_id), connector_response_reference_id: connector_response_reference_id .or(source.connector_response_reference_id), processor_capture_data: processor_capture_data.or(source.processor_capture_data), ..source } } } impl From for CaptureUpdateInternal { fn from(payment_attempt_child_update: CaptureUpdate) -> Self { let now = Some(common_utils::date_time::now()); match payment_attempt_child_update { CaptureUpdate::ResponseUpdate { status, connector_capture_id: connector_transaction_id, connector_response_reference_id, processor_capture_data, } => Self { status: Some(status), connector_capture_id: connector_transaction_id, modified_at: now, connector_response_reference_id, processor_capture_data, ..Self::default() }, CaptureUpdate::ErrorUpdate { status, error_code, error_message, error_reason, } => Self { status: Some(status), error_code, error_message, error_reason, modified_at: now, ..Self::default() }, } } }