mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-30 17:47:54 +08:00 
			
		
		
		
	 a423ff53d3
			
		
	
	a423ff53d3
	
	
	
		
			
			Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> Co-authored-by: Pa1NarK <69745008+pixincreate@users.noreply.github.com>
		
			
				
	
	
		
			557 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			557 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| pub mod transformers;
 | |
| 
 | |
| use error_stack::{report, ResultExt};
 | |
| use masking::{ExposeInterface, Mask};
 | |
| 
 | |
| use common_utils::{
 | |
|     errors::CustomResult,
 | |
|     ext_traits::BytesExt,
 | |
|     types::{AmountConvertor, StringMinorUnit, StringMinorUnitForConnector},
 | |
|     request::{Method, Request, RequestBuilder, RequestContent},
 | |
| };
 | |
| 
 | |
| use hyperswitch_domain_models::{
 | |
|     router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData},
 | |
|     router_flow_types::{
 | |
|         access_token_auth::AccessTokenAuth,
 | |
|         payments::{
 | |
|             Authorize, Capture, PSync, PaymentMethodToken, Session,
 | |
|             SetupMandate, Void,
 | |
|         },
 | |
|         refunds::{Execute, RSync},
 | |
|     },
 | |
|     router_request_types::{
 | |
|         AccessTokenRequestData, PaymentMethodTokenizationData,
 | |
|         PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData,
 | |
|         PaymentsSyncData, RefundsData, SetupMandateRequestData,
 | |
|     },
 | |
|     router_response_types::{PaymentsResponseData, RefundsResponseData},
 | |
|     types::{
 | |
|         PaymentsAuthorizeRouterData,
 | |
|         PaymentsCaptureRouterData, PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData,
 | |
|     },
 | |
| };
 | |
| use hyperswitch_interfaces::{
 | |
|     api::{self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorValidation, ConnectorSpecifications},
 | |
|     configs::Connectors,
 | |
|     errors,
 | |
|     events::connector_api_logs::ConnectorEvent,
 | |
|     types::{self, Response},
 | |
|     webhooks,
 | |
| };
 | |
| use crate::{
 | |
|     constants::headers,
 | |
|     types::ResponseRouterData,
 | |
|     utils,
 | |
| };
 | |
| 
 | |
| use transformers as {{project-name | downcase}};
 | |
| 
 | |
| #[derive(Clone)]
 | |
| pub struct {{project-name | downcase | pascal_case}} {
 | |
|     amount_converter: &'static (dyn AmountConvertor<Output = StringMinorUnit> + Sync)
 | |
| }
 | |
| 
 | |
