mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 01:57:45 +08:00 
			
		
		
		
	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:
		| @ -267,7 +267,7 @@ mod storage { | ||||
|  | ||||
| #[cfg(feature = "kv_store")] | ||||
| mod storage { | ||||
|     use common_utils::date_time; | ||||
|     use common_utils::{date_time, fallback_reverse_lookup_not_found}; | ||||
|     use error_stack::{IntoReport, ResultExt}; | ||||
|     use redis_interface::HsetnxReply; | ||||
|     use storage_impl::redis::kv_store::{kv_wrapper, KvOperation}; | ||||
| @ -277,7 +277,6 @@ mod storage { | ||||
|         connection, | ||||
|         core::errors::{self, CustomResult}, | ||||
|         db::reverse_lookup::ReverseLookupInterface, | ||||
|         logger, | ||||
|         services::Store, | ||||
|         types::storage::{self as storage_types, enums, kv}, | ||||
|         utils::{self, db_utils}, | ||||
| @ -304,10 +303,12 @@ mod storage { | ||||
|             match storage_scheme { | ||||
|                 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, storage_scheme) | ||||
|                         .await?; | ||||
|                     let lookup_id = format!("ref_inter_ref_{merchant_id}_{internal_reference_id}"); | ||||
|                     let lookup = fallback_reverse_lookup_not_found!( | ||||
|                         self.get_lookup_by_lookup_id(&lookup_id, storage_scheme) | ||||
|                             .await, | ||||
|                         database_call().await | ||||
|                     ); | ||||
|  | ||||
|                     let key = &lookup.pk_id; | ||||
|                     Box::pin(db_utils::try_redis_get_else_try_database_get( | ||||
| @ -382,6 +383,50 @@ mod storage { | ||||
|                         }, | ||||
|                     }; | ||||
|  | ||||
|                     let mut reverse_lookups = vec![ | ||||
|                         storage_types::ReverseLookupNew { | ||||
|                             sk_id: field.clone(), | ||||
|                             lookup_id: format!( | ||||
|                                 "ref_ref_id_{}_{}", | ||||
|                                 created_refund.merchant_id, created_refund.refund_id | ||||
|                             ), | ||||
|                             pk_id: key.clone(), | ||||
|                             source: "refund".to_string(), | ||||
|                             updated_by: storage_scheme.to_string(), | ||||
|                         }, | ||||
|                         // [#492]: A discussion is required on whether this is required? | ||||
|                         storage_types::ReverseLookupNew { | ||||
|                             sk_id: field.clone(), | ||||
|                             lookup_id: format!( | ||||
|                                 "ref_inter_ref_{}_{}", | ||||
|                                 created_refund.merchant_id, created_refund.internal_reference_id | ||||
|                             ), | ||||
|                             pk_id: key.clone(), | ||||
|                             source: "refund".to_string(), | ||||
|                             updated_by: storage_scheme.to_string(), | ||||
|                         }, | ||||
|                     ]; | ||||
|                     if let Some(connector_refund_id) = created_refund.to_owned().connector_refund_id | ||||
|                     { | ||||
|                         reverse_lookups.push(storage_types::ReverseLookupNew { | ||||
|                             sk_id: field.clone(), | ||||
|                             lookup_id: format!( | ||||
|                                 "ref_connector_{}_{}_{}", | ||||
|                                 created_refund.merchant_id, | ||||
|                                 connector_refund_id, | ||||
|                                 created_refund.connector | ||||
|                             ), | ||||
|                             pk_id: key.clone(), | ||||
|                             source: "refund".to_string(), | ||||
|                             updated_by: storage_scheme.to_string(), | ||||
|                         }) | ||||
|                     }; | ||||
|                     let rev_look = reverse_lookups | ||||
|                         .into_iter() | ||||
|                         .map(|rev| self.insert_reverse_lookup(rev, storage_scheme)); | ||||
|  | ||||
|                     futures::future::try_join_all(rev_look).await?; | ||||
|  | ||||
|                     match kv_wrapper::<storage_types::Refund, _, _>( | ||||
|                         self, | ||||
|                         KvOperation::<storage_types::Refund>::HSetNx( | ||||
| @ -400,55 +445,7 @@ mod storage { | ||||
|                             key: Some(created_refund.refund_id), | ||||
|                         }) | ||||
|                         .into_report(), | ||||
|                         Ok(HsetnxReply::KeySet) => { | ||||
|                             let mut reverse_lookups = vec![ | ||||
|                                 storage_types::ReverseLookupNew { | ||||
|                                     sk_id: field.clone(), | ||||
|                                     lookup_id: format!( | ||||
|                                         "{}_{}", | ||||
|                                         created_refund.merchant_id, created_refund.refund_id | ||||
|                                     ), | ||||
|                                     pk_id: key.clone(), | ||||
|                                     source: "refund".to_string(), | ||||
|                                     updated_by: storage_scheme.to_string(), | ||||
|                                 }, | ||||
|                                 // [#492]: A discussion is required on whether this is required? | ||||
|                                 storage_types::ReverseLookupNew { | ||||
|                                     sk_id: field.clone(), | ||||
|                                     lookup_id: format!( | ||||
|                                         "{}_{}", | ||||
|                                         created_refund.merchant_id, | ||||
|                                         created_refund.internal_reference_id | ||||
|                                     ), | ||||
|                                     pk_id: key.clone(), | ||||
|                                     source: "refund".to_string(), | ||||
|                                     updated_by: storage_scheme.to_string(), | ||||
|                                 }, | ||||
|                             ]; | ||||
|                             if let Some(connector_refund_id) = | ||||
|                                 created_refund.to_owned().connector_refund_id | ||||
|                             { | ||||
|                                 reverse_lookups.push(storage_types::ReverseLookupNew { | ||||
|                                     sk_id: field.clone(), | ||||
|                                     lookup_id: format!( | ||||
|                                         "{}_{}_{}", | ||||
|                                         created_refund.merchant_id, | ||||
|                                         connector_refund_id, | ||||
|                                         created_refund.connector | ||||
|                                     ), | ||||
|                                     pk_id: key, | ||||
|                                     source: "refund".to_string(), | ||||
|                                     updated_by: storage_scheme.to_string(), | ||||
|                                 }) | ||||
|                             }; | ||||
|                             let rev_look = reverse_lookups | ||||
|                                 .into_iter() | ||||
|                                 .map(|rev| self.insert_reverse_lookup(rev, storage_scheme)); | ||||
|  | ||||
|                             futures::future::try_join_all(rev_look).await?; | ||||
|  | ||||
|                             Ok(created_refund) | ||||
|                         } | ||||
|                         Ok(HsetnxReply::KeySet) => Ok(created_refund), | ||||
|                         Err(er) => Err(er).change_context(errors::StorageError::KVError), | ||||
|                     } | ||||
|                 } | ||||
| @ -475,17 +472,14 @@ mod storage { | ||||
|             match storage_scheme { | ||||
|                 enums::MerchantStorageScheme::PostgresOnly => database_call().await, | ||||
|                 enums::MerchantStorageScheme::RedisKv => { | ||||
|                     let lookup_id = format!("{merchant_id}_{connector_transaction_id}"); | ||||
|                     let lookup = match self | ||||
|                         .get_lookup_by_lookup_id(&lookup_id, storage_scheme) | ||||
|                         .await | ||||
|                     { | ||||
|                         Ok(l) => l, | ||||
|                         Err(err) => { | ||||
|                             logger::error!(?err); | ||||
|                             return Ok(vec![]); | ||||
|                         } | ||||
|                     }; | ||||
|                     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, | ||||
|                         database_call().await | ||||
|                     ); | ||||
|  | ||||
|                     let key = &lookup.pk_id; | ||||
|  | ||||
|                     let pattern = db_utils::generate_hscan_pattern_for_refund(&lookup.sk_id); | ||||
| @ -575,10 +569,12 @@ mod storage { | ||||
|             match storage_scheme { | ||||
|                 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, storage_scheme) | ||||
|                         .await?; | ||||
|                     let lookup_id = format!("ref_ref_id_{merchant_id}_{refund_id}"); | ||||
|                     let lookup = fallback_reverse_lookup_not_found!( | ||||
|                         self.get_lookup_by_lookup_id(&lookup_id, storage_scheme) | ||||
|                             .await, | ||||
|                         database_call().await | ||||
|                     ); | ||||
|  | ||||
|                     let key = &lookup.pk_id; | ||||
|                     Box::pin(db_utils::try_redis_get_else_try_database_get( | ||||
| @ -620,10 +616,13 @@ mod storage { | ||||
|             match storage_scheme { | ||||
|                 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, storage_scheme) | ||||
|                         .await?; | ||||
|                     let lookup_id = | ||||
|                         format!("ref_connector_{merchant_id}_{connector_refund_id}_{connector}"); | ||||
|                     let lookup = fallback_reverse_lookup_not_found!( | ||||
|                         self.get_lookup_by_lookup_id(&lookup_id, storage_scheme) | ||||
|                             .await, | ||||
|                         database_call().await | ||||
|                     ); | ||||
|  | ||||
|                     let key = &lookup.pk_id; | ||||
|                     Box::pin(db_utils::try_redis_get_else_try_database_get( | ||||
|  | ||||
| @ -193,13 +193,7 @@ fn diesel_error_to_data_error(diesel_error: Report<DatabaseError>) -> Report<Sto | ||||
|             entity: "entity ", | ||||
|             key: None, | ||||
|         }, | ||||
|         DatabaseError::NoFieldsToUpdate => { | ||||
|             StorageError::DatabaseError("No fields to update".to_string()) | ||||
|         } | ||||
|         DatabaseError::QueryGenerationFailed => { | ||||
|             StorageError::DatabaseError("Query generation failed".to_string()) | ||||
|         } | ||||
|         DatabaseError::Others => StorageError::DatabaseError("Others".to_string()), | ||||
|         err => StorageError::DatabaseError(error_stack::report!(*err)), | ||||
|     }; | ||||
|     diesel_error.change_context(new_err) | ||||
| } | ||||
|  | ||||
| @ -35,6 +35,7 @@ use storage_impl::errors::ApplicationResult; | ||||
| use tokio::sync::{mpsc, oneshot}; | ||||
|  | ||||
| pub use self::env::logger; | ||||
| pub(crate) use self::macros::*; | ||||
| use crate::{configs::settings, core::errors}; | ||||
|  | ||||
| #[cfg(feature = "mimalloc")] | ||||
|  | ||||
| @ -1,68 +1,4 @@ | ||||
| #[macro_export] | ||||
| macro_rules! newtype_impl { | ||||
|     ($is_pub:vis, $name:ident, $ty_path:path) => { | ||||
|         impl std::ops::Deref for $name { | ||||
|             type Target = $ty_path; | ||||
|  | ||||
|             fn deref(&self) -> &Self::Target { | ||||
|                 &self.0 | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         impl std::ops::DerefMut for $name { | ||||
|             fn deref_mut(&mut self) -> &mut Self::Target { | ||||
|                 &mut self.0 | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         impl From<$ty_path> for $name { | ||||
|             fn from(ty: $ty_path) -> Self { | ||||
|                 Self(ty) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         impl $name { | ||||
|             pub fn into_inner(self) -> $ty_path { | ||||
|                 self.0 | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #[macro_export] | ||||
| macro_rules! newtype { | ||||
|     ($is_pub:vis $name:ident = $ty_path:path) => { | ||||
|         $is_pub struct $name(pub $ty_path); | ||||
|  | ||||
|         $crate::newtype_impl!($is_pub, $name, $ty_path); | ||||
|     }; | ||||
|  | ||||
|     ($is_pub:vis $name:ident = $ty_path:path, derives = ($($trt:path),*)) => { | ||||
|         #[derive($($trt),*)] | ||||
|         $is_pub struct $name(pub $ty_path); | ||||
|  | ||||
|         $crate::newtype_impl!($is_pub, $name, $ty_path); | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #[macro_export] | ||||
| macro_rules! async_spawn { | ||||
|     ($t:block) => { | ||||
|         tokio::spawn(async move { $t }); | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #[macro_export] | ||||
| macro_rules! collect_missing_value_keys { | ||||
|     [$(($key:literal, $option:expr)),+] => { | ||||
|         { | ||||
|             let mut keys: Vec<&'static str> = Vec::new(); | ||||
|             $( | ||||
|                 if $option.is_none() { | ||||
|                     keys.push($key); | ||||
|                 } | ||||
|             )* | ||||
|             keys | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| pub use common_utils::{ | ||||
|     async_spawn, collect_missing_value_keys, fallback_reverse_lookup_not_found, newtype, | ||||
|     newtype_impl, | ||||
| }; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Kartikeya Hegde
					Kartikeya Hegde