mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-29 00:49:42 +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