mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	refactor(redis): invoke redis_conn() method instead of cloning redis_conn property in StorageInterface (#1552)
				
					
				
			Co-authored-by: jeeva <jeeva.ramu@codurance.com> Co-authored-by: Sanchith Hegde <22217505+SanchithHegde@users.noreply.github.com>
This commit is contained in:
		| @ -1713,7 +1713,12 @@ pub async fn list_customer_payment_method( | ||||
|         }; | ||||
|         customer_pms.push(pma.to_owned()); | ||||
|  | ||||
|         let redis_conn = state.store.get_redis_conn(); | ||||
|         let redis_conn = state | ||||
|             .store | ||||
|             .get_redis_conn() | ||||
|             .change_context(errors::ApiErrorResponse::InternalServerError) | ||||
|             .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|         let key_for_hyperswitch_token = format!( | ||||
|             "pm_token_{}_{}_hyperswitch", | ||||
|             parent_payment_method_token, pma.payment_method | ||||
|  | ||||
| @ -922,7 +922,12 @@ async fn decide_payment_method_tokenize_action( | ||||
|             } | ||||
|         } | ||||
|         Some(token) => { | ||||
|             let redis_conn = state.store.get_redis_conn(); | ||||
|             let redis_conn = state | ||||
|                 .store | ||||
|                 .get_redis_conn() | ||||
|                 .change_context(errors::ApiErrorResponse::InternalServerError) | ||||
|                 .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|             let key = format!( | ||||
|                 "pm_token_{}_{}_{}", | ||||
|                 token.to_owned(), | ||||
|  | ||||
| @ -1175,7 +1175,12 @@ pub async fn make_pm_data<'a, F: Clone, R>( | ||||
|     let request = &payment_data.payment_method_data; | ||||
|     let token = payment_data.token.clone(); | ||||
|     let hyperswitch_token = if let Some(token) = token { | ||||
|         let redis_conn = state.store.get_redis_conn(); | ||||
|         let redis_conn = state | ||||
|             .store | ||||
|             .get_redis_conn() | ||||
|             .change_context(errors::ApiErrorResponse::InternalServerError) | ||||
|             .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|         let key = format!( | ||||
|             "pm_token_{}_{}_hyperswitch", | ||||
|             token, | ||||
|  | ||||
| @ -46,7 +46,12 @@ pub async fn make_payout_method_data<'a>( | ||||
|             ) | ||||
|         ); | ||||
|  | ||||
|         let redis_conn = state.store.get_redis_conn(); | ||||
|         let redis_conn = state | ||||
|             .store | ||||
|             .get_redis_conn() | ||||
|             .change_context(errors::ApiErrorResponse::InternalServerError) | ||||
|             .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|         let hyperswitch_token_option = redis_conn | ||||
|             .get_key::<Option<String>>(&key) | ||||
|             .await | ||||
|  | ||||
| @ -173,8 +173,13 @@ where | ||||
| } | ||||
|  | ||||
| impl services::RedisConnInterface for MockDb { | ||||
|     fn get_redis_conn(&self) -> Arc<redis_interface::RedisConnectionPool> { | ||||
|         self.redis.clone() | ||||
|     fn get_redis_conn( | ||||
|         &self, | ||||
|     ) -> Result< | ||||
|         Arc<redis_interface::RedisConnectionPool>, | ||||
|         error_stack::Report<redis_interface::errors::RedisError>, | ||||
|     > { | ||||
|         Ok(self.redis.clone()) | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -470,7 +470,7 @@ mod tests { | ||||
|     async fn test_api_keys_cache() { | ||||
|         let db = MockDb::new(&Default::default()).await; | ||||
|  | ||||
|         let redis_conn = db.get_redis_conn(); | ||||
|         let redis_conn = db.get_redis_conn().unwrap(); | ||||
|         redis_conn | ||||
|             .subscribe("hyperswitch_invalidate") | ||||
|             .await | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| use common_utils::ext_traits::AsyncExt; | ||||
| use error_stack::ResultExt; | ||||
| use redis_interface::errors::RedisError; | ||||
|  | ||||
| use super::StorageInterface; | ||||
| use crate::{ | ||||
| @ -20,7 +21,12 @@ where | ||||
|     Fut: futures::Future<Output = CustomResult<T, errors::StorageError>> + Send, | ||||
| { | ||||
|     let type_name = std::any::type_name::<T>(); | ||||
|     let redis = &store.get_redis_conn(); | ||||
|     let redis = &store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::StorageError::RedisError( | ||||
|             RedisError::RedisConnectionError.into(), | ||||
|         )) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|     let redis_val = redis.get_and_deserialize_key::<T>(key, type_name).await; | ||||
|     let get_data_set_redis = || async { | ||||
|         let data = fun().await?; | ||||
| @ -76,8 +82,15 @@ where | ||||
| { | ||||
|     let data = fun().await?; | ||||
|     in_memory.async_map(|cache| cache.invalidate(key)).await; | ||||
|     store | ||||
|  | ||||
|     let redis_conn = store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::StorageError::RedisError( | ||||
|             RedisError::RedisConnectionError.into(), | ||||
|         )) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     redis_conn | ||||
|         .delete_key(key) | ||||
|         .await | ||||
|         .change_context(errors::StorageError::KVError)?; | ||||
| @ -88,8 +101,14 @@ pub async fn publish_into_redact_channel<'a>( | ||||
|     store: &dyn StorageInterface, | ||||
|     key: cache::CacheKind<'a>, | ||||
| ) -> CustomResult<usize, errors::StorageError> { | ||||
|     store | ||||
|     let redis_conn = store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::StorageError::RedisError( | ||||
|             RedisError::RedisConnectionError.into(), | ||||
|         )) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     redis_conn | ||||
|         .publish(consts::PUB_SUB_CHANNEL, key) | ||||
|         .await | ||||
|         .change_context(errors::StorageError::KVError) | ||||
|  | ||||
| @ -689,7 +689,7 @@ mod merchant_connector_account_cache_tests { | ||||
|     async fn test_connector_label_cache() { | ||||
|         let db = MockDb::new(&Default::default()).await; | ||||
|  | ||||
|         let redis_conn = db.get_redis_conn(); | ||||
|         let redis_conn = db.get_redis_conn().unwrap(); | ||||
|         let master_key = db.get_master_key(); | ||||
|         redis_conn | ||||
|             .subscribe("hyperswitch_invalidate") | ||||
|  | ||||
| @ -91,7 +91,12 @@ pub async fn payment_complete( | ||||
|         types::DummyConnectorStatus::Failed | ||||
|     }; | ||||
|  | ||||
|     let redis_conn = state.store.get_redis_conn(); | ||||
|     let redis_conn = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::DummyConnectorErrors::InternalServerError) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     let _ = redis_conn.delete_key(req.attempt_id.as_str()).await; | ||||
|  | ||||
|     if let Ok(payment_data) = payment_data { | ||||
| @ -193,7 +198,11 @@ pub async fn refund_data( | ||||
|     ) | ||||
|     .await; | ||||
|  | ||||
|     let redis_conn = state.store.get_redis_conn(); | ||||
|     let redis_conn = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::DummyConnectorErrors::InternalServerError) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|     let refund_data = redis_conn | ||||
|         .get_and_deserialize_key::<types::DummyConnectorRefundResponse>( | ||||
|             refund_id.as_str(), | ||||
|  | ||||
| @ -25,7 +25,11 @@ pub async fn store_data_in_redis( | ||||
|     data: impl serde::Serialize + Debug, | ||||
|     ttl: i64, | ||||
| ) -> types::DummyConnectorResult<()> { | ||||
|     let redis_conn = state.store.get_redis_conn(); | ||||
|     let redis_conn = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::DummyConnectorErrors::InternalServerError) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     redis_conn | ||||
|         .serialize_and_set_key_with_expiry(&key, data, ttl) | ||||
| @ -39,7 +43,12 @@ pub async fn get_payment_data_from_payment_id( | ||||
|     state: &AppState, | ||||
|     payment_id: String, | ||||
| ) -> types::DummyConnectorResult<types::DummyConnectorPaymentData> { | ||||
|     let redis_conn = state.store.get_redis_conn(); | ||||
|     let redis_conn = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::DummyConnectorErrors::InternalServerError) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     redis_conn | ||||
|         .get_and_deserialize_key::<types::DummyConnectorPaymentData>( | ||||
|             payment_id.as_str(), | ||||
| @ -53,7 +62,12 @@ pub async fn get_payment_data_by_attempt_id( | ||||
|     state: &AppState, | ||||
|     attempt_id: String, | ||||
| ) -> types::DummyConnectorResult<types::DummyConnectorPaymentData> { | ||||
|     let redis_conn = state.store.get_redis_conn(); | ||||
|     let redis_conn = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .change_context(errors::DummyConnectorErrors::InternalServerError) | ||||
|         .attach_printable("Failed to get redis connection")?; | ||||
|  | ||||
|     redis_conn | ||||
|         .get_and_deserialize_key::<String>(attempt_id.as_str(), "String") | ||||
|         .await | ||||
|  | ||||
| @ -106,12 +106,22 @@ impl PubSubInterface for redis_interface::RedisConnectionPool { | ||||
| } | ||||
|  | ||||
| pub trait RedisConnInterface { | ||||
|     fn get_redis_conn(&self) -> Arc<redis_interface::RedisConnectionPool>; | ||||
|     fn get_redis_conn( | ||||
|         &self, | ||||
|     ) -> common_utils::errors::CustomResult< | ||||
|         Arc<redis_interface::RedisConnectionPool>, | ||||
|         errors::RedisError, | ||||
|     >; | ||||
| } | ||||
|  | ||||
| impl RedisConnInterface for Store { | ||||
|     fn get_redis_conn(&self) -> Arc<redis_interface::RedisConnectionPool> { | ||||
|         self.redis_conn.clone() | ||||
|     fn get_redis_conn( | ||||
|         &self, | ||||
|     ) -> common_utils::errors::CustomResult< | ||||
|         Arc<redis_interface::RedisConnectionPool>, | ||||
|         errors::RedisError, | ||||
|     > { | ||||
|         self.redis_conn() | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -19,6 +19,7 @@ async fn invalidate_existing_cache_success() { | ||||
|     let _ = state | ||||
|         .store | ||||
|         .get_redis_conn() | ||||
|         .unwrap() | ||||
|         .set_key(&cache_key.clone(), cache_key_value.clone()) | ||||
|         .await; | ||||
|  | ||||
|  | ||||
							
								
								
									
										39
									
								
								crates/router/tests/services.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								crates/router/tests/services.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| use std::sync::atomic; | ||||
|  | ||||
| use router::{configs::settings::Settings, routes}; | ||||
|  | ||||
| mod utils; | ||||
|  | ||||
| #[tokio::test] | ||||
| #[should_panic] | ||||
| async fn get_redis_conn_failure() { | ||||
|     // Arrange | ||||
|     utils::setup().await; | ||||
|     let (tx, _) = tokio::sync::oneshot::channel(); | ||||
|     let state = routes::AppState::new(Settings::default(), tx).await; | ||||
|  | ||||
|     let _ = state.store.get_redis_conn().map(|conn| { | ||||
|         conn.is_redis_available | ||||
|             .store(false, atomic::Ordering::SeqCst) | ||||
|     }); | ||||
|  | ||||
|     // Act | ||||
|     let _ = state.store.get_redis_conn(); | ||||
|  | ||||
|     // Assert | ||||
|     // based on #[should_panic] attribute | ||||
| } | ||||
|  | ||||
| #[tokio::test] | ||||
| async fn get_redis_conn_success() { | ||||
|     // Arrange | ||||
|     utils::setup().await; | ||||
|     let (tx, _) = tokio::sync::oneshot::channel(); | ||||
|     let state = routes::AppState::new(Settings::default(), tx).await; | ||||
|  | ||||
|     // Act | ||||
|     let result = state.store.get_redis_conn(); | ||||
|  | ||||
|     // Assert | ||||
|     assert!(result.is_ok()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Jeeva
					Jeeva