midtransclient 0.1.2

Unofficial Rust API client/library for Midtrans Payment API
Documentation
//! Transactions

use std::{collections::HashMap};
use reqwest::Method;
use serde_json::Value;
use crate::{MidtransError, ApiConfig, http_client::MidtransClient};

type MidtransResult = Result<HashMap<String, Value>, MidtransError>;

pub trait Transactions: MidtransClient {
    fn get_api_config(&self) -> &ApiConfig;

    fn set_api_config(&mut self, api_config: ApiConfig);

    fn status(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/status",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::GET,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn statusb2b(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/status/b2b",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::GET,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn approve(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/approve",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn deny(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/deny",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn cancel(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/cancel",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn expire(&self, transaction_id: String) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/expire",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            "",
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn refund(&self, transaction_id: String, parameters: &str) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/refund",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            parameters,
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn refund_direct(&self, transaction_id: String, parameters: &str) -> MidtransResult {
        let api_url = format!(
            "{}/v2/{}/refund/online/direct",
            self.get_api_config().get_core_api_base_url(),
            transaction_id
        );

        let response = self.request(
            Method::POST,
            self.get_api_config().get_server_key(),
            &api_url,
            parameters,
            self.get_api_config().get_custom_headers().clone(),
            self.get_api_config().get_proxies().clone()
        )?;

        Ok(response)
    }

    fn notification_from_json(&self, notification: HashMap<String, Value>) -> MidtransResult {
        let transaction_id = notification["transaction_id"].as_str().unwrap();
        self.status(transaction_id.to_string())
    }

    fn notification_from_str(&self, notification: &str) -> MidtransResult {
        let notification: HashMap<String, Value> = serde_json::from_str(notification)?;
        self.notification_from_json(notification)
    }
}