mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	fix: throw bad request while pushing duplicate data to redis (#3016)
This commit is contained in:
		| @ -480,3 +480,25 @@ impl<T> ConnectorErrorExt<T> for error_stack::Result<T, errors::ConnectorError> | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub trait RedisErrorExt { | ||||
|     #[track_caller] | ||||
|     fn to_redis_failed_response(self, key: &str) -> error_stack::Report<errors::StorageError>; | ||||
| } | ||||
|  | ||||
| impl RedisErrorExt for error_stack::Report<errors::RedisError> { | ||||
|     fn to_redis_failed_response(self, key: &str) -> error_stack::Report<errors::StorageError> { | ||||
|         match self.current_context() { | ||||
|             errors::RedisError::NotFound => self.change_context( | ||||
|                 errors::StorageError::ValueNotFound(format!("Data does not exist for key {key}",)), | ||||
|             ), | ||||
|             errors::RedisError::SetNxFailed => { | ||||
|                 self.change_context(errors::StorageError::DuplicateValue { | ||||
|                     entity: "redis", | ||||
|                     key: Some(key.to_string()), | ||||
|                 }) | ||||
|             } | ||||
|             _ => self.change_context(errors::StorageError::KVError), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -275,7 +275,7 @@ mod storage { | ||||
|     use super::RefundInterface; | ||||
|     use crate::{ | ||||
|         connection, | ||||
|         core::errors::{self, CustomResult}, | ||||
|         core::errors::{self, utils::RedisErrorExt, CustomResult}, | ||||
|         db::reverse_lookup::ReverseLookupInterface, | ||||
|         services::Store, | ||||
|         types::storage::{self as storage_types, enums, kv}, | ||||
| @ -437,7 +437,7 @@ mod storage { | ||||
|                         &key, | ||||
|                     ) | ||||
|                     .await | ||||
|                     .change_context(errors::StorageError::KVError)? | ||||
|                     .map_err(|err| err.to_redis_failed_response(&key))? | ||||
|                     .try_into_hsetnx() | ||||
|                     { | ||||
|                         Ok(HsetnxReply::KeyNotSet) => Err(errors::StorageError::DuplicateValue { | ||||
| @ -544,7 +544,7 @@ mod storage { | ||||
|                         &key, | ||||
|                     ) | ||||
|                     .await | ||||
|                     .change_context(errors::StorageError::KVError)? | ||||
|                     .map_err(|err| err.to_redis_failed_response(&key))? | ||||
|                     .try_into_hset() | ||||
|                     .change_context(errors::StorageError::KVError)?; | ||||
|  | ||||
|  | ||||
| @ -69,6 +69,7 @@ mod storage { | ||||
|     use super::{ReverseLookupInterface, Store}; | ||||
|     use crate::{ | ||||
|         connection, | ||||
|         core::errors::utils::RedisErrorExt, | ||||
|         errors::{self, CustomResult}, | ||||
|         types::storage::{ | ||||
|             enums, kv, | ||||
| @ -109,7 +110,7 @@ mod storage { | ||||
|                         format!("reverse_lookup_{}", &created_rev_lookup.lookup_id), | ||||
|                     ) | ||||
|                     .await | ||||
|                     .change_context(errors::StorageError::KVError)? | ||||
|                     .map_err(|err| err.to_redis_failed_response(&created_rev_lookup.lookup_id))? | ||||
|                     .try_into_setnx() | ||||
|                     { | ||||
|                         Ok(SetnxReply::KeySet) => Ok(created_rev_lookup), | ||||
|  | ||||
| @ -1,4 +1,7 @@ | ||||
| use crate::{core::errors, routes::metrics}; | ||||
| use crate::{ | ||||
|     core::errors::{self, utils::RedisErrorExt}, | ||||
|     routes::metrics, | ||||
| }; | ||||
|  | ||||
| /// Generates hscan field pattern. Suppose the field is pa_1234_ref_1211 it will generate | ||||
| /// pa_1234_ref_* | ||||
| @ -28,7 +31,8 @@ where | ||||
|                 metrics::KV_MISS.add(&metrics::CONTEXT, 1, &[]); | ||||
|                 database_call_closure().await | ||||
|             } | ||||
|             _ => Err(redis_error.change_context(errors::StorageError::KVError)), | ||||
|             // Keeping the key empty here since the error would never go here. | ||||
|             _ => Err(redis_error.to_redis_failed_response("")), | ||||
|         }, | ||||
|     } | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Kartikeya Hegde
					Kartikeya Hegde