mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 17:47:54 +08:00
feat: cache reverse lookup fetches on redis (#719)
This commit is contained in:
@ -42,7 +42,6 @@ pub async fn redact_cache<T, F, Fut>(
|
|||||||
fun: F,
|
fun: F,
|
||||||
) -> CustomResult<T, errors::StorageError>
|
) -> CustomResult<T, errors::StorageError>
|
||||||
where
|
where
|
||||||
T: serde::Serialize + serde::de::DeserializeOwned + std::fmt::Debug,
|
|
||||||
F: FnOnce() -> Fut + Send,
|
F: FnOnce() -> Fut + Send,
|
||||||
Fut: futures::Future<Output = CustomResult<T, errors::StorageError>> + Send,
|
Fut: futures::Future<Output = CustomResult<T, errors::StorageError>> + Send,
|
||||||
{
|
{
|
||||||
|
|||||||
@ -535,11 +535,7 @@ mod storage {
|
|||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
// [#439]: get the attempt_id from payment_intent
|
// [#439]: get the attempt_id from payment_intent
|
||||||
let key = format!("{merchant_id}_{payment_id}");
|
let key = format!("{merchant_id}_{payment_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&key).await?;
|
||||||
.get_lookup_by_lookup_id(&key)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
self.redis_conn()
|
self.redis_conn()
|
||||||
@ -580,11 +576,7 @@ mod storage {
|
|||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
// We assume that PaymentAttempt <=> PaymentIntent is a one-to-one relation for now
|
// We assume that PaymentAttempt <=> PaymentIntent is a one-to-one relation for now
|
||||||
let lookup_id = format!("{merchant_id}_{connector_transaction_id}");
|
let lookup_id = format!("{merchant_id}_{connector_transaction_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
|
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
@ -641,11 +633,7 @@ mod storage {
|
|||||||
|
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let lookup_id = format!("{merchant_id}_{connector_txn_id}");
|
let lookup_id = format!("{merchant_id}_{connector_txn_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
@ -677,11 +665,7 @@ mod storage {
|
|||||||
|
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let lookup_id = format!("{merchant_id}_{attempt_id}");
|
let lookup_id = format!("{merchant_id}_{attempt_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
self.redis_conn()
|
self.redis_conn()
|
||||||
|
|||||||
@ -261,11 +261,7 @@ mod storage {
|
|||||||
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let lookup_id = format!("{merchant_id}_{internal_reference_id}");
|
let lookup_id = format!("{merchant_id}_{internal_reference_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
@ -461,11 +457,7 @@ mod storage {
|
|||||||
let updated_refund = refund.clone().apply_changeset(this.clone());
|
let updated_refund = refund.clone().apply_changeset(this.clone());
|
||||||
// Check for database presence as well Maybe use a read replica here ?
|
// Check for database presence as well Maybe use a read replica here ?
|
||||||
|
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&key).await?;
|
||||||
.get_lookup_by_lookup_id(&key)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let field = &lookup.sk_id;
|
let field = &lookup.sk_id;
|
||||||
|
|
||||||
@ -519,11 +511,7 @@ mod storage {
|
|||||||
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let lookup_id = format!("{merchant_id}_{refund_id}");
|
let lookup_id = format!("{merchant_id}_{refund_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
@ -560,11 +548,7 @@ mod storage {
|
|||||||
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let lookup_id = format!("{merchant_id}_{connector_refund_id}_{connector}");
|
let lookup_id = format!("{merchant_id}_{connector_refund_id}_{connector}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
|
||||||
.get_lookup_by_lookup_id(&lookup_id)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let key = &lookup.pk_id;
|
let key = &lookup.pk_id;
|
||||||
db_utils::try_redis_get_else_try_database_get(
|
db_utils::try_redis_get_else_try_database_get(
|
||||||
@ -609,11 +593,7 @@ mod storage {
|
|||||||
}
|
}
|
||||||
enums::MerchantStorageScheme::RedisKv => {
|
enums::MerchantStorageScheme::RedisKv => {
|
||||||
let key = format!("{merchant_id}_{payment_id}");
|
let key = format!("{merchant_id}_{payment_id}");
|
||||||
let lookup = self
|
let lookup = self.get_lookup_by_lookup_id(&key).await?;
|
||||||
.get_lookup_by_lookup_id(&key)
|
|
||||||
.await
|
|
||||||
.map_err(Into::<errors::StorageError>::into)
|
|
||||||
.into_report()?;
|
|
||||||
|
|
||||||
let pattern = db_utils::generate_hscan_pattern_for_refund(&lookup.sk_id);
|
let pattern = db_utils::generate_hscan_pattern_for_refund(&lookup.sk_id);
|
||||||
|
|
||||||
|
|||||||
@ -1,41 +1,61 @@
|
|||||||
use error_stack::ResultExt;
|
use error_stack::IntoReport;
|
||||||
use storage_models::{errors, StorageResult};
|
|
||||||
|
|
||||||
use super::{MockDb, Store};
|
use super::{cache, MockDb, Store};
|
||||||
use crate::{
|
use crate::{
|
||||||
connection::pg_connection,
|
connection::pg_connection,
|
||||||
|
errors::{self, CustomResult},
|
||||||
types::storage::reverse_lookup::{ReverseLookup, ReverseLookupNew},
|
types::storage::reverse_lookup::{ReverseLookup, ReverseLookupNew},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
pub trait ReverseLookupInterface {
|
pub trait ReverseLookupInterface {
|
||||||
async fn insert_reverse_lookup(&self, _new: ReverseLookupNew) -> StorageResult<ReverseLookup>;
|
async fn insert_reverse_lookup(
|
||||||
async fn get_lookup_by_lookup_id(&self, _id: &str) -> StorageResult<ReverseLookup>;
|
&self,
|
||||||
|
_new: ReverseLookupNew,
|
||||||
|
) -> CustomResult<ReverseLookup, errors::StorageError>;
|
||||||
|
async fn get_lookup_by_lookup_id(
|
||||||
|
&self,
|
||||||
|
_id: &str,
|
||||||
|
) -> CustomResult<ReverseLookup, errors::StorageError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl ReverseLookupInterface for Store {
|
impl ReverseLookupInterface for Store {
|
||||||
async fn insert_reverse_lookup(&self, new: ReverseLookupNew) -> StorageResult<ReverseLookup> {
|
async fn insert_reverse_lookup(
|
||||||
let conn = pg_connection(&self.master_pool)
|
&self,
|
||||||
.await
|
new: ReverseLookupNew,
|
||||||
.change_context(errors::DatabaseError::DatabaseConnectionError)?;
|
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||||
new.insert(&conn).await
|
let conn = pg_connection(&self.master_pool).await?;
|
||||||
|
new.insert(&conn).await.map_err(Into::into).into_report()
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_lookup_by_lookup_id(&self, id: &str) -> StorageResult<ReverseLookup> {
|
async fn get_lookup_by_lookup_id(
|
||||||
let conn = pg_connection(&self.master_pool)
|
&self,
|
||||||
|
id: &str,
|
||||||
|
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||||
|
let database_call = || async {
|
||||||
|
let conn = pg_connection(&self.master_pool).await?;
|
||||||
|
ReverseLookup::find_by_lookup_id(id, &conn)
|
||||||
.await
|
.await
|
||||||
.change_context(errors::DatabaseError::DatabaseConnectionError)?;
|
.map_err(Into::into)
|
||||||
ReverseLookup::find_by_lookup_id(id, &conn).await
|
.into_report()
|
||||||
|
};
|
||||||
|
cache::get_or_populate_cache(self, id, database_call).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait::async_trait]
|
#[async_trait::async_trait]
|
||||||
impl ReverseLookupInterface for MockDb {
|
impl ReverseLookupInterface for MockDb {
|
||||||
async fn insert_reverse_lookup(&self, _new: ReverseLookupNew) -> StorageResult<ReverseLookup> {
|
async fn insert_reverse_lookup(
|
||||||
Err(errors::DatabaseError::NotFound.into())
|
&self,
|
||||||
|
_new: ReverseLookupNew,
|
||||||
|
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||||
|
Err(errors::StorageError::MockDbError.into())
|
||||||
}
|
}
|
||||||
async fn get_lookup_by_lookup_id(&self, _id: &str) -> StorageResult<ReverseLookup> {
|
async fn get_lookup_by_lookup_id(
|
||||||
Err(errors::DatabaseError::NotFound.into())
|
&self,
|
||||||
|
_id: &str,
|
||||||
|
) -> CustomResult<ReverseLookup, errors::StorageError> {
|
||||||
|
Err(errors::StorageError::MockDbError.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user