remoteit_api/
api_blocking.rs1use crate::auth::{build_auth_header, get_date};
8use crate::operations::{
9 CancelJob, DeleteFile, DeleteFileVersion, DeviceState, GetApplicationTypes, GetDevices,
10 GetFiles, GetJobs, GetOrganizationSelfMembership, GetOwnedOrganization, StartJob, cancel_job,
11 delete_file, delete_file_version, get_application_types, get_devices, get_files, get_jobs,
12 get_organization_self_membership, get_owned_organization, start_job,
13};
14use crate::{BASE_URL, GRAPHQL_PATH, R3Client};
15use bon::bon;
16use graphql_client::{GraphQLQuery, QueryBody, Response};
17use reqwest::Method;
18use reqwest::blocking::Client;
19use serde::{Deserialize, Serialize};
20use std::error::Error;
21
22#[bon]
24impl R3Client {
25 pub fn send_remoteit_graphql_request<V: Serialize, R: for<'a> Deserialize<'a>>(
33 &self,
34 query_body: &QueryBody<V>,
35 ) -> Result<Response<R>, Box<dyn Error>> {
36 let date = get_date();
37 let auth_header = build_auth_header()
38 .key_id(self.credentials.access_key_id())
39 .key(self.credentials.key())
40 .content_type("application/json")
41 .method(&Method::POST)
42 .path(GRAPHQL_PATH)
43 .date(&date)
44 .call();
45 let client = Client::new();
46 let response = client
47 .post(format!("{BASE_URL}{GRAPHQL_PATH}"))
48 .header("Date", date)
49 .header("Content-Type", "application/json")
50 .header("Authorization", auth_header)
51 .json(&query_body)
52 .send()?;
53 let response: Response<R> = response.json()?;
54 Ok(response)
55 }
56
57 #[builder]
61 pub fn get_files(
62 &self,
63 org_id: Option<String>,
65 ) -> Result<Response<get_files::ResponseData>, Box<dyn Error>> {
66 let request_body = GetFiles::build_query(get_files::Variables { org_id });
67 self.send_remoteit_graphql_request(&request_body)
68 }
69
70 #[builder]
72 pub fn delete_file(
73 &self,
74 file_id: String,
77 ) -> Result<Response<delete_file::ResponseData>, Box<dyn Error>> {
78 let request_body = DeleteFile::build_query(delete_file::Variables { file_id });
79 self.send_remoteit_graphql_request(&request_body)
80 }
81
82 #[builder]
84 pub fn delete_file_version(
85 &self,
86 file_version_id: String,
89 ) -> Result<Response<delete_file_version::ResponseData>, Box<dyn Error>> {
90 let request_body =
91 DeleteFileVersion::build_query(delete_file_version::Variables { file_version_id });
92 self.send_remoteit_graphql_request(&request_body)
93 }
94
95 #[builder]
97 pub fn start_job(
98 &self,
99 file_id: String,
103 device_ids: Vec<String>,
106 #[builder(default)]
110 arguments: Vec<start_job::ArgumentInput>,
111 ) -> Result<Response<start_job::ResponseData>, Box<dyn Error>> {
112 let request_body = StartJob::build_query(start_job::Variables {
113 file_id,
114 device_ids,
115 arguments,
116 });
117 self.send_remoteit_graphql_request(&request_body)
118 }
119
120 #[builder]
122 pub fn cancel_job(
123 &self,
124 job_id: String,
127 ) -> Result<Response<cancel_job::ResponseData>, Box<dyn Error>> {
128 let request_body = CancelJob::build_query(cancel_job::Variables { job_id });
129 self.send_remoteit_graphql_request(&request_body)
130 }
131
132 #[builder]
134 pub fn get_jobs(
135 &self,
136 org_id: Option<String>,
138 limit: Option<i64>,
140 job_id_filter: Option<Vec<String>>,
142 status_filter: Option<Vec<get_jobs::JobStatusEnum>>,
144 ) -> Result<Response<get_jobs::ResponseData>, Box<dyn Error>> {
145 let request_body = GetJobs::build_query(get_jobs::Variables {
146 org_id,
147 limit,
148 job_ids: job_id_filter,
149 statuses: status_filter,
150 });
151 self.send_remoteit_graphql_request(&request_body)
152 }
153
154 #[builder]
162 pub fn get_owned_organization(
163 &self,
164 ) -> Result<Response<get_owned_organization::ResponseData>, Box<dyn Error>> {
165 let request_body = GetOwnedOrganization::build_query(get_owned_organization::Variables {});
166 self.send_remoteit_graphql_request(&request_body)
167 }
168
169 #[builder]
174 pub fn get_organization_self_membership(
175 &self,
176 ) -> Result<Response<get_organization_self_membership::ResponseData>, Box<dyn Error>> {
177 let request_body = GetOrganizationSelfMembership::build_query(
178 get_organization_self_membership::Variables {},
179 );
180 self.send_remoteit_graphql_request(&request_body)
181 }
182 #[builder]
187 pub fn get_application_types(
188 &self,
189 ) -> Result<Response<get_application_types::ResponseData>, Box<dyn Error>> {
190 let request_body = GetApplicationTypes::build_query(get_application_types::Variables {});
191 self.send_remoteit_graphql_request(&request_body)
192 }
193
194 #[builder]
196 pub fn get_devices(
197 &self,
198 org_id: Option<String>,
200 limit: Option<i64>,
202 offset: Option<i64>,
204 state: Option<DeviceState>,
206 ) -> Result<Response<get_devices::ResponseData>, Box<dyn Error>> {
207 let request_body = GetDevices::build_query(get_devices::Variables {
208 org_id,
209 limit,
210 offset,
211 state: state.map(|s| s.to_string()),
212 });
213 self.send_remoteit_graphql_request(&request_body)
214 }
215
216 }
218
219#[cfg(test)]
220mod tests {
221 use super::*;
222 use crate::credentials::Credentials;
223 use std::path::PathBuf;
224
225 fn get_credentials() -> Credentials {
226 Credentials::load_from_disk()
227 .custom_credentials_path(PathBuf::from(".env.remoteit"))
228 .call()
229 .unwrap()
230 .take_profile("default")
231 .unwrap()
232 .unwrap()
233 }
234
235 fn get_client() -> R3Client {
236 R3Client::builder().credentials(get_credentials()).build()
237 }
238
239 #[test]
240 fn test_get_files() {
241 let response = get_client().get_files().call().unwrap();
242 assert!(response.data.is_some());
243 assert!(response.errors.is_none());
244 }
245
246 #[test]
247 fn test_get_jobs() {
248 let response = get_client().get_jobs().limit(1).call().unwrap();
249 assert!(response.data.is_some());
250 assert!(response.errors.is_none());
251 }
252
253 #[test]
254 fn test_get_jobs_with_filters() {
255 let response = get_client()
256 .get_jobs()
257 .job_id_filter(vec!["foobar".to_string()])
258 .status_filter(vec![get_jobs::JobStatusEnum::SUCCESS])
259 .call()
260 .unwrap();
261 assert!(response.data.is_some());
262 assert!(response.errors.is_none());
263 }
264
265 #[test]
266 fn test_get_application_types() {
267 let response = get_client().get_application_types().call().unwrap();
268 dbg!(&response);
269 assert!(response.data.is_some());
270 assert!(response.errors.is_none());
271 }
272
273 #[test]
274 fn test_get_devices() {
275 let response = get_client().get_devices().call().unwrap();
276 assert!(response.data.is_some());
277 assert!(response.errors.is_none());
278 }
279}