files_sdk/admin/
invoices.rs1use crate::{FilesClient, PaginationInfo, Result};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct InvoiceLineItemEntity {
11 #[serde(skip_serializing_if = "Option::is_none")]
13 pub id: Option<i64>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
17 pub amount: Option<f64>,
18
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub created_at: Option<String>,
22
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub description: Option<String>,
26
27 #[serde(skip_serializing_if = "Option::is_none")]
29 pub r#type: Option<String>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub service_end_at: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub service_start_at: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub plan: Option<String>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub site: Option<String>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct AccountLineItemEntity {
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub id: Option<i64>,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub amount: Option<f64>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub balance: Option<f64>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub created_at: Option<String>,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub currency: Option<String>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub download_uri: Option<String>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub invoice_line_items: Option<Vec<InvoiceLineItemEntity>>,
78}
79
80pub struct InvoiceHandler {
82 client: FilesClient,
83}
84
85impl InvoiceHandler {
86 pub fn new(client: FilesClient) -> Self {
88 Self { client }
89 }
90
91 pub async fn list(
112 &self,
113 cursor: Option<&str>,
114 per_page: Option<i64>,
115 ) -> Result<(Vec<AccountLineItemEntity>, PaginationInfo)> {
116 let mut params = vec![];
117 if let Some(c) = cursor {
118 params.push(("cursor", c.to_string()));
119 }
120 if let Some(pp) = per_page {
121 params.push(("per_page", pp.to_string()));
122 }
123
124 let query = if params.is_empty() {
125 String::new()
126 } else {
127 format!(
128 "?{}",
129 params
130 .iter()
131 .map(|(k, v)| format!("{}={}", k, v))
132 .collect::<Vec<_>>()
133 .join("&")
134 )
135 };
136
137 let response = self.client.get_raw(&format!("/invoices{}", query)).await?;
138 let invoices: Vec<AccountLineItemEntity> = serde_json::from_value(response)?;
139
140 let pagination = PaginationInfo {
141 cursor_next: None,
142 cursor_prev: None,
143 };
144
145 Ok((invoices, pagination))
146 }
147
148 pub async fn get(&self, id: i64) -> Result<AccountLineItemEntity> {
153 let response = self.client.get_raw(&format!("/invoices/{}", id)).await?;
154 Ok(serde_json::from_value(response)?)
155 }
156}
157
158#[cfg(test)]
159mod tests {
160 use super::*;
161
162 #[test]
163 fn test_handler_creation() {
164 let client = FilesClient::builder().api_key("test-key").build().unwrap();
165 let _handler = InvoiceHandler::new(client);
166 }
167}