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:
Kartikeya Hegde
2023-12-05 12:47:37 +05:30
committed by GitHub
parent 298e3627c3
commit ba392f58b2
14 changed files with 288 additions and 227 deletions

View File

@ -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(),

View File

@ -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()
}
}