| impl {{project-name | downcase | pascal_case}} {
 | |
|     pub fn new() -> &'static Self {
 | |
|         &Self {
 | |
|             amount_converter: &StringMinorUnitForConnector
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl api::Payment for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentSession for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::ConnectorAccessToken for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::MandateSetup for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentAuthorize for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentSync for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentCapture for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentVoid for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::Refund for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::RefundExecute for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::RefundSync for {{project-name | downcase | pascal_case}} {}
 | |
| impl api::PaymentToken for {{project-name | downcase | pascal_case}} {}
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         PaymentMethodToken,
 | |
|         PaymentMethodTokenizationData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
|     // Not Implemented (R)
 | |
| }
 | |
| 
 | |
| impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for {{project-name | downcase | pascal_case}}
 | |
| where
 | |
|     Self: ConnectorIntegration<Flow, Request, Response>,{
 | |
|     fn build_headers(
 | |
|         &self,
 | |
|         req: &RouterData<Flow, Request, Response>,
 | |
|         _connectors: &Connectors,
 | |
|     ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
 | |
|         let mut header = vec![(
 | |
|             headers::CONTENT_TYPE.to_string(),
 | |
|             self.get_content_type().to_string().into(),
 | |
|         )];
 | |
|         let mut api_key = self.get_auth_header(&req.connector_auth_type)?;
 | |
|         header.append(&mut api_key);
 | |
|         Ok(header)
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ConnectorCommon for {{project-name | downcase | pascal_case}} {
 | |
|     fn id(&self) -> &'static str {
 | |
|         "{{project-name | downcase}}"
 | |
|     }
 | |
| 
 | |
|     fn get_currency_unit(&self) -> api::CurrencyUnit {
 | |
|         todo!()
 | |
|     //    TODO! Check connector documentation, on which unit they are processing the currency.
 | |
|     //    If the connector accepts amount in lower unit ( i.e cents for USD) then return api::CurrencyUnit::Minor,
 | |
|     //    if connector accepts amount in base unit (i.e dollars for USD) then return api::CurrencyUnit::Base
 | |
|     }
 | |
| 
 | |
|     fn common_get_content_type(&self) -> &'static str {
 | |
|         "application/json"
 | |
|     }
 | |
| 
 | |
|     fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str {
 | |
|         connectors.{{project-name}}.base_url.as_ref()
 | |
|     }
 | |
| 
 | |
|     fn get_auth_header(&self, auth_type:&ConnectorAuthType)-> CustomResult<Vec<(String,masking::Maskable<String>)>,errors::ConnectorError> {
 | |
|         let auth =  {{project-name | downcase}}::{{project-name | downcase | pascal_case}}AuthType::try_from(auth_type)
 | |
|             .change_context(errors::ConnectorError::FailedToObtainAuthType)?;
 | |
|         Ok(vec![(headers::AUTHORIZATION.to_string(), auth.api_key.expose().into_masked())])
 | |
|     }
 | |
| 
 | |
|     fn build_error_response(
 | |
|         &self,
 | |
|         res: Response,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|     ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
 | |
|         let response: {{project-name | downcase}}::{{project-name | downcase | pascal_case}}ErrorResponse = res
 | |
|             .response
 | |
|             .parse_struct("{{project-name | downcase | pascal_case}}ErrorResponse")
 | |
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
| 
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
| 
 | |
|         Ok(ErrorResponse {
 | |
|             status_code: res.status_code,
 | |
|             code: response.code,
 | |
|             message: response.message,
 | |
|             reason: response.reason,
 | |
|             attempt_status: None,
 | |
|             connector_transaction_id: None,
 | |
|         })
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ConnectorValidation for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
|     //TODO: implement functions when support enabled
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         Session,
 | |
|         PaymentsSessionData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
|     //TODO: implement sessions flow
 | |
| }
 | |
| 
 | |
| impl ConnectorIntegration<AccessTokenAuth, AccessTokenRequestData, AccessToken>
 | |
|     for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         SetupMandate,
 | |
|         SetupMandateRequestData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         Authorize,
 | |
|         PaymentsAuthorizeData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}} {
 | |
|     fn get_headers(&self, req: &PaymentsAuthorizeRouterData, connectors: &Connectors,) -> CustomResult<Vec<(String, masking::Maskable<String>)>,errors::ConnectorError> {
 | |
|         self.build_headers(req, connectors)
 | |
|     }
 | |
| 
 | |
|     fn get_content_type(&self) -> &'static str {
 | |
|         self.common_get_content_type()
 | |
|     }
 | |
| 
 | |
