use crate::{Client, APIResult, user::User, error::error_from_response, NoSpecificError};
use reqwest::Method;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct Ticket {
pub id: i64,
pub status: Option<String>,
pub subject: Option<String>,
#[serde(default)]
pub comments: Vec<TicketComment>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct TicketComment {
id: i64,
#[serde(rename = "type")]
typ: Option<String>,
body: Option<String>,
html_body: String,
public: bool,
author_id: i64,
created_at: time::OffsetDateTime,
user: User,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct ListTickets {
pub items: Vec<Ticket>,
pub current_page: i32,
total_items: i32,
pub has_more_items: bool,
}
async fn inner_list_tickets(client: &Client, page: i32, per_page: i32) -> APIResult<ListTickets, NoSpecificError> {
let url = format!("{}/support/ticket/list?page={}&perPage={}", crate::API_BASE_URL, page, per_page);
let req = client
.get(&url)
.header("accept", "application/json")
.build()
.map_err(crate::Error::map_request_err(
Method::GET,
url.clone(),
))?;
let resp = client
.send_logged(req)
.await
.map_err(crate::Error::map_request_err(
Method::GET,
url.clone(),
))?;
let resp = error_from_response(resp)
.await
.map_err(crate::Error::map_response_err(
Method::GET,
url.clone(),
))?;
resp.json()
.await
.map_err(crate::Error::map_json_err(
Method::GET,
url.clone(),
))
}
pub async fn list_tickets(client: &Client, page: Option<i32>, per_page: Option<i32>) -> APIResult<ListTickets, NoSpecificError> {
let page = page.unwrap_or(1);
let per_page = per_page.unwrap_or(5);
inner_list_tickets(client, page, per_page).await
}
pub async fn list_all_tickets(client: &Client) -> APIResult<Vec<Ticket>, NoSpecificError> {
let mut page = 1;
let per_page = 100;
let mut tickets = Vec::new();
loop {
let resp = inner_list_tickets(client, page, per_page).await?;
let ListTickets { items, has_more_items, .. } = resp;
tickets.extend(items);
if has_more_items {
page += 1;
} else {
break;
}
}
Ok(tickets)
}