Skip to content

Commit 76a1556

Browse files
committed
Merge branch 'main' of github.com:juspay/hyperswitch into add-metrics-router
* 'main' of github.com:juspay/hyperswitch: fix(payment_link): added expires_on in payment response (#3332) fix(connector_onboarding): Check if connector exists for the merchant account and add reset tracking id API (#3229) chore(version): 2024.01.12.1 chore: add api reference for blocklist (#3336)
2 parents 8807bde + 5ad3f89 commit 76a1556

20 files changed

+530
-60
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ All notable changes to HyperSwitch will be documented here.
44

55
- - -
66

7+
## 2024.01.12.1
8+
9+
### Miscellaneous Tasks
10+
11+
- **config:** Add merchant_secret config for webhooks for cashtocode and volt in wasm dashboard ([#3333](https://github.com/juspay/hyperswitch/pull/3333)) ([`57f2cff`](https://github.com/juspay/hyperswitch/commit/57f2cff75e58b0a7811492a1fdb636f59dcefbd0))
12+
- Add api reference for blocklist ([#3336](https://github.com/juspay/hyperswitch/pull/3336)) ([`f381d86`](https://github.com/juspay/hyperswitch/commit/f381d86b7c9fa79d632991c74cab53d0181231c6))
13+
14+
**Full Changelog:** [`2024.01.12.0...2024.01.12.1`](https://github.com/juspay/hyperswitch/compare/2024.01.12.0...2024.01.12.1)
15+
16+
- - -
17+
718
## 2024.01.12.0
819

920
### Features

crates/api_models/src/blocklist.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use common_enums::enums;
22
use common_utils::events::ApiEventMetric;
3+
use utoipa::ToSchema;
34

4-
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
5+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
56
#[serde(rename_all = "snake_case", tag = "type", content = "data")]
67
pub enum BlocklistRequest {
78
CardBin(String),
@@ -12,9 +13,10 @@ pub enum BlocklistRequest {
1213
pub type AddToBlocklistRequest = BlocklistRequest;
1314
pub type DeleteFromBlocklistRequest = BlocklistRequest;
1415

15-
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
16+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
1617
pub struct BlocklistResponse {
1718
pub fingerprint_id: String,
19+
#[schema(value_type = BlocklistDataKind)]
1820
pub data_kind: enums::BlocklistDataKind,
1921
#[serde(with = "common_utils::custom_serde::iso8601")]
2022
pub created_at: time::PrimitiveDateTime,
@@ -23,8 +25,9 @@ pub struct BlocklistResponse {
2325
pub type AddToBlocklistResponse = BlocklistResponse;
2426
pub type DeleteFromBlocklistResponse = BlocklistResponse;
2527

26-
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
28+
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)]
2729
pub struct ListBlocklistQuery {
30+
#[schema(value_type = BlocklistDataKind)]
2831
pub data_kind: enums::BlocklistDataKind,
2932
#[serde(default = "default_list_limit")]
3033
pub limit: u16,

crates/api_models/src/connector_onboarding.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,9 @@ pub struct PayPalOnboardingDone {
5252
pub struct PayPalIntegrationDone {
5353
pub connector_id: String,
5454
}
55+
56+
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone)]
57+
pub struct ResetTrackingIdRequest {
58+
pub connector_id: String,
59+
pub connector: enums::Connector,
60+
}

crates/api_models/src/events/connector_onboarding.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ use common_utils::events::{ApiEventMetric, ApiEventsType};
22

33
use crate::connector_onboarding::{
44
ActionUrlRequest, ActionUrlResponse, OnboardingStatus, OnboardingSyncRequest,
5+
ResetTrackingIdRequest,
56
};
67

78
common_utils::impl_misc_api_event_type!(
89
ActionUrlRequest,
910
ActionUrlResponse,
1011
OnboardingSyncRequest,
11-
OnboardingStatus
12+
OnboardingStatus,
13+
ResetTrackingIdRequest
1214
);

crates/api_models/src/payments.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,11 @@ pub struct PaymentsResponse {
22772277
/// List of incremental authorizations happened to the payment
22782278
pub incremental_authorizations: Option<Vec<IncrementalAuthorizationResponse>>,
22792279

2280+
/// Date Time expiry of the payment
2281+
#[schema(example = "2022-09-10T10:11:12Z")]
2282+
#[serde(default, with = "common_utils::custom_serde::iso8601::option")]
2283+
pub expires_on: Option<PrimitiveDateTime>,
2284+
22802285
/// Payment Fingerprint
22812286
pub fingerprint: Option<String>,
22822287
}

crates/router/src/consts.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ pub const VERIFY_CONNECTOR_ID_PREFIX: &str = "conn_verify";
7777
#[cfg(feature = "olap")]
7878
pub const VERIFY_CONNECTOR_MERCHANT_ID: &str = "test_merchant";
7979

80+
#[cfg(feature = "olap")]
81+
pub const CONNECTOR_ONBOARDING_CONFIG_PREFIX: &str = "onboarding";
82+
8083
/// Max payment session expiry
8184
pub const MAX_SESSION_EXPIRY: u32 = 7890000;
8285

crates/router/src/core/connector_onboarding.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use api_models::{connector_onboarding as api, enums};
2-
use error_stack::ResultExt;
32
use masking::Secret;
43

54
use crate::{
@@ -19,16 +18,23 @@ pub trait AccessToken {
1918

2019
pub async fn get_action_url(
2120
state: AppState,
21+
user_from_token: auth::UserFromToken,
2222
request: api::ActionUrlRequest,
2323
) -> RouterResponse<api::ActionUrlResponse> {
24+
utils::check_if_connector_exists(&state, &request.connector_id, &user_from_token.merchant_id)
25+
.await?;
26+
2427
let connector_onboarding_conf = state.conf.connector_onboarding.clone();
2528
let is_enabled = utils::is_enabled(request.connector, &connector_onboarding_conf);
29+
let tracking_id =
30+
utils::get_tracking_id_from_configs(&state, &request.connector_id, request.connector)
31+
.await?;
2632

2733
match (is_enabled, request.connector) {
2834
(Some(true), enums::Connector::Paypal) => {
2935
let action_url = Box::pin(paypal::get_action_url_from_paypal(
3036
state,
31-
request.connector_id,
37+
tracking_id,
3238
request.return_url,
3339
))
3440
.await?;
@@ -49,40 +55,42 @@ pub async fn sync_onboarding_status(
4955
user_from_token: auth::UserFromToken,
5056
request: api::OnboardingSyncRequest,
5157
) -> RouterResponse<api::OnboardingStatus> {
52-
let merchant_account = user_from_token
53-
.get_merchant_account(state.clone())
54-
.await
55-
.change_context(ApiErrorResponse::MerchantAccountNotFound)?;
58+
utils::check_if_connector_exists(&state, &request.connector_id, &user_from_token.merchant_id)
59+
.await?;
60+
5661
let connector_onboarding_conf = state.conf.connector_onboarding.clone();
5762
let is_enabled = utils::is_enabled(request.connector, &connector_onboarding_conf);
63+
let tracking_id =
64+
utils::get_tracking_id_from_configs(&state, &request.connector_id, request.connector)
65+
.await?;
5866

5967
match (is_enabled, request.connector) {
6068
(Some(true), enums::Connector::Paypal) => {
6169
let status = Box::pin(paypal::sync_merchant_onboarding_status(
6270
state.clone(),
63-
request.connector_id.clone(),
71+
tracking_id,
6472
))
6573
.await?;
6674
if let api::OnboardingStatus::PayPal(api::PayPalOnboardingStatus::Success(
67-
ref inner_data,
75+
ref paypal_onboarding_data,
6876
)) = status
6977
{
7078
let connector_onboarding_conf = state.conf.connector_onboarding.clone();
7179
let auth_details = oss_types::ConnectorAuthType::SignatureKey {
7280
api_key: connector_onboarding_conf.paypal.client_secret,
7381
key1: connector_onboarding_conf.paypal.client_id,
74-
api_secret: Secret::new(inner_data.payer_id.clone()),
82+
api_secret: Secret::new(paypal_onboarding_data.payer_id.clone()),
7583
};
76-
let some_data = paypal::update_mca(
84+
let update_mca_data = paypal::update_mca(
7785
&state,
78-
&merchant_account,
86+
user_from_token.merchant_id,
7987
request.connector_id.to_owned(),
8088
auth_details,
8189
)
8290
.await?;
8391

8492
return Ok(ApplicationResponse::Json(api::OnboardingStatus::PayPal(
85-
api::PayPalOnboardingStatus::ConnectorIntegrated(some_data),
93+
api::PayPalOnboardingStatus::ConnectorIntegrated(update_mca_data),
8694
)));
8795
}
8896
Ok(ApplicationResponse::Json(status))
@@ -94,3 +102,15 @@ pub async fn sync_onboarding_status(
94102
.into()),
95103
}
96104
}
105+
106+
pub async fn reset_tracking_id(
107+
state: AppState,
108+
user_from_token: auth::UserFromToken,
109+
request: api::ResetTrackingIdRequest,
110+
) -> RouterResponse<()> {
111+
utils::check_if_connector_exists(&state, &request.connector_id, &user_from_token.merchant_id)
112+
.await?;
113+
utils::set_tracking_id_in_configs(&state, &request.connector_id, request.connector).await?;
114+
115+
Ok(ApplicationResponse::StatusOk)
116+
}

crates/router/src/core/connector_onboarding/paypal.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ fn build_referral_url(state: AppState) -> String {
2323

2424
async fn build_referral_request(
2525
state: AppState,
26-
connector_id: String,
26+
tracking_id: String,
2727
return_url: String,
2828
) -> RouterResult<Request> {
2929
let access_token = utils::paypal::generate_access_token(state.clone()).await?;
30-
let request_body = types::paypal::PartnerReferralRequest::new(connector_id, return_url);
30+
let request_body = types::paypal::PartnerReferralRequest::new(tracking_id, return_url);
3131

3232
utils::paypal::build_paypal_post_request(
3333
build_referral_url(state),
@@ -38,12 +38,12 @@ async fn build_referral_request(
3838

3939
pub async fn get_action_url_from_paypal(
4040
state: AppState,
41-
connector_id: String,
41+
tracking_id: String,
4242
return_url: String,
4343
) -> RouterResult<String> {
4444
let referral_request = Box::pin(build_referral_request(
4545
state.clone(),
46-
connector_id,
46+
tracking_id,
4747
return_url,
4848
))
4949
.await?;
@@ -137,7 +137,7 @@ async fn find_paypal_merchant_by_tracking_id(
137137

138138
pub async fn update_mca(
139139
state: &AppState,
140-
merchant_account: &oss_types::domain::MerchantAccount,
140+
merchant_id: String,
141141
connector_id: String,
142142
auth_details: oss_types::ConnectorAuthType,
143143
) -> RouterResult<oss_api_types::MerchantConnectorResponse> {
@@ -159,13 +159,9 @@ pub async fn update_mca(
159159
connector_webhook_details: None,
160160
pm_auth_config: None,
161161
};
162-
let mca_response = admin::update_payment_connector(
163-
state.clone(),
164-
&merchant_account.merchant_id,
165-
&connector_id,
166-
request,
167-
)
168-
.await?;
162+
let mca_response =
163+
admin::update_payment_connector(state.clone(), &merchant_id, &connector_id, request)
164+
.await?;
169165

170166
match mca_response {
171167
ApplicationResponse::Json(mca_data) => Ok(mca_data),

crates/router/src/core/payments/transformers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ where
709709
.set_fingerprint(payment_intent.fingerprint_id)
710710
.set_authorization_count(payment_intent.authorization_count)
711711
.set_incremental_authorizations(incremental_authorizations_response)
712+
.set_expires_on(payment_intent.session_expiry)
712713
.to_owned(),
713714
headers,
714715
))
@@ -775,6 +776,7 @@ where
775776
incremental_authorization_allowed: payment_intent.incremental_authorization_allowed,
776777
authorization_count: payment_intent.authorization_count,
777778
incremental_authorizations: incremental_authorizations_response,
779+
expires_on: payment_intent.session_expiry,
778780
..Default::default()
779781
},
780782
headers,

crates/router/src/db/blocklist.rs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -163,41 +163,49 @@ impl BlocklistInterface for KafkaStore {
163163
#[instrument(skip_all)]
164164
async fn insert_blocklist_entry(
165165
&self,
166-
_pm_blocklist: storage::BlocklistNew,
166+
pm_blocklist: storage::BlocklistNew,
167167
) -> CustomResult<storage::Blocklist, errors::StorageError> {
168-
Err(errors::StorageError::KafkaError)?
168+
self.diesel_store.insert_blocklist_entry(pm_blocklist).await
169169
}
170170

171171
async fn find_blocklist_entry_by_merchant_id_fingerprint_id(
172172
&self,
173-
_merchant_id: &str,
174-
_fingerprint_id: &str,
173+
merchant_id: &str,
174+
fingerprint: &str,
175175
) -> CustomResult<storage::Blocklist, errors::StorageError> {
176-
Err(errors::StorageError::KafkaError)?
176+
self.diesel_store
177+
.find_blocklist_entry_by_merchant_id_fingerprint_id(merchant_id, fingerprint)
178+
.await
177179
}
178180

179181
async fn delete_blocklist_entry_by_merchant_id_fingerprint_id(
180182
&self,
181-
_merchant_id: &str,
182-
_fingerprint_id: &str,
183+
merchant_id: &str,
184+
fingerprint: &str,
183185
) -> CustomResult<storage::Blocklist, errors::StorageError> {
184-
Err(errors::StorageError::KafkaError)?
186+
self.diesel_store
187+
.delete_blocklist_entry_by_merchant_id_fingerprint_id(merchant_id, fingerprint)
188+
.await
185189
}
186190

187191
async fn list_blocklist_entries_by_merchant_id_data_kind(
188192
&self,
189-
_merchant_id: &str,
190-
_data_kind: common_enums::BlocklistDataKind,
191-
_limit: i64,
192-
_offset: i64,
193+
merchant_id: &str,
194+
data_kind: common_enums::BlocklistDataKind,
195+
limit: i64,
196+
offset: i64,
193197
) -> CustomResult<Vec<storage::Blocklist>, errors::StorageError> {
194-
Err(errors::StorageError::KafkaError)?
198+
self.diesel_store
199+
.list_blocklist_entries_by_merchant_id_data_kind(merchant_id, data_kind, limit, offset)
200+
.await
195201
}
196202

197203
async fn list_blocklist_entries_by_merchant_id(
198204
&self,
199-
_merchant_id: &str,
205+
merchant_id: &str,
200206
) -> CustomResult<Vec<storage::Blocklist>, errors::StorageError> {
201-
Err(errors::StorageError::KafkaError)?
207+
self.diesel_store
208+
.list_blocklist_entries_by_merchant_id(merchant_id)
209+
.await
202210
}
203211
}

0 commit comments

Comments
 (0)