1use super::types::*;
4use crate::client::Client;
5use crate::error::{self, Error, Result};
6
7pub struct QueriesApi<'a> {
9 client: &'a Client,
10}
11
12impl<'a> QueriesApi<'a> {
13 pub(crate) fn new(client: &'a Client) -> Self {
14 Self { client }
15 }
16
17 pub async fn create(&self, request: &CreateQueryRequest) -> Result<CreateQueryResponse> {
19 let url = format!("{}/v1/query", self.client.base_url());
20 let response = self.client.http().post(&url).json(request).send().await?;
21
22 if response.status().is_success() {
23 Ok(response.json().await?)
24 } else {
25 let status = response.status().as_u16();
26 let message = response.text().await.unwrap_or_default();
27 Err(Error::api(status, message))
28 }
29 }
30
31 pub async fn get(&self, query_id: i64) -> Result<Query> {
33 let url = format!("{}/v1/query/{}", self.client.base_url(), query_id);
34 let response = self.client.http().get(&url).send().await?;
35
36 if response.status().is_success() {
37 Ok(response.json().await?)
38 } else if response.status() == 404 {
39 Err(error::not_found(format!("Query {}", query_id)))
40 } else {
41 let status = response.status().as_u16();
42 let message = response.text().await.unwrap_or_default();
43 Err(Error::api(status, message))
44 }
45 }
46
47 pub async fn update(
49 &self,
50 query_id: i64,
51 request: &UpdateQueryRequest,
52 ) -> Result<UpdateQueryResponse> {
53 let url = format!("{}/v1/query/{}", self.client.base_url(), query_id);
54 let response = self.client.http().patch(&url).json(request).send().await?;
55
56 if response.status().is_success() {
57 Ok(response.json().await?)
58 } else if response.status() == 404 {
59 Err(error::not_found(format!("Query {}", query_id)))
60 } else {
61 let status = response.status().as_u16();
62 let message = response.text().await.unwrap_or_default();
63 Err(Error::api(status, message))
64 }
65 }
66
67 pub async fn list(&self) -> Result<ListQueriesResponse> {
69 self.list_with_options(&ListQueriesOptions::default()).await
70 }
71
72 pub async fn list_with_options(
74 &self,
75 options: &ListQueriesOptions,
76 ) -> Result<ListQueriesResponse> {
77 let url = format!(
78 "{}/v1/queries{}",
79 self.client.base_url(),
80 options.to_query_string()
81 );
82 let response = self.client.http().get(&url).send().await?;
83
84 if response.status().is_success() {
85 Ok(response.json().await?)
86 } else {
87 let status = response.status().as_u16();
88 let message = response.text().await.unwrap_or_default();
89 Err(Error::api(status, message))
90 }
91 }
92
93 pub async fn archive(&self, query_id: i64) -> Result<()> {
95 let url = format!("{}/v1/query/{}/archive", self.client.base_url(), query_id);
96 let response = self.client.http().post(&url).send().await?;
97
98 if response.status().is_success() {
99 Ok(())
100 } else if response.status() == 404 {
101 Err(error::not_found(format!("Query {}", query_id)))
102 } else {
103 let status = response.status().as_u16();
104 let message = response.text().await.unwrap_or_default();
105 Err(Error::api(status, message))
106 }
107 }
108
109 pub async fn unarchive(&self, query_id: i64) -> Result<()> {
111 let url = format!("{}/v1/query/{}/unarchive", self.client.base_url(), query_id);
112 let response = self.client.http().post(&url).send().await?;
113
114 if response.status().is_success() {
115 Ok(())
116 } else if response.status() == 404 {
117 Err(error::not_found(format!("Query {}", query_id)))
118 } else {
119 let status = response.status().as_u16();
120 let message = response.text().await.unwrap_or_default();
121 Err(Error::api(status, message))
122 }
123 }
124
125 pub async fn make_private(&self, query_id: i64) -> Result<()> {
127 let url = format!("{}/v1/query/{}/private", self.client.base_url(), query_id);
128 let response = self.client.http().post(&url).send().await?;
129
130 if response.status().is_success() {
131 Ok(())
132 } else if response.status() == 404 {
133 Err(error::not_found(format!("Query {}", query_id)))
134 } else {
135 let status = response.status().as_u16();
136 let message = response.text().await.unwrap_or_default();
137 Err(Error::api(status, message))
138 }
139 }
140
141 pub async fn make_public(&self, query_id: i64) -> Result<()> {
143 let url = format!("{}/v1/query/{}/unprivate", self.client.base_url(), query_id);
144 let response = self.client.http().post(&url).send().await?;
145
146 if response.status().is_success() {
147 Ok(())
148 } else if response.status() == 404 {
149 Err(error::not_found(format!("Query {}", query_id)))
150 } else {
151 let status = response.status().as_u16();
152 let message = response.text().await.unwrap_or_default();
153 Err(Error::api(status, message))
154 }
155 }
156}