use diesel::{AsChangeset, Identifiable, Insertable, Queryable}; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use crate::schema::connector_response; #[derive(Clone, Debug, Deserialize, Serialize, Insertable, router_derive::DebugAsDisplay)] #[diesel(table_name = connector_response)] #[serde(deny_unknown_fields)] pub struct ConnectorResponseNew { pub payment_id: String, pub merchant_id: String, pub attempt_id: String, pub created_at: PrimitiveDateTime, pub modified_at: PrimitiveDateTime, pub connector_name: Option, pub connector_transaction_id: Option, pub authentication_data: Option, pub encoded_data: Option, } #[derive(Clone, Debug, Deserialize, Serialize, Identifiable, Queryable)] #[diesel(table_name = connector_response)] pub struct ConnectorResponse { #[serde(skip_serializing)] pub id: i32, pub payment_id: String, pub merchant_id: String, pub attempt_id: String, pub created_at: PrimitiveDateTime, pub modified_at: PrimitiveDateTime, pub connector_name: Option, pub connector_transaction_id: Option, pub authentication_data: Option, pub encoded_data: Option, } #[derive(Clone, Default, Debug, Deserialize, AsChangeset, Serialize)] #[diesel(table_name = connector_response)] pub struct ConnectorResponseUpdateInternal { pub connector_transaction_id: Option, pub authentication_data: Option, pub modified_at: Option, pub encoded_data: Option, pub connector_name: Option, } #[derive(Debug)] pub enum ConnectorResponseUpdate { ResponseUpdate { connector_transaction_id: Option, authentication_data: Option, encoded_data: Option, connector_name: Option, }, ErrorUpdate { connector_name: Option, }, } impl ConnectorResponseUpdate { pub fn apply_changeset(self, source: ConnectorResponse) -> ConnectorResponse { let connector_response_update: ConnectorResponseUpdateInternal = self.into(); ConnectorResponse { modified_at: connector_response_update .modified_at .unwrap_or_else(common_utils::date_time::now), connector_name: connector_response_update .connector_name .or(source.connector_name), connector_transaction_id: source .connector_transaction_id .or(connector_response_update.connector_transaction_id), authentication_data: connector_response_update .authentication_data .or(source.authentication_data), encoded_data: connector_response_update .encoded_data .or(source.encoded_data), ..source } } } impl From for ConnectorResponseUpdateInternal { fn from(connector_response_update: ConnectorResponseUpdate) -> Self { match connector_response_update { ConnectorResponseUpdate::ResponseUpdate { connector_transaction_id, authentication_data, encoded_data, connector_name, } => Self { connector_transaction_id, authentication_data, encoded_data, modified_at: Some(common_utils::date_time::now()), connector_name, }, ConnectorResponseUpdate::ErrorUpdate { connector_name } => Self { connector_name, modified_at: Some(common_utils::date_time::now()), ..Self::default() }, } } }