use reqwest::Method;
use crate::client::Bkash;
use crate::config::Product;
use crate::error::Error;
use crate::models::auth_capture::{
CaptureRequest, CaptureResponse, CreatePaymentRequest, CreatePaymentResponse,
ExecutePaymentResponse, QueryPaymentRequest, QueryPaymentResponse, SearchTransactionResponse,
VoidRequest, VoidResponse,
};
use crate::models::token::{GrantTokenRequest, RefreshTokenRequest, TokenResponse};
use crate::token::TokenTransport;
#[derive(Debug, Clone, Copy)]
pub struct AuthCaptureClient<'a> {
client: &'a Bkash,
}
impl<'a> AuthCaptureClient<'a> {
#[must_use]
pub(crate) fn new(client: &'a Bkash) -> Self {
Self { client }
}
pub async fn grant_token(&self, req: GrantTokenRequest) -> Result<TokenResponse, Error> {
self.client
.transport()
.execute_raw(
Product::AuthCapture,
Method::POST,
Product::AuthCapture.token_path(),
Some(&req),
)
.await
}
pub async fn refresh_token(&self, req: RefreshTokenRequest) -> Result<TokenResponse, Error> {
self.client
.transport()
.execute_raw(
Product::AuthCapture,
Method::POST,
Product::AuthCapture.token_refresh_path(),
Some(&req),
)
.await
}
pub async fn create_payment(
&self,
req: CreatePaymentRequest,
) -> Result<CreatePaymentResponse, Error> {
self.client
.transport()
.request(
Product::AuthCapture,
Method::POST,
"tokenized/checkout/payment/create",
Some(&req),
)
.await
}
pub async fn execute_payment(&self, payment_id: &str) -> Result<ExecutePaymentResponse, Error> {
let path = format!("tokenized/checkout/execute/{payment_id}");
self.client
.transport()
.request_path(Product::AuthCapture, Method::POST, path, None::<&()>)
.await
}
pub async fn query_payment(&self, payment_id: &str) -> Result<QueryPaymentResponse, Error> {
let req = QueryPaymentRequest::new(payment_id);
self.client
.transport()
.request(
Product::AuthCapture,
Method::POST,
"tokenized/checkout/payment/status",
Some(&req),
)
.await
}
pub async fn capture(&self, payment_id: &str) -> Result<CaptureResponse, Error> {
let req = CaptureRequest::new(payment_id);
self.client
.transport()
.request(
Product::AuthCapture,
Method::POST,
"tokenized/checkout/payment/confirm/capture",
Some(&req),
)
.await
}
pub async fn void(&self, payment_id: &str) -> Result<VoidResponse, Error> {
let req = VoidRequest::new(payment_id);
self.client
.transport()
.request(
Product::AuthCapture,
Method::POST,
"tokenized/checkout/payment/confirm/capture/void",
Some(&req),
)
.await
}
pub async fn search_transaction(
&self,
trx_id: &str,
) -> Result<SearchTransactionResponse, Error> {
let path = format!("checkout/payment/search/{trx_id}");
self.client
.transport()
.request_path(Product::AuthCapture, Method::GET, path, None::<&()>)
.await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn client_is_copy() {
fn assert_copy<T: Copy>() {}
assert_copy::<AuthCaptureClient<'_>>();
}
}