Skip to content

Commit fee0e9d

Browse files
authored
feat(connector): add payment, refund urls for dummy connector (#1084)
1 parent 822fc69 commit fee0e9d

File tree

3 files changed

+91
-46
lines changed

3 files changed

+91
-46
lines changed

crates/router/src/connector/dummyconnector.rs

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ mod transformers;
22

33
use std::fmt::Debug;
44

5+
use api_models::payments::PaymentMethodData;
56
use error_stack::{IntoReport, ResultExt};
67
use transformers as dummyconnector;
78

9+
use super::utils::{PaymentsAuthorizeRequestData, RefundsRequestData};
810
use crate::{
911
configs::settings,
1012
core::errors::{self, CustomResult},
@@ -96,9 +98,9 @@ impl ConnectorCommon for DummyConnector {
9698

9799
Ok(ErrorResponse {
98100
status_code: res.status_code,
99-
code: response.code,
100-
message: response.message,
101-
reason: response.reason,
101+
code: response.error.code,
102+
message: response.error.message,
103+
reason: response.error.reason,
102104
})
103105
}
104106
}
@@ -136,10 +138,22 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
136138

137139
fn get_url(
138140
&self,
139-
_req: &types::PaymentsAuthorizeRouterData,
140-
_connectors: &settings::Connectors,
141+
req: &types::PaymentsAuthorizeRouterData,
142+
connectors: &settings::Connectors,
141143
) -> CustomResult<String, errors::ConnectorError> {
142-
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
144+
let payment_method_data = req.request.payment_method_data.to_owned();
145+
let payment_method_type = req.request.get_payment_method_type()?;
146+
match payment_method_data {
147+
PaymentMethodData::Card(_) => Ok(format!("{}/payment", self.base_url(connectors))),
148+
_ => Err(error_stack::report!(errors::ConnectorError::NotSupported {
149+
message: format!(
150+
"The payment method {} is not supported",
151+
payment_method_type
152+
),
153+
connector: "dummyconnector",
154+
payment_experience: api::enums::PaymentExperience::RedirectToUrl.to_string(),
155+
})),
156+
}
143157
}
144158

145159
fn get_request_body(
@@ -180,7 +194,7 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
180194
data: &types::PaymentsAuthorizeRouterData,
181195
res: Response,
182196
) -> CustomResult<types::PaymentsAuthorizeRouterData, errors::ConnectorError> {
183-
let response: dummyconnector::DummyConnectorPaymentsResponse = res
197+
let response: dummyconnector::PaymentsResponse = res
184198
.response
185199
.parse_struct("DummyConnector PaymentsAuthorizeResponse")
186200
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
@@ -217,10 +231,23 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe
217231

218232
fn get_url(
219233
&self,
220-
_req: &types::PaymentsSyncRouterData,
221-
_connectors: &settings::Connectors,
234+
req: &types::PaymentsSyncRouterData,
235+
connectors: &settings::Connectors,
222236
) -> CustomResult<String, errors::ConnectorError> {
223-
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
237+
match req
238+
.request
239+
.connector_transaction_id
240+
.get_connector_transaction_id()
241+
{
242+
Ok(transaction_id) => Ok(format!(
243+
"{}/payments/{}",
244+
self.base_url(connectors),
245+
transaction_id
246+
)),
247+
Err(_) => Err(error_stack::report!(
248+
errors::ConnectorError::MissingConnectorTransactionID
249+
)),
250+
}
224251
}
225252

226253
fn build_request(
@@ -243,7 +270,7 @@ impl ConnectorIntegration<api::PSync, types::PaymentsSyncData, types::PaymentsRe
243270
data: &types::PaymentsSyncRouterData,
244271
res: Response,
245272
) -> CustomResult<types::PaymentsSyncRouterData, errors::ConnectorError> {
246-
let response: dummyconnector::DummyConnectorPaymentsResponse = res
273+
let response: dummyconnector::PaymentsResponse = res
247274
.response
248275
.parse_struct("dummyconnector PaymentsSyncResponse")
249276
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
@@ -315,7 +342,7 @@ impl ConnectorIntegration<api::Capture, types::PaymentsCaptureData, types::Payme
315342
data: &types::PaymentsCaptureRouterData,
316343
res: Response,
317344
) -> CustomResult<types::PaymentsCaptureRouterData, errors::ConnectorError> {
318-
let response: dummyconnector::DummyConnectorPaymentsResponse = res
345+
let response: dummyconnector::PaymentsResponse = res
319346
.response
320347
.parse_struct("DummyConnector PaymentsCaptureResponse")
321348
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
@@ -357,10 +384,14 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
357384

358385
fn get_url(
359386
&self,
360-
_req: &types::RefundsRouterData<api::Execute>,
361-
_connectors: &settings::Connectors,
387+
req: &types::RefundsRouterData<api::Execute>,
388+
connectors: &settings::Connectors,
362389
) -> CustomResult<String, errors::ConnectorError> {
363-
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
390+
Ok(format!(
391+
"{}/{}/refund",
392+
self.base_url(connectors),
393+
req.request.connector_transaction_id
394+
))
364395
}
365396

366397
fn get_request_body(
@@ -435,10 +466,15 @@ impl ConnectorIntegration<api::RSync, types::RefundsData, types::RefundsResponse
435466

436467
fn get_url(
437468
&self,
438-
_req: &types::RefundSyncRouterData,
439-
_connectors: &settings::Connectors,
469+
req: &types::RefundSyncRouterData,
470+
connectors: &settings::Connectors,
440471
) -> CustomResult<String, errors::ConnectorError> {
441-
Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
472+
let refund_id = req.request.get_connector_refund_id()?;
473+
Ok(format!(
474+
"{}/refunds/{}",
475+
self.base_url(connectors),
476+
refund_id
477+
))
442478
}
443479

444480
fn build_request(

crates/router/src/connector/dummyconnector/transformers.rs

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
use masking::Secret;
22
use serde::{Deserialize, Serialize};
3+
use storage_models::enums::Currency;
34

45
use crate::{
56
connector::utils::PaymentsAuthorizeRequestData,
67
core::errors,
78
types::{self, api, storage::enums},
89
};
910

10-
//TODO: Fill the struct with respective fields
11-
#[derive(Default, Debug, Serialize, Eq, PartialEq)]
11+
#[derive(Debug, Serialize, Eq, PartialEq)]
1212
pub struct DummyConnectorPaymentsRequest {
1313
amount: i64,
14-
card: DummyConnectorCard,
14+
currency: Currency,
15+
payment_method_data: PaymentMethodData,
1516
}
1617

17-
#[derive(Default, Debug, Serialize, Eq, PartialEq)]
18+
#[derive(Debug, serde::Serialize, Eq, PartialEq)]
19+
pub enum PaymentMethodData {
20+
Card(DummyConnectorCard),
21+
}
22+
23+
#[derive(Debug, Serialize, Eq, PartialEq)]
1824
pub struct DummyConnectorCard {
1925
name: Secret<String>,
2026
number: cards::CardNumber,
@@ -39,15 +45,15 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for DummyConnectorPaymentsRequ
3945
};
4046
Ok(Self {
4147
amount: item.request.amount,
42-
card,
48+
currency: item.request.currency,
49+
payment_method_data: PaymentMethodData::Card(card),
4350
})
4451
}
4552
_ => Err(errors::ConnectorError::NotImplemented("Payment methods".to_string()).into()),
4653
}
4754
}
4855
}
4956

50-
//TODO: Fill the struct with respective fields
5157
// Auth Struct
5258
pub struct DummyConnectorAuthType {
5359
pub(super) api_key: String,
@@ -85,31 +91,22 @@ impl From<DummyConnectorPaymentStatus> for enums::AttemptStatus {
8591
}
8692
}
8793

88-
//TODO: Fill the struct with respective fields
8994
#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
90-
pub struct DummyConnectorPaymentsResponse {
95+
pub struct PaymentsResponse {
9196
status: DummyConnectorPaymentStatus,
9297
id: String,
98+
amount: i64,
99+
currency: Currency,
100+
created: String,
101+
payment_method_type: String,
93102
}
94103

95-
impl<F, T>
96-
TryFrom<
97-
types::ResponseRouterData<
98-
F,
99-
DummyConnectorPaymentsResponse,
100-
T,
101-
types::PaymentsResponseData,
102-
>,
103-
> for types::RouterData<F, T, types::PaymentsResponseData>
104+
impl<F, T> TryFrom<types::ResponseRouterData<F, PaymentsResponse, T, types::PaymentsResponseData>>
105+
for types::RouterData<F, T, types::PaymentsResponseData>
104106
{
105107
type Error = error_stack::Report<errors::ConnectorError>;
106108
fn try_from(
107-
item: types::ResponseRouterData<
108-
F,
109-
DummyConnectorPaymentsResponse,
110-
T,
111-
types::PaymentsResponseData,
112-
>,
109+
item: types::ResponseRouterData<F, PaymentsResponse, T, types::PaymentsResponseData>,
113110
) -> Result<Self, Self::Error> {
114111
Ok(Self {
115112
status: enums::AttemptStatus::from(item.response.status),
@@ -125,7 +122,6 @@ impl<F, T>
125122
}
126123
}
127124

128-
//TODO: Fill the struct with respective fields
129125
// REFUND :
130126
// Type definition for RefundRequest
131127
#[derive(Default, Debug, Serialize)]
@@ -137,7 +133,7 @@ impl<F> TryFrom<&types::RefundsRouterData<F>> for DummyConnectorRefundRequest {
137133
type Error = error_stack::Report<errors::ConnectorError>;
138134
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
139135
Ok(Self {
140-
amount: item.request.amount,
136+
amount: item.request.refund_amount,
141137
})
142138
}
143139
}
@@ -146,6 +142,7 @@ impl<F> TryFrom<&types::RefundsRouterData<F>> for DummyConnectorRefundRequest {
146142

147143
#[allow(dead_code)]
148144
#[derive(Debug, Serialize, Default, Deserialize, Clone)]
145+
#[serde(rename_all = "lowercase")]
149146
pub enum RefundStatus {
150147
Succeeded,
151148
Failed,
@@ -164,11 +161,14 @@ impl From<RefundStatus> for enums::RefundStatus {
164161
}
165162
}
166163

167-
//TODO: Fill the struct with respective fields
168164
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
169165
pub struct RefundResponse {
170166
id: String,
171167
status: RefundStatus,
168+
currency: Currency,
169+
created: String,
170+
payment_amount: i64,
171+
refund_amount: i64,
172172
}
173173

174174
impl TryFrom<types::RefundsResponseRouterData<api::Execute, RefundResponse>>
@@ -205,10 +205,13 @@ impl TryFrom<types::RefundsResponseRouterData<api::RSync, RefundResponse>>
205205
}
206206
}
207207

208-
//TODO: Fill the struct with respective fields
209208
#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
210209
pub struct DummyConnectorErrorResponse {
211-
pub status_code: u16,
210+
pub error: ErrorData,
211+
}
212+
213+
#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
214+
pub struct ErrorData {
212215
pub code: String,
213216
pub message: String,
214217
pub reason: Option<String>,

crates/router/src/connector/utils.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ pub trait PaymentsAuthorizeRequestData {
170170
fn is_mandate_payment(&self) -> bool;
171171
fn get_webhook_url(&self) -> Result<String, Error>;
172172
fn get_router_return_url(&self) -> Result<String, Error>;
173+
fn get_payment_method_type(&self) -> Result<storage_models::enums::PaymentMethodType, Error>;
173174
}
174175

175176
impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
@@ -233,6 +234,11 @@ impl PaymentsAuthorizeRequestData for types::PaymentsAuthorizeData {
233234
.clone()
234235
.ok_or_else(missing_field_err("webhook_url"))
235236
}
237+
fn get_payment_method_type(&self) -> Result<storage_models::enums::PaymentMethodType, Error> {
238+
self.payment_method_type
239+
.to_owned()
240+
.ok_or_else(missing_field_err("payment_method_type"))
241+
}
236242
}
237243

238244
pub trait BrowserInformationData {

0 commit comments

Comments
 (0)