mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +08:00
fix: add fallback to reverselookup error (#3025)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
use api_models::enums::{AuthenticationType, Connector, PaymentMethod, PaymentMethodType};
|
||||
use common_utils::errors::CustomResult;
|
||||
use common_utils::{errors::CustomResult, fallback_reverse_lookup_not_found};
|
||||
use data_models::{
|
||||
errors,
|
||||
mandates::{MandateAmountData, MandateDataType},
|
||||
@ -399,6 +399,20 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
},
|
||||
};
|
||||
|
||||
//Reverse lookup for attempt_id
|
||||
let reverse_lookup = ReverseLookupNew {
|
||||
lookup_id: format!(
|
||||
"pa_{}_{}",
|
||||
&created_attempt.merchant_id, &created_attempt.attempt_id,
|
||||
),
|
||||
pk_id: key.clone(),
|
||||
sk_id: field.clone(),
|
||||
source: "payment_attempt".to_string(),
|
||||
updated_by: storage_scheme.to_string(),
|
||||
};
|
||||
self.insert_reverse_lookup(reverse_lookup, storage_scheme)
|
||||
.await?;
|
||||
|
||||
match kv_wrapper::<PaymentAttempt, _, _>(
|
||||
self,
|
||||
KvOperation::HSetNx(
|
||||
@ -417,23 +431,7 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
key: Some(key),
|
||||
})
|
||||
.into_report(),
|
||||
Ok(HsetnxReply::KeySet) => {
|
||||
//Reverse lookup for attempt_id
|
||||
let reverse_lookup = ReverseLookupNew {
|
||||
lookup_id: format!(
|
||||
"{}_{}",
|
||||
&created_attempt.merchant_id, &created_attempt.attempt_id,
|
||||
),
|
||||
pk_id: key,
|
||||
sk_id: field,
|
||||
source: "payment_attempt".to_string(),
|
||||
updated_by: storage_scheme.to_string(),
|
||||
};
|
||||
self.insert_reverse_lookup(reverse_lookup, storage_scheme)
|
||||
.await?;
|
||||
|
||||
Ok(created_attempt)
|
||||
}
|
||||
Ok(HsetnxReply::KeySet) => Ok(created_attempt),
|
||||
Err(error) => Err(error.change_context(errors::StorageError::KVError)),
|
||||
}
|
||||
}
|
||||
@ -480,16 +478,6 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
},
|
||||
};
|
||||
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<DieselPaymentAttempt>((&field, redis_value), redis_entry),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
match (
|
||||
old_connector_transaction_id,
|
||||
&updated_attempt.connector_transaction_id,
|
||||
@ -549,6 +537,16 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
(_, _) => {}
|
||||
}
|
||||
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<DieselPaymentAttempt>((&field, redis_value), redis_entry),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(updated_attempt)
|
||||
}
|
||||
}
|
||||
@ -574,10 +572,20 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
}
|
||||
MerchantStorageScheme::RedisKv => {
|
||||
// We assume that PaymentAttempt <=> PaymentIntent is a one-to-one relation for now
|
||||
let lookup_id = format!("conn_trans_{merchant_id}_{connector_transaction_id}");
|
||||
let lookup = self
|
||||
.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await?;
|
||||
let lookup_id = format!("pa_conn_trans_{merchant_id}_{connector_transaction_id}");
|
||||
let lookup = fallback_reverse_lookup_not_found!(
|
||||
self.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await,
|
||||
self.router_store
|
||||
.find_payment_attempt_by_connector_transaction_id_payment_id_merchant_id(
|
||||
connector_transaction_id,
|
||||
payment_id,
|
||||
merchant_id,
|
||||
storage_scheme,
|
||||
)
|
||||
.await
|
||||
);
|
||||
|
||||
let key = &lookup.pk_id;
|
||||
|
||||
Box::pin(try_redis_get_else_try_database_get(
|
||||
@ -707,10 +715,18 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
.await
|
||||
}
|
||||
MerchantStorageScheme::RedisKv => {
|
||||
let lookup_id = format!("{merchant_id}_{connector_txn_id}");
|
||||
let lookup = self
|
||||
.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await?;
|
||||
let lookup_id = format!("pa_conn_trans_{merchant_id}_{connector_txn_id}");
|
||||
let lookup = fallback_reverse_lookup_not_found!(
|
||||
self.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await,
|
||||
self.router_store
|
||||
.find_payment_attempt_by_merchant_id_connector_txn_id(
|
||||
merchant_id,
|
||||
connector_txn_id,
|
||||
storage_scheme,
|
||||
)
|
||||
.await
|
||||
);
|
||||
|
||||
let key = &lookup.pk_id;
|
||||
Box::pin(try_redis_get_else_try_database_get(
|
||||
@ -799,10 +815,19 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
.await
|
||||
}
|
||||
MerchantStorageScheme::RedisKv => {
|
||||
let lookup_id = format!("{merchant_id}_{attempt_id}");
|
||||
let lookup = self
|
||||
.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await?;
|
||||
let lookup_id = format!("pa_{merchant_id}_{attempt_id}");
|
||||
let lookup = fallback_reverse_lookup_not_found!(
|
||||
self.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await,
|
||||
self.router_store
|
||||
.find_payment_attempt_by_attempt_id_merchant_id(
|
||||
attempt_id,
|
||||
merchant_id,
|
||||
storage_scheme,
|
||||
)
|
||||
.await
|
||||
);
|
||||
|
||||
let key = &lookup.pk_id;
|
||||
Box::pin(try_redis_get_else_try_database_get(
|
||||
async {
|
||||
@ -846,10 +871,18 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
|
||||
.await
|
||||
}
|
||||
MerchantStorageScheme::RedisKv => {
|
||||
let lookup_id = format!("preprocessing_{merchant_id}_{preprocessing_id}");
|
||||
let lookup = self
|
||||
.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await?;
|
||||
let lookup_id = format!("pa_preprocessing_{merchant_id}_{preprocessing_id}");
|
||||
let lookup = fallback_reverse_lookup_not_found!(
|
||||
self.get_lookup_by_lookup_id(&lookup_id, storage_scheme)
|
||||
.await,
|
||||
self.router_store
|
||||
.find_payment_attempt_by_preprocessing_id_merchant_id(
|
||||
preprocessing_id,
|
||||
merchant_id,
|
||||
storage_scheme,
|
||||
)
|
||||
.await
|
||||
);
|
||||
let key = &lookup.pk_id;
|
||||
|
||||
Box::pin(try_redis_get_else_try_database_get(
|
||||
@ -1757,7 +1790,7 @@ async fn add_connector_txn_id_to_reverse_lookup<T: DatabaseStore>(
|
||||
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||
let field = format!("pa_{}", updated_attempt_attempt_id);
|
||||
let reverse_lookup_new = ReverseLookupNew {
|
||||
lookup_id: format!("conn_trans_{}_{}", merchant_id, connector_transaction_id),
|
||||
lookup_id: format!("pa_conn_trans_{}_{}", merchant_id, connector_transaction_id),
|
||||
pk_id: key.to_owned(),
|
||||
sk_id: field.clone(),
|
||||
source: "payment_attempt".to_string(),
|
||||
@ -1779,7 +1812,7 @@ async fn add_preprocessing_id_to_reverse_lookup<T: DatabaseStore>(
|
||||
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||
let field = format!("pa_{}", updated_attempt_attempt_id);
|
||||
let reverse_lookup_new = ReverseLookupNew {
|
||||
lookup_id: format!("preprocessing_{}_{}", merchant_id, preprocessing_id),
|
||||
lookup_id: format!("pa_preprocessing_{}_{}", merchant_id, preprocessing_id),
|
||||
pk_id: key.to_owned(),
|
||||
sk_id: field.clone(),
|
||||
source: "payment_attempt".to_string(),
|
||||
|
||||
@ -494,12 +494,13 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
|
||||
.map(PaymentIntent::from_storage_model)
|
||||
.collect::<Vec<PaymentIntent>>()
|
||||
})
|
||||
.into_report()
|
||||
.map_err(|er| {
|
||||
let new_err = StorageError::DatabaseError(format!("{er:?}"));
|
||||
er.change_context(new_err)
|
||||
StorageError::DatabaseError(
|
||||
error_stack::report!(diesel_models::errors::DatabaseError::from(er))
|
||||
.attach_printable("Error filtering payment records"),
|
||||
)
|
||||
})
|
||||
.attach_printable_lazy(|| "Error filtering records by predicate")
|
||||
.into_report()
|
||||
}
|
||||
|
||||
#[cfg(feature = "olap")]
|
||||
@ -646,12 +647,13 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
|
||||
})
|
||||
.collect()
|
||||
})
|
||||
.into_report()
|
||||
.map_err(|er| {
|
||||
let new_er = StorageError::DatabaseError(format!("{er:?}"));
|
||||
er.change_context(new_er)
|
||||
StorageError::DatabaseError(
|
||||
error_stack::report!(diesel_models::errors::DatabaseError::from(er))
|
||||
.attach_printable("Error filtering payment records"),
|
||||
)
|
||||
})
|
||||
.attach_printable("Error filtering payment records")
|
||||
.into_report()
|
||||
}
|
||||
|
||||
#[cfg(feature = "olap")]
|
||||
@ -712,12 +714,13 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
|
||||
db_metrics::DatabaseOperation::Filter,
|
||||
)
|
||||
.await
|
||||
.into_report()
|
||||
.map_err(|er| {
|
||||
let new_err = StorageError::DatabaseError(format!("{er:?}"));
|
||||
er.change_context(new_err)
|
||||
StorageError::DatabaseError(
|
||||
error_stack::report!(diesel_models::errors::DatabaseError::from(er))
|
||||
.attach_printable("Error filtering payment records"),
|
||||
)
|
||||
})
|
||||
.attach_printable_lazy(|| "Error filtering records by predicate")
|
||||
.into_report()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user