diff --git a/crates/router/src/connector/cashtocode.rs b/crates/router/src/connector/cashtocode.rs index a18e397fa1..9ecaeffec3 100644 --- a/crates/router/src/connector/cashtocode.rs +++ b/crates/router/src/connector/cashtocode.rs @@ -262,8 +262,12 @@ impl ConnectorIntegration CustomResult { + let response: transformers::CashtocodePaymentsSyncResponse = res + .response + .parse_struct("CashtocodePaymentsSyncResponse") + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; types::RouterData::try_from(types::ResponseRouterData { - response: cashtocode::CashtocodePaymentsSyncResponse {}, + response, data: data.clone(), http_code: res.status_code, }) @@ -359,9 +363,9 @@ impl api::IncomingWebhook for Cashtocode { &self, request: &api::IncomingWebhookRequestDetails<'_>, ) -> CustomResult { - let webhook: transformers::CashtocodeObjectId = request + let webhook: transformers::CashtocodePaymentsSyncResponse = request .body - .parse_struct("CashtocodeObjectId") + .parse_struct("CashtocodePaymentsSyncResponse") .change_context(errors::ConnectorError::WebhookReferenceIdNotFound)?; Ok(api_models::webhooks::ObjectReferenceId::PaymentId( @@ -397,9 +401,9 @@ impl api::IncomingWebhook for Cashtocode { ) -> CustomResult, errors::ConnectorError> { let status = "EXECUTED".to_string(); - let obj: transformers::CashtocodeObjectId = request + let obj: transformers::CashtocodePaymentsSyncResponse = request .body - .parse_struct("CashtocodeObjectId") + .parse_struct("CashtocodePaymentsSyncResponse") .change_context(errors::ConnectorError::WebhookReferenceIdNotFound)?; let response: serde_json::Value = serde_json::json!({ "status": status, "transactionId" : obj.transaction_id}); diff --git a/crates/router/src/connector/cashtocode/transformers.rs b/crates/router/src/connector/cashtocode/transformers.rs index e8bfe75224..bd899a8c78 100644 --- a/crates/router/src/connector/cashtocode/transformers.rs +++ b/crates/router/src/connector/cashtocode/transformers.rs @@ -123,13 +123,25 @@ pub struct CashtocodeErrors { pub event_type: String, } -#[derive(Debug, Clone, Deserialize)] +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub enum CashtocodePaymentsResponse { + CashtoCodeError(CashtocodeErrorResponse), + CashtoCodeData(CashtocodePaymentsResponseData), +} + +#[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct CashtocodePaymentsResponse { +pub struct CashtocodePaymentsResponseData { pub pay_url: String, } -pub struct CashtocodePaymentsSyncResponse {} +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CashtocodePaymentsSyncResponse { + pub transaction_id: String, + pub amount: i64, +} impl TryFrom< @@ -145,23 +157,41 @@ impl types::PaymentsResponseData, >, ) -> Result { - let redirection_data = services::RedirectForm::Form { - endpoint: item.response.pay_url.clone(), - method: services::Method::Post, - form_fields: Default::default(), + let (status, response) = match item.response { + CashtocodePaymentsResponse::CashtoCodeError(error_data) => ( + enums::AttemptStatus::Failure, + Err(types::ErrorResponse { + code: error_data.error.to_string(), + status_code: item.http_code, + message: error_data.error_description, + reason: None, + }), + ), + CashtocodePaymentsResponse::CashtoCodeData(response_data) => { + let redirection_data = services::RedirectForm::Form { + endpoint: response_data.pay_url, + method: services::Method::Post, + form_fields: Default::default(), + }; + ( + enums::AttemptStatus::AuthenticationPending, + Ok(types::PaymentsResponseData::TransactionResponse { + resource_id: types::ResponseId::ConnectorTransactionId( + item.data.attempt_id.clone(), + ), + redirection_data: Some(redirection_data), + mandate_reference: None, + connector_metadata: None, + network_txn_id: None, + connector_response_reference_id: None, + }), + ) + } }; + Ok(Self { - status: enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - item.data.attempt_id.clone(), - ), - redirection_data: Some(redirection_data), - mandate_reference: None, - connector_metadata: None, - network_txn_id: None, - connector_response_reference_id: None, - }), + status, + response, ..item.data }) } @@ -198,6 +228,7 @@ impl network_txn_id: None, connector_response_reference_id: None, }), + amount_captured: Some(item.response.amount), ..item.data }) } @@ -205,7 +236,7 @@ impl #[derive(Debug, Deserialize)] pub struct CashtocodeErrorResponse { - pub error: String, + pub error: u32, pub error_description: String, pub errors: Option>, } @@ -220,9 +251,3 @@ pub struct CashtocodeIncomingWebhook { pub event_type: String, pub transaction_id: String, } - -#[derive(Debug, Clone, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct CashtocodeObjectId { - pub transaction_id: String, -}