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, |     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, | ||||||
|             .await |         id: &str, | ||||||
|             .change_context(errors::DatabaseError::DatabaseConnectionError)?; |     ) -> CustomResult<ReverseLookup, errors::StorageError> { | ||||||
|         ReverseLookup::find_by_lookup_id(id, &conn).await |         let database_call = || async { | ||||||
|  |             let conn = pg_connection(&self.master_pool).await?; | ||||||
|  |             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] | #[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
	 Kartikeya Hegde
					Kartikeya Hegde