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