|     fn get_url(&self, _req: &PaymentsAuthorizeRouterData, _connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn get_request_body(&self, req: &PaymentsAuthorizeRouterData, _connectors: &Connectors,) -> CustomResult<RequestContent, errors::ConnectorError> {
 | |
|         let amount = utils::convert_amount(
 | |
|             self.amount_converter,
 | |
|             req.request.minor_amount,
 | |
|             req.request.currency,
 | |
|         )?;
 | |
| 
 | |
|         let connector_router_data =
 | |
|             {{project-name | downcase}}::{{project-name | downcase | pascal_case}}RouterData::from((
 | |
|                 amount,
 | |
|                 req,
 | |
|             ));
 | |
|         let connector_req = {{project-name | downcase}}::{{project-name | downcase | pascal_case}}PaymentsRequest::try_from(&connector_router_data)?;
 | |
|         Ok(RequestContent::Json(Box::new(connector_req)))
 | |
|     }
 | |
| 
 | |
|     fn build_request(
 | |
|         &self,
 | |
|         req: &PaymentsAuthorizeRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Option<Request>, errors::ConnectorError> {
 | |
|         Ok(Some(
 | |
|             RequestBuilder::new()
 | |
|                 .method(Method::Post)
 | |
|                 .url(&types::PaymentsAuthorizeType::get_url(
 | |
|                     self, req, connectors,
 | |
|                 )?)
 | |
|                 .attach_default_headers()
 | |
|                 .headers(types::PaymentsAuthorizeType::get_headers(
 | |
|                     self, req, connectors,
 | |
|                 )?)
 | |
|                 .set_body(types::PaymentsAuthorizeType::get_request_body(self, req, connectors)?)
 | |
|                 .build(),
 | |
|         ))
 | |
|     }
 | |
| 
 | |
|     fn handle_response(
 | |
|         &self,
 | |
|         data: &PaymentsAuthorizeRouterData,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|         res: Response,
 | |
|     ) -> CustomResult<PaymentsAuthorizeRouterData,errors::ConnectorError> {
 | |
|         let response: {{project-name | downcase}}::{{project-name | downcase | pascal_case}}PaymentsResponse = res.response.parse_struct("{{project-name | downcase | pascal_case}} PaymentsAuthorizeResponse").change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
|         RouterData::try_from(ResponseRouterData {
 | |
|             response,
 | |
|             data: data.clone(),
 | |
|             http_code: res.status_code,
 | |
|         })
 | |
|     }
 | |
| 
 | |
|     fn get_error_response(&self, res: Response, event_builder: Option<&mut ConnectorEvent>) -> CustomResult<ErrorResponse,errors::ConnectorError> {
 | |
|         self.build_error_response(res, event_builder)
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<PSync, PaymentsSyncData, PaymentsResponseData>
 | |
|     for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
|     fn get_headers(
 | |
|         &self,
 | |
|         req: &PaymentsSyncRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
 | |
|         self.build_headers(req, connectors)
 | |
|     }
 | |
| 
 | |
|     fn get_content_type(&self) -> &'static str {
 | |
|         self.common_get_content_type()
 | |
|     }
 | |
| 
 | |
|     fn get_url(
 | |
|         &self,
 | |
|         _req: &PaymentsSyncRouterData,
 | |
|         _connectors: &Connectors,
 | |
|     ) -> CustomResult<String, errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn build_request(
 | |
|         &self,
 | |
|         req: &PaymentsSyncRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Option<Request>, errors::ConnectorError> {
 | |
|         Ok(Some(
 | |
|             RequestBuilder::new()
 | |
|                 .method(Method::Get)
 | |
|                 .url(&types::PaymentsSyncType::get_url(self, req, connectors)?)
 | |
|                 .attach_default_headers()
 | |
|                 .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?)
 | |
|                 .build(),
 | |
|         ))
 | |
|     }
 | |
| 
 | |
|     fn handle_response(
 | |
|         &self,
 | |
|         data: &PaymentsSyncRouterData,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|         res: Response,
 | |
|     ) -> CustomResult<PaymentsSyncRouterData, errors::ConnectorError> {
 | |
|         let response: {{project-name | downcase}}:: {{project-name | downcase | pascal_case}}PaymentsResponse = res
 | |
|             .response
 | |
|             .parse_struct("{{project-name | downcase}} PaymentsSyncResponse")
 | |
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
|         RouterData::try_from(ResponseRouterData {
 | |
|             response,
 | |
|             data: data.clone(),
 | |
|             http_code: res.status_code,
 | |
|         })
 | |
|     }
 | |
| 
 | |
|     fn get_error_response(
 | |
|         &self,
 | |
|         res: Response,
 | |
|         event_builder: Option<&mut ConnectorEvent>
 | |
|     ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
 | |
|         self.build_error_response(res, event_builder)
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         Capture,
 | |
|         PaymentsCaptureData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}}
 | |
| {
 | |
|     fn get_headers(
 | |
|         &self,
 | |
|         req: &PaymentsCaptureRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Vec<(String, masking::Maskable<String>)>, errors::ConnectorError> {
 | |
|         self.build_headers(req, connectors)
 | |
|     }
 | |
| 
 | |
|     fn get_content_type(&self) -> &'static str {
 | |
|         self.common_get_content_type()
 | |
|     }
 | |
| 
 | |
|     fn get_url(
 | |
|         &self,
 | |
|         _req: &PaymentsCaptureRouterData,
 | |
|         _connectors: &Connectors,
 | |
|     ) -> CustomResult<String, errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn get_request_body(
 | |
|         &self,
 | |
|         _req: &PaymentsCaptureRouterData,
 | |
|         _connectors: &Connectors,
 | |
|     ) -> CustomResult<RequestContent, errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_request_body method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn build_request(
 | |
|         &self,
 | |
|         req: &PaymentsCaptureRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Option<Request>, errors::ConnectorError> {
 | |
|         Ok(Some(
 | |
|             RequestBuilder::new()
 | |
|                 .method(Method::Post)
 | |
|                 .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?)
 | |
|                 .attach_default_headers()
 | |
|                 .headers(types::PaymentsCaptureType::get_headers(
 | |
|                     self, req, connectors,
 | |
|                 )?)
 | |
|                 .set_body(types::PaymentsCaptureType::get_request_body(self, req, connectors)?)
 | |
|                 .build(),
 | |
|         ))
 | |
|     }
 | |
| 
 | |
|     fn handle_response(
 | |
|         &self,
 | |
|         data: &PaymentsCaptureRouterData,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|         res: Response,
 | |
|     ) -> CustomResult<PaymentsCaptureRouterData, errors::ConnectorError> {
 | |
|         let response: {{project-name | downcase }}::{{project-name | downcase | pascal_case}}PaymentsResponse = res
 | |
|             .response
 | |
|             .parse_struct("{{project-name | downcase | pascal_case}} PaymentsCaptureResponse")
 | |
|             .change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
|         RouterData::try_from(ResponseRouterData {
 | |
|             response,
 | |
|             data: data.clone(),
 | |
|             http_code: res.status_code,
 | |
|         })
 | |
|     }
 | |
| 
 | |
|     fn get_error_response(
 | |
|         &self,
 | |
|         res: Response,
 | |
|         event_builder: Option<&mut ConnectorEvent>
 | |
|     ) -> CustomResult<ErrorResponse, errors::ConnectorError> {
 | |
|         self.build_error_response(res, event_builder)
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         Void,
 | |
|         PaymentsCancelData,
 | |
|         PaymentsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}}
 | |
| {}
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<
 | |
|         Execute,
 | |
|         RefundsData,
 | |
|         RefundsResponseData,
 | |
|     > for {{project-name | downcase | pascal_case}} {
 | |
|     fn get_headers(&self, req: &RefundsRouterData<Execute>, connectors: &Connectors,) -> CustomResult<Vec<(String,masking::Maskable<String>)>,errors::ConnectorError> {
 | |
|         self.build_headers(req, connectors)
 | |
|     }
 | |
| 
 | |
|     fn get_content_type(&self) -> &'static str {
 | |
|         self.common_get_content_type()
 | |
|     }
 | |
| 
 | |
|     fn get_url(&self, _req: &RefundsRouterData<Execute>, _connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn get_request_body(&self, req: &RefundsRouterData<Execute>, _connectors: &Connectors,) -> CustomResult<RequestContent, errors::ConnectorError> {
 | |
|         let refund_amount = utils::convert_amount(
 | |
|             self.amount_converter,
 | |
|             req.request.minor_refund_amount,
 | |
|             req.request.currency,
 | |
|         )?;
 | |
| 
 | |
|         let connector_router_data =
 | |
|             {{project-name | downcase}}::{{project-name | downcase | pascal_case}}RouterData::from((
 | |
|                 refund_amount,
 | |
|                 req,
 | |
|             ));
 | |
|         let connector_req = {{project-name | downcase}}::{{project-name | downcase | pascal_case}}RefundRequest::try_from(&connector_router_data)?;
 | |
|         Ok(RequestContent::Json(Box::new(connector_req)))
 | |
|     }
 | |
| 
 | |
|     fn build_request(&self, req: &RefundsRouterData<Execute>, connectors: &Connectors,) -> CustomResult<Option<Request>,errors::ConnectorError> {
 | |
|         let request = RequestBuilder::new()
 | |
|             .method(Method::Post)
 | |
|             .url(&types::RefundExecuteType::get_url(self, req, connectors)?)
 | |
|             .attach_default_headers()
 | |
|             .headers(types::RefundExecuteType::get_headers(self, req, connectors)?)
 | |
|             .set_body(types::RefundExecuteType::get_request_body(self, req, connectors)?)
 | |
|             .build();
 | |
|         Ok(Some(request))
 | |
|     }
 | |
| 
 | |
|     fn handle_response(
 | |
|         &self,
 | |
|         data: &RefundsRouterData<Execute>,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|         res: Response,
 | |
|     ) -> CustomResult<RefundsRouterData<Execute>,errors::ConnectorError> {
 | |
|         let response: {{project-name| downcase}}::RefundResponse = res.response.parse_struct("{{project-name | downcase}} RefundResponse").change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
|         RouterData::try_from(ResponseRouterData {
 | |
|             response,
 | |
|             data: data.clone(),
 | |
|             http_code: res.status_code,
 | |
|         })
 | |
|     }
 | |
| 
 | |
|     fn get_error_response(&self, res: Response, event_builder: Option<&mut ConnectorEvent>) -> CustomResult<ErrorResponse,errors::ConnectorError> {
 | |
|         self.build_error_response(res, event_builder)
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl
 | |
|     ConnectorIntegration<RSync, RefundsData, RefundsResponseData> for {{project-name | downcase | pascal_case}} {
 | |
|     fn get_headers(&self, req: &RefundSyncRouterData,connectors: &Connectors,) -> CustomResult<Vec<(String, masking::Maskable<String>)>,errors::ConnectorError> {
 | |
|         self.build_headers(req, connectors)
 | |
|     }
 | |
| 
 | |
|     fn get_content_type(&self) -> &'static str {
 | |
|         self.common_get_content_type()
 | |
|     }
 | |
| 
 | |
|     fn get_url(&self, _req: &RefundSyncRouterData,_connectors: &Connectors,) -> CustomResult<String,errors::ConnectorError> {
 | |
|         Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into())
 | |
|     }
 | |
| 
 | |
|     fn build_request(
 | |
|         &self,
 | |
|         req: &RefundSyncRouterData,
 | |
|         connectors: &Connectors,
 | |
|     ) -> CustomResult<Option<Request>, errors::ConnectorError> {
 | |
|         Ok(Some(
 | |
|             RequestBuilder::new()
 | |
|                 .method(Method::Get)
 | |
|                 .url(&types::RefundSyncType::get_url(self, req, connectors)?)
 | |
|                 .attach_default_headers()
 | |
|                 .headers(types::RefundSyncType::get_headers(self, req, connectors)?)
 | |
|                 .set_body(types::RefundSyncType::get_request_body(self, req, connectors)?)
 | |
|                 .build(),
 | |
|         ))
 | |
|     }
 | |
| 
 | |
|     fn handle_response(
 | |
|         &self,
 | |
|         data: &RefundSyncRouterData,
 | |
|         event_builder: Option<&mut ConnectorEvent>,
 | |
|         res: Response,
 | |
|     ) -> CustomResult<RefundSyncRouterData,errors::ConnectorError,> {
 | |
|         let response: {{project-name | downcase}}::RefundResponse = res.response.parse_struct("{{project-name | downcase}} RefundSyncResponse").change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
 | |
|         event_builder.map(|i| i.set_response_body(&response));
 | |
|         router_env::logger::info!(connector_response=?response);
 | |
|         RouterData::try_from(ResponseRouterData {
 | |
|             response,
 | |
|             data: data.clone(),
 | |
|             http_code: res.status_code,
 | |
|         })
 | |
|     }
 | |
| 
 | |
|     fn get_error_response(&self, res: Response, event_builder: Option<&mut ConnectorEvent>) -> CustomResult<ErrorResponse,errors::ConnectorError> {
 | |
|         self.build_error_response(res, event_builder)
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[async_trait::async_trait]
 | |
| impl webhooks::IncomingWebhook for {{project-name | downcase | pascal_case}} {
 | |
|     fn get_webhook_object_reference_id(
 | |
|         &self,
 | |
|         _request: &webhooks::IncomingWebhookRequestDetails<'_>,
 | |
|     ) -> CustomResult<api_models::webhooks::ObjectReferenceId, errors::ConnectorError> {
 | |
|         Err(report!(errors::ConnectorError::WebhooksNotImplemented))
 | |
|     }
 | |
| 
 | |
|     fn get_webhook_event_type(
 | |
|         &self,
 | |
|         _request: &webhooks::IncomingWebhookRequestDetails<'_>,
 | |
|     ) -> CustomResult<api_models::webhooks::IncomingWebhookEvent, errors::ConnectorError> {
 | |
|         Err(report!(errors::ConnectorError::WebhooksNotImplemented))
 | |
|     }
 | |
| 
 | |
|     fn get_webhook_resource_object(
 | |
|         &self,
 | |
|         _request: &webhooks::IncomingWebhookRequestDetails<'_>,
 | |
|     ) -> CustomResult<Box<dyn masking::ErasedMaskSerialize>, errors::ConnectorError> {
 | |
|         Err(report!(errors::ConnectorError::WebhooksNotImplemented))
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl ConnectorSpecifications for {{project-name | downcase | pascal_case}} {}
 | |
|    
 |