paystack/endpoints/
terminal.rs1use crate::{
6    EventRequest, FetchEventStatusResponseData, FetchTerminalStatusResponseData, HttpClient,
7    PaystackAPIError, PaystackResult, Response, SendEventResponseData, TerminalData,
8    UpdateTerminalRequest,
9};
10use std::{marker::PhantomData, sync::Arc};
11
12use super::PAYSTACK_BASE_URL;
13
14#[derive(Debug, Clone)]
16pub struct TerminalEndpoints<T: HttpClient + Default> {
17    key: String,
19    base_url: String,
21    http: Arc<T>,
23}
24
25impl<T: HttpClient + Default> TerminalEndpoints<T> {
26    pub fn new(key: Arc<String>, http: Arc<T>) -> TerminalEndpoints<T> {
35        let base_url = format!("{PAYSTACK_BASE_URL}/terminal");
36        TerminalEndpoints {
37            key: key.to_string(),
38            base_url,
39            http,
40        }
41    }
42
43    pub async fn send_event(
52        &self,
53        terminal_id: String,
54        event_request: EventRequest,
55    ) -> PaystackResult<SendEventResponseData> {
56        let url = format!("{}/{}/event", self.base_url, terminal_id);
57        let body = serde_json::to_value(event_request)
58            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
59
60        let response = self
61            .http
62            .post(&url, &self.key, &body)
63            .await
64            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
65
66        let parsed_response: Response<SendEventResponseData> = serde_json::from_str(&response)
67            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
68
69        Ok(parsed_response)
70    }
71
72    pub async fn fetch_event_status(
81        &self,
82        terminal_id: String,
83        event_id: String,
84    ) -> PaystackResult<FetchEventStatusResponseData> {
85        let url = format!("{}/{}/event/{}", self.base_url, terminal_id, event_id);
86
87        let response = self
88            .http
89            .get(&url, &self.key, None)
90            .await
91            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
92
93        let parsed_response: Response<FetchEventStatusResponseData> =
94            serde_json::from_str(&response)
95                .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
96
97        Ok(parsed_response)
98    }
99
100    pub async fn fetch_terminal_status(
108        &self,
109        terminal_id: String,
110    ) -> PaystackResult<FetchTerminalStatusResponseData> {
111        let url = format!("{}/{}/presence", self.base_url, terminal_id);
112
113        let response = self
114            .http
115            .get(&url, &self.key, None)
116            .await
117            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
118
119        let parsed_response: Response<FetchTerminalStatusResponseData> =
120            serde_json::from_str(&response)
121                .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
122
123        Ok(parsed_response)
124    }
125
126    pub async fn list_terminals(&self, per_page: Option<i32>) -> PaystackResult<Vec<TerminalData>> {
134        let url = &self.base_url;
135        let per_page = per_page.unwrap_or(50).to_string();
136        let query = vec![("perPage", per_page.as_str())];
137
138        let response = self
139            .http
140            .get(url, &self.key, Some(&query))
141            .await
142            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
143
144        let parsed_response: Response<Vec<TerminalData>> = serde_json::from_str(&response)
145            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
146
147        Ok(parsed_response)
148    }
149
150    pub async fn fetch_terminal(&self, terminal_id: String) -> PaystackResult<TerminalData> {
158        let url = format!("{}/{}", self.base_url, terminal_id);
159
160        let response = self
161            .http
162            .get(&url, &self.key, None)
163            .await
164            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
165
166        let parsed_response: Response<TerminalData> = serde_json::from_str(&response)
167            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
168
169        Ok(parsed_response)
170    }
171
172    pub async fn update_terminal(
181        &self,
182        terminal_id: String,
183        update_request: UpdateTerminalRequest,
184    ) -> PaystackResult<PhantomData<String>> {
185        let url = format!("{}/{}", self.base_url, terminal_id);
186        let body = serde_json::to_value(update_request)
187            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
188
189        let response = self
190            .http
191            .put(&url, &self.key, &body)
192            .await
193            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
194
195        let parsed_response: Response<PhantomData<String>> = serde_json::from_str(&response)
196            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
197
198        Ok(parsed_response)
199    }
200
201    pub async fn commission_terminal(
209        &self,
210        serial_number: String,
211    ) -> PaystackResult<PhantomData<String>> {
212        let url = format!("{}/commission_device", self.base_url);
213        let body = serde_json::json!({
214            "serial_number": serial_number
215        });
216
217        let response = self
218            .http
219            .post(&url, &self.key, &body)
220            .await
221            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
222
223        let parsed_response: Response<PhantomData<String>> = serde_json::from_str(&response)
224            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
225
226        Ok(parsed_response)
227    }
228
229    pub async fn decommission_terminal(
237        &self,
238        serial_number: String,
239    ) -> PaystackResult<PhantomData<String>> {
240        let url = format!("{}/decommission_device", self.base_url);
241        let body = serde_json::json!({
242            "serial_number": serial_number
243        });
244
245        let response = self
246            .http
247            .post(&url, &self.key, &body)
248            .await
249            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
250
251        let parsed_response: Response<PhantomData<String>> = serde_json::from_str(&response)
252            .map_err(|e| PaystackAPIError::Terminal(e.to_string()))?;
253
254        Ok(parsed_response)
255    }
256}