1use crate::{Client, APIResult, user::User, error::error_from_response, NoSpecificError};
4
5use reqwest::Method;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(rename_all = "PascalCase")]
11pub struct Ticket {
12 pub id: i64,
14 pub status: Option<String>,
16 pub subject: Option<String>,
18 #[serde(default)]
20 pub comments: Vec<TicketComment>,
21}
22
23#[derive(Debug, Clone, Deserialize, Serialize)]
25#[serde(rename_all = "PascalCase")]
26pub struct TicketComment {
27 id: i64,
29 #[serde(rename = "type")]
31 typ: Option<String>,
32 body: Option<String>,
34 html_body: String,
36 public: bool,
38 author_id: i64,
40 created_at: time::OffsetDateTime,
42 user: User,
44}
45
46#[derive(Debug, Clone, Deserialize, Serialize)]
48#[serde(rename_all = "PascalCase")]
49pub struct ListTickets {
50 pub items: Vec<Ticket>,
52 pub current_page: i32,
54 total_items: i32,
55 pub has_more_items: bool,
57}
58
59async fn inner_list_tickets(client: &Client, page: i32, per_page: i32) -> APIResult<ListTickets, NoSpecificError> {
60 let url = format!("{}/support/ticket/list?page={}&perPage={}", crate::API_BASE_URL, page, per_page);
61
62 let req = client
63 .get(&url)
64 .header("accept", "application/json")
65 .build()
66 .map_err(crate::Error::map_request_err(
67 Method::GET,
68 url.clone(),
69 ))?;
70
71 let resp = client
72 .send_logged(req)
73 .await
74 .map_err(crate::Error::map_request_err(
75 Method::GET,
76 url.clone(),
77 ))?;
78
79 let resp = error_from_response(resp)
80 .await
81 .map_err(crate::Error::map_response_err(
82 Method::GET,
83 url.clone(),
84 ))?;
85
86 resp.json()
87 .await
88 .map_err(crate::Error::map_json_err(
89 Method::GET,
90 url.clone(),
91 ))
92}
93
94pub async fn list_tickets(client: &Client, page: Option<i32>, per_page: Option<i32>) -> APIResult<ListTickets, NoSpecificError> {
105 let page = page.unwrap_or(1);
106 let per_page = per_page.unwrap_or(5);
107 inner_list_tickets(client, page, per_page).await
108}
109
110pub async fn list_all_tickets(client: &Client) -> APIResult<Vec<Ticket>, NoSpecificError> {
118 let mut page = 1;
119 let per_page = 100;
120 let mut tickets = Vec::new();
121
122 loop {
123 let resp = inner_list_tickets(client, page, per_page).await?;
124 let ListTickets { items, has_more_items, .. } = resp;
125 tickets.extend(items);
126
127 if has_more_items {
128 page += 1;
129 } else {
130 break;
131 }
132 }
133
134 Ok(tickets)
135}