mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-01 11:06:50 +08:00
feat(router): added incoming dispute webhooks flow (#769)
Co-authored-by: Sangamesh <sangamesh.kulkarni@juspay.in> Co-authored-by: sai harsha <sai.harsha@sai.harsha-MacBookPro> Co-authored-by: Arun Raj M <jarnura47@gmail.com>
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use api_models::enums::{DisputeStage, DisputeStatus};
|
||||
use common_utils::errors::CustomResult;
|
||||
use error_stack::ResultExt;
|
||||
use router_env::{instrument, tracing};
|
||||
|
||||
@ -149,3 +151,67 @@ mod tests {
|
||||
assert_eq!(generated_id.len(), consts::ID_LENGTH + 4)
|
||||
}
|
||||
}
|
||||
|
||||
// Dispute Stage can move linearly from PreDispute -> Dispute -> PreArbitration
|
||||
pub fn validate_dispute_stage(
|
||||
prev_dispute_stage: &DisputeStage,
|
||||
dispute_stage: &DisputeStage,
|
||||
) -> bool {
|
||||
match prev_dispute_stage {
|
||||
DisputeStage::PreDispute => true,
|
||||
DisputeStage::Dispute => !matches!(dispute_stage, DisputeStage::PreDispute),
|
||||
DisputeStage::PreArbitration => matches!(dispute_stage, DisputeStage::PreArbitration),
|
||||
}
|
||||
}
|
||||
|
||||
//Dispute status can go from Opened -> (Expired | Accepted | Cancelled | Challenged -> (Won | Lost))
|
||||
pub fn validate_dispute_status(
|
||||
prev_dispute_status: DisputeStatus,
|
||||
dispute_status: DisputeStatus,
|
||||
) -> bool {
|
||||
match prev_dispute_status {
|
||||
DisputeStatus::DisputeOpened => true,
|
||||
DisputeStatus::DisputeExpired => {
|
||||
matches!(dispute_status, DisputeStatus::DisputeExpired)
|
||||
}
|
||||
DisputeStatus::DisputeAccepted => {
|
||||
matches!(dispute_status, DisputeStatus::DisputeAccepted)
|
||||
}
|
||||
DisputeStatus::DisputeCancelled => {
|
||||
matches!(dispute_status, DisputeStatus::DisputeCancelled)
|
||||
}
|
||||
DisputeStatus::DisputeChallenged => matches!(
|
||||
dispute_status,
|
||||
DisputeStatus::DisputeChallenged
|
||||
| DisputeStatus::DisputeWon
|
||||
| DisputeStatus::DisputeLost
|
||||
),
|
||||
DisputeStatus::DisputeWon => matches!(dispute_status, DisputeStatus::DisputeWon),
|
||||
DisputeStatus::DisputeLost => matches!(dispute_status, DisputeStatus::DisputeLost),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate_dispute_stage_and_dispute_status(
|
||||
prev_dispute_stage: DisputeStage,
|
||||
prev_dispute_status: DisputeStatus,
|
||||
dispute_stage: DisputeStage,
|
||||
dispute_status: DisputeStatus,
|
||||
) -> CustomResult<(), errors::WebhooksFlowError> {
|
||||
let dispute_stage_validation = validate_dispute_stage(&prev_dispute_stage, &dispute_stage);
|
||||
let dispute_status_validation = if dispute_stage == prev_dispute_stage {
|
||||
validate_dispute_status(prev_dispute_status, dispute_status)
|
||||
} else {
|
||||
true
|
||||
};
|
||||
common_utils::fp_utils::when(
|
||||
!(dispute_stage_validation && dispute_status_validation),
|
||||
|| {
|
||||
super::metrics::INCOMING_DISPUTE_WEBHOOK_VALIDATION_FAILURE_METRIC.add(
|
||||
&super::metrics::CONTEXT,
|
||||
1,
|
||||
&[],
|
||||
);
|
||||
Err(errors::WebhooksFlowError::DisputeWebhookValidationFailed)?
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user