paystack/endpoints/
transaction_split.rs1use super::PAYSTACK_BASE_URL;
7use crate::{
8    DeleteSubAccountBody, HttpClient, PaystackAPIError, PaystackResult, Response, SubaccountBody,
9    TransactionSplitRequest, TransactionSplitResponseData, UpdateTransactionSplitRequest,
10};
11use std::sync::Arc;
12
13#[derive(Debug, Clone)]
15pub struct TransactionSplitEndpoints<T: HttpClient + Default> {
16    key: String,
18    base_url: String,
20    http: Arc<T>,
22}
23
24impl<T: HttpClient + Default> TransactionSplitEndpoints<T> {
25    pub fn new(key: Arc<String>, http: Arc<T>) -> TransactionSplitEndpoints<T> {
34        let base_url = format!("{PAYSTACK_BASE_URL}/split");
35        TransactionSplitEndpoints {
36            key: key.to_string(),
37            base_url,
38            http,
39        }
40    }
41
42    pub async fn create_transaction_split(
51        &self,
52        split_body: TransactionSplitRequest,
53    ) -> PaystackResult<TransactionSplitResponseData> {
54        let url = &self.base_url;
55        let body = serde_json::to_value(split_body)
56            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
57
58        let response = self
59            .http
60            .post(url, &self.key, &body)
61            .await
62            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
63
64        let parsed_response: Response<TransactionSplitResponseData> =
65            serde_json::from_str(&response)
66                .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
67        Ok(parsed_response)
68    }
69
70    pub async fn list_transaction_splits(
79        &self,
80        split_name: Option<&str>,
81        split_active: Option<bool>,
82    ) -> PaystackResult<Vec<TransactionSplitResponseData>> {
83        let url = &self.base_url;
84
85        let split_active = match split_active {
87            Some(active) => active.to_string(),
88            None => "".to_string(),
89        };
90
91        let query = vec![
92            ("name", split_name.unwrap_or("")),
93            ("active", &split_active),
94        ];
95
96        let response = self
97            .http
98            .get(url, &self.key, Some(&query))
99            .await
100            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
101
102        let parsed_response: Response<Vec<TransactionSplitResponseData>> =
103            serde_json::from_str(&response)
104                .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
105
106        Ok(parsed_response)
107    }
108
109    pub async fn fetch_transaction_split(
117        &self,
118        split_id: &str,
119    ) -> PaystackResult<TransactionSplitResponseData> {
120        let url = format!("{}/{}", self.base_url, split_id);
121
122        let response = self
123            .http
124            .get(&url, &self.key, None)
125            .await
126            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
127
128        let parsed_response: Response<TransactionSplitResponseData> =
129            serde_json::from_str(&response)
130                .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
131
132        Ok(parsed_response)
133    }
134
135    pub async fn update_transaction_split(
145        &self,
146        split_id: &str,
147        update_body: UpdateTransactionSplitRequest,
148    ) -> PaystackResult<TransactionSplitResponseData> {
149        let url = format!("{}/{}", self.base_url, split_id);
150        let body = serde_json::to_value(update_body)
151            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
152
153        let response = self
154            .http
155            .put(&url, &self.key, &body)
156            .await
157            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
158
159        let parsed_response: Response<TransactionSplitResponseData> =
160            serde_json::from_str(&response)
161                .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
162        Ok(parsed_response)
163    }
164
165    pub async fn add_or_update_subaccount_split(
175        &self,
176        split_id: &str,
177        body: SubaccountBody,
178    ) -> PaystackResult<TransactionSplitResponseData> {
179        let url = format!("{}/{}/subaccount/add", self.base_url, split_id);
180        let body = serde_json::to_value(body)
181            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
182
183        let response = self
184            .http
185            .post(&url, &self.key, &body)
186            .await
187            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
188
189        let parsed_response: Response<TransactionSplitResponseData> =
190            serde_json::from_str(&response)
191                .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
192
193        Ok(parsed_response)
194    }
195
196    pub async fn remove_subaccount_from_transaction_split(
206        &self,
207        split_id: &str,
208        subaccount: DeleteSubAccountBody,
209    ) -> PaystackResult<String> {
210        let url = format!("{}/{}/subaccount/remove", self.base_url, split_id);
211        let body = serde_json::to_value(subaccount)
212            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
213
214        let response = self
215            .http
216            .post(&url, &self.key, &body)
217            .await
218            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
219
220        let parsed_response: Response<String> = serde_json::from_str(&response)
221            .map_err(|e| PaystackAPIError::TransactionSplit(e.to_string()))?;
222
223        Ok(parsed_response)
224    }
225}