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!("{}/split", PAYSTACK_BASE_URL);
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}