diff --git a/crates/router/src/core/payments/operations/payment_capture.rs b/crates/router/src/core/payments/operations/payment_capture.rs index 356ff837ea..ef8d6aad42 100644 --- a/crates/router/src/core/payments/operations/payment_capture.rs +++ b/crates/router/src/core/payments/operations/payment_capture.rs @@ -115,7 +115,6 @@ impl GetTracker, api::PaymentsCaptu ) .await?; - // TODO: get payment method data for response Ok(( Box::new(self), payments::PaymentData { diff --git a/crates/router/src/routes/metrics.rs b/crates/router/src/routes/metrics.rs index da21095b5d..142995cf78 100644 --- a/crates/router/src/routes/metrics.rs +++ b/crates/router/src/routes/metrics.rs @@ -1,5 +1,3 @@ -// TODO: Move this to router_env https://juspay.atlassian.net/browse/ORCA-345 - use once_cell::sync::Lazy; use router_env::opentelemetry::{ global, diff --git a/crates/router/src/routes/payments.rs b/crates/router/src/routes/payments.rs index 1ff38f6a09..1a2608db12 100644 --- a/crates/router/src/routes/payments.rs +++ b/crates/router/src/routes/payments.rs @@ -1,38 +1,26 @@ use std::borrow::Cow; -use actix_web::{ - body::{BoxBody, MessageBody}, - web, HttpRequest, HttpResponse, Responder, -}; +use actix_web::{web, Responder}; use error_stack::report; use router_env::{ tracing::{self, instrument}, Flow, }; -use super::app::AppState; use crate::{ + self as app, core::{errors::http_not_implemented, payments}, services::api, - types::api::{ - self as api_types, enums as api_enums, - payments::{ - PaymentIdType, PaymentListConstraints, PaymentsCancelRequest, PaymentsCaptureRequest, - PaymentsRequest, PaymentsResponse, PaymentsRetrieveRequest, - }, - Authorize, Capture, PSync, PaymentRetrieveBody, PaymentsSessionRequest, - PaymentsSessionResponse, PaymentsStartRequest, Session, Verify, Void, - }, - //FIXME: remove specific imports + types::api::{self as api_types, enums as api_enums, payments as payment_types}, }; #[instrument(skip_all, fields(flow = ?Flow::PaymentsCreate))] // #[post("")] pub async fn payments_create( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, -) -> HttpResponse { + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, +) -> impl Responder { let payload = json_payload.into_inner(); if let Some(api_enums::CaptureMethod::Scheduled) = payload.capture_method { @@ -44,37 +32,13 @@ pub async fn payments_create( &req, payload, |state, merchant_account, req| { - // TODO: Change for making it possible for the flow to be inferred internally or through validation layer - async { - let connector = req.connector; - match req.amount.as_ref() { - Some(api_types::Amount::Value(_)) | None => { - payments::payments_core::( - state, - merchant_account, - payments::PaymentCreate, - req, - api::AuthFlow::Merchant, - connector, - payments::CallConnectorAction::Trigger, - ) - .await - } - - Some(api_types::Amount::Zero) => { - payments::payments_core::( - state, - merchant_account, - payments::PaymentCreate, - req, - api::AuthFlow::Merchant, - connector, - payments::CallConnectorAction::Trigger, - ) - .await - } - } - } + authorize_verify_select( + payments::PaymentCreate, + state, + merchant_account, + req, + api::AuthFlow::Merchant, + ) }, api::MerchantAuthentication::ApiKey, ) @@ -83,12 +47,12 @@ pub async fn payments_create( #[instrument(skip(state), fields(flow = ?Flow::PaymentsStart))] pub async fn payments_start( - state: web::Data, - req: HttpRequest, + state: web::Data, + req: actix_web::HttpRequest, path: web::Path<(String, String, String)>, -) -> HttpResponse { +) -> impl Responder { let (payment_id, merchant_id, attempt_id) = path.into_inner(); - let payload = PaymentsStartRequest { + let payload = payment_types::PaymentsStartRequest { payment_id: payment_id.clone(), merchant_id: merchant_id.clone(), txn_id: attempt_id.clone(), @@ -98,7 +62,7 @@ pub async fn payments_start( &req, payload, |state, merchant_account, req| { - payments::payments_core::( + payments::payments_core::( state, merchant_account, payments::operations::PaymentStart, @@ -116,13 +80,13 @@ pub async fn payments_start( #[instrument(skip(state), fields(flow = ?Flow::PaymentsRetrieve))] // #[get("/{payment_id}")] pub async fn payments_retrieve( - state: web::Data, - req: HttpRequest, + state: web::Data, + req: actix_web::HttpRequest, path: web::Path, - json_payload: web::Query, -) -> HttpResponse { - let payload = PaymentsRetrieveRequest { - resource_id: PaymentIdType::PaymentIntentId(path.to_string()), + json_payload: web::Query, +) -> impl Responder { + let payload = payment_types::PaymentsRetrieveRequest { + resource_id: payment_types::PaymentIdType::PaymentIntentId(path.to_string()), merchant_id: json_payload.merchant_id.clone(), force_sync: json_payload.force_sync.unwrap_or(false), param: None, @@ -139,7 +103,7 @@ pub async fn payments_retrieve( &req, payload, |state, merchant_account, req| { - payments::payments_core::( + payments::payments_core::( state, merchant_account, payments::PaymentStatus, @@ -157,11 +121,11 @@ pub async fn payments_retrieve( #[instrument(skip_all, fields(flow = ?Flow::PaymentsUpdate))] // #[post("/{payment_id}")] pub async fn payments_update( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, path: web::Path, -) -> HttpResponse { +) -> impl Responder { let mut payload = json_payload.into_inner(); if let Some(api_enums::CaptureMethod::Scheduled) = payload.capture_method { @@ -170,7 +134,7 @@ pub async fn payments_update( let payment_id = path.into_inner(); - payload.payment_id = Some(PaymentIdType::PaymentIntentId(payment_id)); + payload.payment_id = Some(payment_types::PaymentIdType::PaymentIntentId(payment_id)); let auth_type; (payload, auth_type) = match api::get_auth_type_and_check_client_secret(&req, payload) { @@ -185,15 +149,12 @@ pub async fn payments_update( &req, payload, |state, merchant_account, req| { - let connector = req.connector; - payments::payments_core::( + authorize_verify_select( + payments::PaymentUpdate, state, merchant_account, - payments::PaymentUpdate, req, auth_flow, - connector, - payments::CallConnectorAction::Trigger, ) }, auth_type, @@ -204,11 +165,11 @@ pub async fn payments_update( #[instrument(skip_all, fields(flow = ?Flow::PaymentsConfirm))] // #[post("/{payment_id}/confirm")] pub async fn payments_confirm( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, path: web::Path, -) -> HttpResponse { +) -> impl Responder { let mut payload = json_payload.into_inner(); if let Some(api_enums::CaptureMethod::Scheduled) = payload.capture_method { @@ -216,7 +177,7 @@ pub async fn payments_confirm( }; let payment_id = path.into_inner(); - payload.payment_id = Some(PaymentIdType::PaymentIntentId(payment_id)); + payload.payment_id = Some(payment_types::PaymentIdType::PaymentIntentId(payment_id)); payload.confirm = Some(true); let auth_type; @@ -231,15 +192,12 @@ pub async fn payments_confirm( &req, payload, |state, merchant_account, req| { - let connector = req.connector; - payments::payments_core::( + authorize_verify_select( + payments::PaymentConfirm, state, merchant_account, - payments::PaymentConfirm, req, auth_flow, - connector, - payments::CallConnectorAction::Trigger, ) }, auth_type, @@ -250,12 +208,12 @@ pub async fn payments_confirm( #[instrument(skip_all, fields(flow = ?Flow::PaymentsCapture))] // #[post("/{payment_id}/capture")] pub async fn payments_capture( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, path: web::Path, -) -> HttpResponse { - let capture_payload = PaymentsCaptureRequest { +) -> impl Responder { + let capture_payload = payment_types::PaymentsCaptureRequest { payment_id: Some(path.into_inner()), ..json_payload.into_inner() }; @@ -265,7 +223,7 @@ pub async fn payments_capture( &req, capture_payload, |state, merchant_account, payload| { - payments::payments_core::( + payments::payments_core::( state, merchant_account, payments::PaymentCapture, @@ -282,10 +240,10 @@ pub async fn payments_capture( #[instrument(skip_all, fields(flow = ?Flow::PaymentsSessionToken))] pub async fn payments_connector_session( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, -) -> HttpResponse { + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, +) -> impl Responder { let sessions_payload = json_payload.into_inner(); api::server_wrap( @@ -293,7 +251,13 @@ pub async fn payments_connector_session( &req, sessions_payload, |state, merchant_account, payload| { - payments::payments_core::( + payments::payments_core::< + api_types::Session, + payment_types::PaymentsSessionResponse, + _, + _, + _, + >( state, merchant_account, payments::PaymentSession, @@ -310,15 +274,15 @@ pub async fn payments_connector_session( #[instrument(skip_all)] pub async fn payments_response( - state: web::Data, - req: HttpRequest, + state: web::Data, + req: actix_web::HttpRequest, path: web::Path<(String, String, String)>, -) -> HttpResponse { +) -> impl Responder { let (payment_id, merchant_id, connector) = path.into_inner(); let param_string = req.query_string(); - let payload = PaymentsRetrieveRequest { - resource_id: PaymentIdType::PaymentIntentId(payment_id), + let payload = payment_types::PaymentsRetrieveRequest { + resource_id: payment_types::PaymentIdType::PaymentIntentId(payment_id), merchant_id: Some(merchant_id.clone()), force_sync: true, param: Some(param_string.to_string()), @@ -329,7 +293,11 @@ pub async fn payments_response( &req, payload, |state, merchant_account, req| { - payments::handle_payments_redirect_response::(state, merchant_account, req) + payments::handle_payments_redirect_response::( + state, + merchant_account, + req, + ) }, api::MerchantAuthentication::MerchantId(Cow::Borrowed(&merchant_id)), ) @@ -339,9 +307,9 @@ pub async fn payments_response( #[instrument(skip_all, fields(flow = ?Flow::PaymentsCancel))] // #[post("/{payment_id}/cancel")] pub async fn payments_cancel( - state: web::Data, - req: HttpRequest, - json_payload: web::Json, + state: web::Data, + req: actix_web::HttpRequest, + json_payload: web::Json, path: web::Path, ) -> impl Responder { let mut payload = json_payload.into_inner(); @@ -353,7 +321,7 @@ pub async fn payments_cancel( &req, payload, |state, merchant_account, req| { - payments::payments_core::( + payments::payments_core::( state, merchant_account, payments::PaymentCancel, @@ -371,10 +339,10 @@ pub async fn payments_cancel( #[instrument(skip_all, fields(flow = ?Flow::PaymentsList))] // #[get("/list")] pub async fn payments_list( - state: web::Data, - req: HttpRequest, - payload: web::Query, -) -> HttpResponse { + state: web::Data, + req: actix_web::HttpRequest, + payload: web::Query, +) -> impl Responder { let payload = payload.into_inner(); api::server_wrap( &state, @@ -388,9 +356,56 @@ pub async fn payments_list( .await } -fn _http_response(response: T) -> HttpResponse { - HttpResponse::Ok() - .content_type("application/json") - .append_header(("Via", "Juspay_router")) - .body(response) +async fn authorize_verify_select( + operation: Op, + state: &app::AppState, + merchant_account: storage_models::merchant_account::MerchantAccount, + req: api_models::payments::PaymentsRequest, + auth_flow: api::AuthFlow, +) -> app::core::errors::RouterResponse +where + Op: Sync + + Clone + + std::fmt::Debug + + payments::operations::Operation + + payments::operations::Operation, +{ + // TODO: Change for making it possible for the flow to be inferred internally or through validation layer + // This is a temporary fix. + // After analyzing the code structure, + // the operation are flow agnostic, and the flow is only required in the post_update_tracker + // Thus the flow can be generated just before calling the connector instead of explicitly passing it here. + + let connector = req.connector; + match req.amount.as_ref() { + Some(api_types::Amount::Value(_)) | None => payments::payments_core::< + api_types::Authorize, + payment_types::PaymentsResponse, + _, + _, + _, + >( + state, + merchant_account, + operation, + req, + auth_flow, + connector, + payments::CallConnectorAction::Trigger, + ) + .await, + + Some(api_types::Amount::Zero) => { + payments::payments_core::( + state, + merchant_account, + operation, + req, + auth_flow, + connector, + payments::CallConnectorAction::Trigger, + ) + .await + } + } }