mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 01:57:45 +08:00 
			
		
		
		
	feat(core): add manual retry cutoff duration (#9330)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
		| @ -4448,6 +4448,21 @@ pub fn get_attempt_type( | |||||||
|     match payment_intent.status { |     match payment_intent.status { | ||||||
|         enums::IntentStatus::Failed => { |         enums::IntentStatus::Failed => { | ||||||
|             if matches!(is_manual_retry_enabled, Some(true)) { |             if matches!(is_manual_retry_enabled, Some(true)) { | ||||||
|  |                 // if it is false, don't go ahead with manual retry | ||||||
|  |                 fp_utils::when( | ||||||
|  |                     !validate_manual_retry_cutoff( | ||||||
|  |                         payment_intent.created_at, | ||||||
|  |                         payment_intent.session_expiry, | ||||||
|  |                     ), | ||||||
|  |                     || { | ||||||
|  |                         Err(report!(errors::ApiErrorResponse::PreconditionFailed { | ||||||
|  |                             message: | ||||||
|  |                                 format!("You cannot {action} this payment using `manual_retry` because the allowed duration has expired") | ||||||
|  |                             } | ||||||
|  |                         )) | ||||||
|  |                     }, | ||||||
|  |                 )?; | ||||||
|  |  | ||||||
|                 metrics::MANUAL_RETRY_REQUEST_COUNT.add( |                 metrics::MANUAL_RETRY_REQUEST_COUNT.add( | ||||||
|                     1, |                     1, | ||||||
|                     router_env::metric_attributes!(( |                     router_env::metric_attributes!(( | ||||||
| @ -4552,6 +4567,27 @@ pub fn get_attempt_type( | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | fn validate_manual_retry_cutoff( | ||||||
|  |     created_at: time::PrimitiveDateTime, | ||||||
|  |     session_expiry: Option<time::PrimitiveDateTime>, | ||||||
|  | ) -> bool { | ||||||
|  |     let utc_current_time = time::OffsetDateTime::now_utc(); | ||||||
|  |     let primitive_utc_current_time = | ||||||
|  |         time::PrimitiveDateTime::new(utc_current_time.date(), utc_current_time.time()); | ||||||
|  |     let time_difference_from_creation = primitive_utc_current_time - created_at; | ||||||
|  |  | ||||||
|  |     // cutoff time is 50% of session duration | ||||||
|  |     let cutoff_limit = match session_expiry { | ||||||
|  |         Some(session_expiry) => { | ||||||
|  |             let duration = session_expiry - created_at; | ||||||
|  |             duration.whole_seconds() / 2 | ||||||
|  |         } | ||||||
|  |         None => consts::DEFAULT_SESSION_EXPIRY / 2, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     time_difference_from_creation.whole_seconds() <= cutoff_limit | ||||||
|  | } | ||||||
|  |  | ||||||
| #[derive(Debug, Eq, PartialEq, Clone)] | #[derive(Debug, Eq, PartialEq, Clone)] | ||||||
| pub enum AttemptType { | pub enum AttemptType { | ||||||
|     New, |     New, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Sakil Mostak
					Sakil Mostak