1use super::*;
3use futures_util::TryStreamExt;
4use reqwest::{Client, Method, StatusCode};
5use serde::de::DeserializeOwned;
6use std::{
7 pin::Pin,
8 sync::LazyLock,
9 task::{Context, Poll},
10};
11use tokio::io::AsyncRead;
12use tokio_tungstenite::tungstenite::{Error, client::IntoClientRequest, http::HeaderValue};
13
14static CLIENT: LazyLock<Client> = LazyLock::new(|| {
15 Client::builder()
16 .user_agent("Calagopus Panel")
17 .build()
18 .expect("Failed to create reqwest client")
19});
20
21#[derive(Debug)]
22pub enum ApiHttpError {
23 Http(StatusCode, super::ApiError),
24 Reqwest(reqwest::Error),
25 WebSocket(tokio_tungstenite::tungstenite::Error),
26 MsgpackEncode(rmp_serde::encode::Error),
27 MsgpackDecode(rmp_serde::decode::Error),
28}
29
30impl From<ApiHttpError> for anyhow::Error {
31 fn from(value: ApiHttpError) -> Self {
32 match value {
33 ApiHttpError::Http(status, err) => {
34 anyhow::anyhow!("wings api status code {status}: {}", err.error)
35 }
36 ApiHttpError::Reqwest(err) => anyhow::anyhow!(err),
37 ApiHttpError::WebSocket(err) => anyhow::anyhow!(err),
38 ApiHttpError::MsgpackEncode(err) => anyhow::anyhow!(err),
39 ApiHttpError::MsgpackDecode(err) => anyhow::anyhow!(err),
40 }
41 }
42}
43
44pub struct AsyncResponseReader(Box<dyn AsyncRead + Send + Unpin>);
45
46impl AsyncRead for AsyncResponseReader {
47 fn poll_read(
48 mut self: Pin<&mut Self>,
49 cx: &mut Context<'_>,
50 buf: &mut tokio::io::ReadBuf<'_>,
51 ) -> Poll<std::io::Result<()>> {
52 Pin::new(&mut self.0).poll_read(cx, buf)
53 }
54}
55
56impl<'de> Deserialize<'de> for AsyncResponseReader {
57 fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
58 where
59 D: serde::Deserializer<'de>,
60 {
61 Ok(Self(Box::new(tokio::io::empty())))
62 }
63}
64
65async fn request_impl<T: DeserializeOwned + 'static>(
66 client: &WingsClient,
67 method: Method,
68 endpoint: impl AsRef<str>,
69 body: Option<&impl Serialize>,
70 body_raw: Option<compact_str::CompactString>,
71) -> Result<T, ApiHttpError> {
72 let url = format!(
73 "{}{}",
74 client.base_url.trim_end_matches('/'),
75 endpoint.as_ref()
76 );
77 let mut request = CLIENT.request(method, &url);
78 request = request.header("Accept", "application/msgpack");
79
80 if !client.token.is_empty() {
81 request = request.header("Authorization", format!("Bearer {}", client.token));
82 }
83
84 if let Some(body) = body {
85 request = request.header("Content-Type", "application/msgpack");
86
87 let mut bytes = Vec::new();
88 let mut se = rmp_serde::Serializer::new(&mut bytes)
89 .with_struct_map()
90 .with_human_readable();
91 if let Err(err) = body.serialize(&mut se) {
92 return Err(ApiHttpError::MsgpackEncode(err));
93 }
94 request = request.body(bytes);
95 } else if let Some(body_raw) = body_raw {
96 request = request.body(Vec::from(body_raw));
97 }
98
99 match request.send().await {
100 Ok(response) => {
101 if response.status().is_success() {
102 if std::any::type_name::<T>() == std::any::type_name::<AsyncResponseReader>() {
103 let stream = response.bytes_stream().map_err(|err| {
104 std::io::Error::other(format!("failed to read multipart field: {err}"))
105 });
106 let stream_reader = tokio_util::io::StreamReader::new(stream);
107
108 return Ok(*(Box::new(AsyncResponseReader(Box::new(stream_reader)))
109 as Box<dyn std::any::Any>)
110 .downcast::<T>()
111 .unwrap());
112 }
113
114 match response.bytes().await {
115 Ok(data) => {
116 let mut de =
117 rmp_serde::Deserializer::new(data.as_ref()).with_human_readable();
118 match T::deserialize(&mut de) {
119 Ok(data) => Ok(data),
120 Err(err) => Err(ApiHttpError::MsgpackDecode(err)),
121 }
122 }
123 Err(err) => Err(ApiHttpError::Reqwest(err)),
124 }
125 } else {
126 Err(ApiHttpError::Http(
127 response.status(),
128 match response.bytes().await {
129 Ok(data) => {
130 let mut de =
131 rmp_serde::Deserializer::new(data.as_ref()).with_human_readable();
132 match super::ApiError::deserialize(&mut de) {
133 Ok(data) => data,
134 Err(err) => super::ApiError {
135 error: err.to_string().into(),
136 },
137 }
138 }
139 Err(err) => super::ApiError {
140 error: err.to_string().into(),
141 },
142 },
143 ))
144 }
145 }
146 Err(err) => Err(ApiHttpError::Reqwest(err)),
147 }
148}
149
150pub struct WingsClient {
151 base_url: String,
152 token: String,
153}
154
155impl WingsClient {
156 #[inline]
157 pub fn new(base_url: String, token: String) -> Self {
158 Self { base_url, token }
159 }
160
161 pub fn request_raw(
162 &self,
163 method: Method,
164 endpoint: impl AsRef<str>,
165 ) -> reqwest::RequestBuilder {
166 let url = format!(
167 "{}/{}",
168 self.base_url.trim_end_matches('/'),
169 endpoint.as_ref().trim_start_matches('/')
170 );
171 let mut request = CLIENT.request(method, &url);
172
173 if !self.token.is_empty() {
174 request = request.header("Authorization", format!("Bearer {}", self.token));
175 }
176
177 request
178 }
179
180 pub async fn open_websocket(
181 &self,
182 endpoint: impl AsRef<str>,
183 headers: reqwest::header::HeaderMap,
184 ) -> Result<
185 tokio_tungstenite::WebSocketStream<
186 tokio_tungstenite::MaybeTlsStream<tokio::net::TcpStream>,
187 >,
188 ApiHttpError,
189 > {
190 let url = format!(
191 "{}{}",
192 self.base_url.trim_end_matches('/'),
193 endpoint.as_ref()
194 );
195 let url = if let Some(rest) = url.strip_prefix("https://") {
196 format!("wss://{rest}")
197 } else if let Some(rest) = url.strip_prefix("http://") {
198 format!("ws://{rest}")
199 } else {
200 url
201 };
202
203 let mut request = url.into_client_request().map_err(ApiHttpError::WebSocket)?;
204
205 if !self.token.is_empty() {
206 let value = HeaderValue::from_str(&format!("Bearer {}", self.token))
207 .map_err(|err| ApiHttpError::WebSocket(Error::HttpFormat(err.into())))?;
208 request.headers_mut().insert("Authorization", value);
209 }
210
211 for (header, value) in headers {
212 let Some(header) = header else {
213 continue;
214 };
215 request.headers_mut().insert(header, value);
216 }
217
218 let (stream, _) = tokio_tungstenite::connect_async(request)
219 .await
220 .map_err(ApiHttpError::WebSocket)?;
221
222 Ok(stream)
223 }
224
225 pub async fn delete_backups_backup(
226 &self,
227 backup: uuid::Uuid,
228 data: &super::backups_backup::delete::RequestBody,
229 ) -> Result<super::backups_backup::delete::Response, ApiHttpError> {
230 request_impl(
231 self,
232 Method::DELETE,
233 format!("/api/backups/{backup}"),
234 Some(data),
235 None,
236 )
237 .await
238 }
239
240 pub async fn post_deauthorize_user(
241 &self,
242 data: &super::deauthorize_user::post::RequestBody,
243 ) -> Result<super::deauthorize_user::post::Response, ApiHttpError> {
244 request_impl(
245 self,
246 Method::POST,
247 "/api/deauthorize-user",
248 Some(data),
249 None,
250 )
251 .await
252 }
253
254 pub async fn get_servers(&self) -> Result<super::servers::get::Response, ApiHttpError> {
255 request_impl(self, Method::GET, "/api/servers", None::<&()>, None).await
256 }
257
258 pub async fn post_servers(
259 &self,
260 data: &super::servers::post::RequestBody,
261 ) -> Result<super::servers::post::Response, ApiHttpError> {
262 request_impl(self, Method::POST, "/api/servers", Some(data), None).await
263 }
264
265 pub async fn post_servers_power(
266 &self,
267 data: &super::servers_power::post::RequestBody,
268 ) -> Result<super::servers_power::post::Response, ApiHttpError> {
269 request_impl(self, Method::POST, "/api/servers/power", Some(data), None).await
270 }
271
272 pub async fn get_servers_utilization(
273 &self,
274 ) -> Result<super::servers_utilization::get::Response, ApiHttpError> {
275 request_impl(
276 self,
277 Method::GET,
278 "/api/servers/utilization",
279 None::<&()>,
280 None,
281 )
282 .await
283 }
284
285 pub async fn get_servers_server(
286 &self,
287 server: uuid::Uuid,
288 ) -> Result<super::servers_server::get::Response, ApiHttpError> {
289 request_impl(
290 self,
291 Method::GET,
292 format!("/api/servers/{server}"),
293 None::<&()>,
294 None,
295 )
296 .await
297 }
298
299 pub async fn delete_servers_server(
300 &self,
301 server: uuid::Uuid,
302 ) -> Result<super::servers_server::delete::Response, ApiHttpError> {
303 request_impl(
304 self,
305 Method::DELETE,
306 format!("/api/servers/{server}"),
307 None::<&()>,
308 None,
309 )
310 .await
311 }
312
313 pub async fn post_servers_server_backup(
314 &self,
315 server: uuid::Uuid,
316 data: &super::servers_server_backup::post::RequestBody,
317 ) -> Result<super::servers_server_backup::post::Response, ApiHttpError> {
318 request_impl(
319 self,
320 Method::POST,
321 format!("/api/servers/{server}/backup"),
322 Some(data),
323 None,
324 )
325 .await
326 }
327
328 pub async fn delete_servers_server_backup_backup(
329 &self,
330 server: uuid::Uuid,
331 backup: uuid::Uuid,
332 ) -> Result<super::servers_server_backup_backup::delete::Response, ApiHttpError> {
333 request_impl(
334 self,
335 Method::DELETE,
336 format!("/api/servers/{server}/backup/{backup}"),
337 None::<&()>,
338 None,
339 )
340 .await
341 }
342
343 pub async fn post_servers_server_backup_backup_restore(
344 &self,
345 server: uuid::Uuid,
346 backup: uuid::Uuid,
347 data: &super::servers_server_backup_backup_restore::post::RequestBody,
348 ) -> Result<super::servers_server_backup_backup_restore::post::Response, ApiHttpError> {
349 request_impl(
350 self,
351 Method::POST,
352 format!("/api/servers/{server}/backup/{backup}/restore"),
353 Some(data),
354 None,
355 )
356 .await
357 }
358
359 pub async fn post_servers_server_commands(
360 &self,
361 server: uuid::Uuid,
362 data: &super::servers_server_commands::post::RequestBody,
363 ) -> Result<super::servers_server_commands::post::Response, ApiHttpError> {
364 request_impl(
365 self,
366 Method::POST,
367 format!("/api/servers/{server}/commands"),
368 Some(data),
369 None,
370 )
371 .await
372 }
373
374 pub async fn post_servers_server_files_chmod(
375 &self,
376 server: uuid::Uuid,
377 data: &super::servers_server_files_chmod::post::RequestBody,
378 ) -> Result<super::servers_server_files_chmod::post::Response, ApiHttpError> {
379 request_impl(
380 self,
381 Method::POST,
382 format!("/api/servers/{server}/files/chmod"),
383 Some(data),
384 None,
385 )
386 .await
387 }
388
389 pub async fn post_servers_server_files_compress(
390 &self,
391 server: uuid::Uuid,
392 data: &super::servers_server_files_compress::post::RequestBody,
393 ) -> Result<super::servers_server_files_compress::post::Response, ApiHttpError> {
394 request_impl(
395 self,
396 Method::POST,
397 format!("/api/servers/{server}/files/compress"),
398 Some(data),
399 None,
400 )
401 .await
402 }
403
404 pub async fn get_servers_server_files_contents(
405 &self,
406 server: uuid::Uuid,
407 file: &str,
408 download: bool,
409 max_size: u64,
410 ) -> Result<super::servers_server_files_contents::get::Response, ApiHttpError> {
411 let file = urlencoding::encode(file);
412 request_impl(self, Method::GET, format!("/api/servers/{server}/files/contents?file={file}&download={download}&max_size={max_size}"), None::<&()>, None).await
413 }
414
415 pub async fn post_servers_server_files_copy(
416 &self,
417 server: uuid::Uuid,
418 data: &super::servers_server_files_copy::post::RequestBody,
419 ) -> Result<super::servers_server_files_copy::post::Response, ApiHttpError> {
420 request_impl(
421 self,
422 Method::POST,
423 format!("/api/servers/{server}/files/copy"),
424 Some(data),
425 None,
426 )
427 .await
428 }
429
430 pub async fn post_servers_server_files_copy_many(
431 &self,
432 server: uuid::Uuid,
433 data: &super::servers_server_files_copy_many::post::RequestBody,
434 ) -> Result<super::servers_server_files_copy_many::post::Response, ApiHttpError> {
435 request_impl(
436 self,
437 Method::POST,
438 format!("/api/servers/{server}/files/copy-many"),
439 Some(data),
440 None,
441 )
442 .await
443 }
444
445 pub async fn post_servers_server_files_copy_remote(
446 &self,
447 server: uuid::Uuid,
448 data: &super::servers_server_files_copy_remote::post::RequestBody,
449 ) -> Result<super::servers_server_files_copy_remote::post::Response, ApiHttpError> {
450 request_impl(
451 self,
452 Method::POST,
453 format!("/api/servers/{server}/files/copy-remote"),
454 Some(data),
455 None,
456 )
457 .await
458 }
459
460 pub async fn post_servers_server_files_create_directory(
461 &self,
462 server: uuid::Uuid,
463 data: &super::servers_server_files_create_directory::post::RequestBody,
464 ) -> Result<super::servers_server_files_create_directory::post::Response, ApiHttpError> {
465 request_impl(
466 self,
467 Method::POST,
468 format!("/api/servers/{server}/files/create-directory"),
469 Some(data),
470 None,
471 )
472 .await
473 }
474
475 pub async fn post_servers_server_files_decompress(
476 &self,
477 server: uuid::Uuid,
478 data: &super::servers_server_files_decompress::post::RequestBody,
479 ) -> Result<super::servers_server_files_decompress::post::Response, ApiHttpError> {
480 request_impl(
481 self,
482 Method::POST,
483 format!("/api/servers/{server}/files/decompress"),
484 Some(data),
485 None,
486 )
487 .await
488 }
489
490 pub async fn post_servers_server_files_delete(
491 &self,
492 server: uuid::Uuid,
493 data: &super::servers_server_files_delete::post::RequestBody,
494 ) -> Result<super::servers_server_files_delete::post::Response, ApiHttpError> {
495 request_impl(
496 self,
497 Method::POST,
498 format!("/api/servers/{server}/files/delete"),
499 Some(data),
500 None,
501 )
502 .await
503 }
504
505 pub async fn get_servers_server_files_fingerprints(
506 &self,
507 server: uuid::Uuid,
508 algorithm: Algorithm,
509 files: Vec<compact_str::CompactString>,
510 ) -> Result<super::servers_server_files_fingerprints::get::Response, ApiHttpError> {
511 let files = files
512 .into_iter()
513 .map(|s| urlencoding::encode(&s).into())
514 .collect::<Vec<compact_str::CompactString>>()
515 .join("&files=");
516 request_impl(
517 self,
518 Method::GET,
519 format!("/api/servers/{server}/files/fingerprints?algorithm={algorithm}&files={files}"),
520 None::<&()>,
521 None,
522 )
523 .await
524 }
525
526 pub async fn get_servers_server_files_largest_directories(
527 &self,
528 server: uuid::Uuid,
529 directory: &str,
530 ) -> Result<super::servers_server_files_largest_directories::get::Response, ApiHttpError> {
531 let directory = urlencoding::encode(directory);
532 request_impl(
533 self,
534 Method::GET,
535 format!("/api/servers/{server}/files/largest-directories?directory={directory}"),
536 None::<&()>,
537 None,
538 )
539 .await
540 }
541
542 pub async fn get_servers_server_files_list(
543 &self,
544 server: uuid::Uuid,
545 directory: &str,
546 ignored: Vec<compact_str::CompactString>,
547 per_page: u64,
548 page: u64,
549 sort: DirectorySortingMode,
550 ) -> Result<super::servers_server_files_list::get::Response, ApiHttpError> {
551 let directory = urlencoding::encode(directory);
552 let ignored = ignored
553 .into_iter()
554 .map(|s| urlencoding::encode(&s).into())
555 .collect::<Vec<compact_str::CompactString>>()
556 .join("&ignored=");
557 request_impl(self, Method::GET, format!("/api/servers/{server}/files/list?directory={directory}&ignored={ignored}&per_page={per_page}&page={page}&sort={sort}"), None::<&()>, None).await
558 }
559
560 pub async fn get_servers_server_files_list_directory(
561 &self,
562 server: uuid::Uuid,
563 directory: &str,
564 ) -> Result<super::servers_server_files_list_directory::get::Response, ApiHttpError> {
565 let directory = urlencoding::encode(directory);
566 request_impl(
567 self,
568 Method::GET,
569 format!("/api/servers/{server}/files/list-directory?directory={directory}"),
570 None::<&()>,
571 None,
572 )
573 .await
574 }
575
576 pub async fn get_servers_server_files_operations(
577 &self,
578 server: uuid::Uuid,
579 ) -> Result<super::servers_server_files_operations::get::Response, ApiHttpError> {
580 request_impl(
581 self,
582 Method::GET,
583 format!("/api/servers/{server}/files/operations"),
584 None::<&()>,
585 None,
586 )
587 .await
588 }
589
590 pub async fn delete_servers_server_files_operations_operation(
591 &self,
592 server: uuid::Uuid,
593 operation: uuid::Uuid,
594 ) -> Result<super::servers_server_files_operations_operation::delete::Response, ApiHttpError>
595 {
596 request_impl(
597 self,
598 Method::DELETE,
599 format!("/api/servers/{server}/files/operations/{operation}"),
600 None::<&()>,
601 None,
602 )
603 .await
604 }
605
606 pub async fn get_servers_server_files_pull(
607 &self,
608 server: uuid::Uuid,
609 ) -> Result<super::servers_server_files_pull::get::Response, ApiHttpError> {
610 request_impl(
611 self,
612 Method::GET,
613 format!("/api/servers/{server}/files/pull"),
614 None::<&()>,
615 None,
616 )
617 .await
618 }
619
620 pub async fn post_servers_server_files_pull(
621 &self,
622 server: uuid::Uuid,
623 data: &super::servers_server_files_pull::post::RequestBody,
624 ) -> Result<super::servers_server_files_pull::post::Response, ApiHttpError> {
625 request_impl(
626 self,
627 Method::POST,
628 format!("/api/servers/{server}/files/pull"),
629 Some(data),
630 None,
631 )
632 .await
633 }
634
635 pub async fn post_servers_server_files_pull_query(
636 &self,
637 server: uuid::Uuid,
638 data: &super::servers_server_files_pull_query::post::RequestBody,
639 ) -> Result<super::servers_server_files_pull_query::post::Response, ApiHttpError> {
640 request_impl(
641 self,
642 Method::POST,
643 format!("/api/servers/{server}/files/pull/query"),
644 Some(data),
645 None,
646 )
647 .await
648 }
649
650 pub async fn delete_servers_server_files_pull_pull(
651 &self,
652 server: uuid::Uuid,
653 pull: uuid::Uuid,
654 ) -> Result<super::servers_server_files_pull_pull::delete::Response, ApiHttpError> {
655 request_impl(
656 self,
657 Method::DELETE,
658 format!("/api/servers/{server}/files/pull/{pull}"),
659 None::<&()>,
660 None,
661 )
662 .await
663 }
664
665 pub async fn put_servers_server_files_rename(
666 &self,
667 server: uuid::Uuid,
668 data: &super::servers_server_files_rename::put::RequestBody,
669 ) -> Result<super::servers_server_files_rename::put::Response, ApiHttpError> {
670 request_impl(
671 self,
672 Method::PUT,
673 format!("/api/servers/{server}/files/rename"),
674 Some(data),
675 None,
676 )
677 .await
678 }
679
680 pub async fn get_servers_server_files_revisions(
681 &self,
682 server: uuid::Uuid,
683 file: &str,
684 ) -> Result<super::servers_server_files_revisions::get::Response, ApiHttpError> {
685 let file = urlencoding::encode(file);
686 request_impl(
687 self,
688 Method::GET,
689 format!("/api/servers/{server}/files/revisions?file={file}"),
690 None::<&()>,
691 None,
692 )
693 .await
694 }
695
696 pub async fn get_servers_server_files_revisions_revision(
697 &self,
698 server: uuid::Uuid,
699 revision: i64,
700 ) -> Result<super::servers_server_files_revisions_revision::get::Response, ApiHttpError> {
701 request_impl(
702 self,
703 Method::GET,
704 format!("/api/servers/{server}/files/revisions/{revision}"),
705 None::<&()>,
706 None,
707 )
708 .await
709 }
710
711 pub async fn post_servers_server_files_search(
712 &self,
713 server: uuid::Uuid,
714 data: &super::servers_server_files_search::post::RequestBody,
715 ) -> Result<super::servers_server_files_search::post::Response, ApiHttpError> {
716 request_impl(
717 self,
718 Method::POST,
719 format!("/api/servers/{server}/files/search"),
720 Some(data),
721 None,
722 )
723 .await
724 }
725
726 pub async fn post_servers_server_files_write(
727 &self,
728 server: uuid::Uuid,
729 file: &str,
730 user: uuid::Uuid,
731 data: super::servers_server_files_write::post::RequestBody,
732 ) -> Result<super::servers_server_files_write::post::Response, ApiHttpError> {
733 let file = urlencoding::encode(file);
734 request_impl(
735 self,
736 Method::POST,
737 format!("/api/servers/{server}/files/write?file={file}&user={user}"),
738 None::<&()>,
739 Some(data),
740 )
741 .await
742 }
743
744 pub async fn post_servers_server_install_abort(
745 &self,
746 server: uuid::Uuid,
747 ) -> Result<super::servers_server_install_abort::post::Response, ApiHttpError> {
748 request_impl(
749 self,
750 Method::POST,
751 format!("/api/servers/{server}/install/abort"),
752 None::<&()>,
753 None,
754 )
755 .await
756 }
757
758 pub async fn get_servers_server_logs(
759 &self,
760 server: uuid::Uuid,
761 lines: u64,
762 ) -> Result<super::servers_server_logs::get::Response, ApiHttpError> {
763 request_impl(
764 self,
765 Method::GET,
766 format!("/api/servers/{server}/logs?lines={lines}"),
767 None::<&()>,
768 None,
769 )
770 .await
771 }
772
773 pub async fn get_servers_server_logs_install(
774 &self,
775 server: uuid::Uuid,
776 lines: u64,
777 ) -> Result<super::servers_server_logs_install::get::Response, ApiHttpError> {
778 request_impl(
779 self,
780 Method::GET,
781 format!("/api/servers/{server}/logs/install?lines={lines}"),
782 None::<&()>,
783 None,
784 )
785 .await
786 }
787
788 pub async fn post_servers_server_power(
789 &self,
790 server: uuid::Uuid,
791 data: &super::servers_server_power::post::RequestBody,
792 ) -> Result<super::servers_server_power::post::Response, ApiHttpError> {
793 request_impl(
794 self,
795 Method::POST,
796 format!("/api/servers/{server}/power"),
797 Some(data),
798 None,
799 )
800 .await
801 }
802
803 pub async fn post_servers_server_reinstall(
804 &self,
805 server: uuid::Uuid,
806 data: &super::servers_server_reinstall::post::RequestBody,
807 ) -> Result<super::servers_server_reinstall::post::Response, ApiHttpError> {
808 request_impl(
809 self,
810 Method::POST,
811 format!("/api/servers/{server}/reinstall"),
812 Some(data),
813 None,
814 )
815 .await
816 }
817
818 pub async fn get_servers_server_schedules_schedule(
819 &self,
820 server: uuid::Uuid,
821 schedule: uuid::Uuid,
822 ) -> Result<super::servers_server_schedules_schedule::get::Response, ApiHttpError> {
823 request_impl(
824 self,
825 Method::GET,
826 format!("/api/servers/{server}/schedules/{schedule}"),
827 None::<&()>,
828 None,
829 )
830 .await
831 }
832
833 pub async fn post_servers_server_schedules_schedule_abort(
834 &self,
835 server: uuid::Uuid,
836 schedule: uuid::Uuid,
837 ) -> Result<super::servers_server_schedules_schedule_abort::post::Response, ApiHttpError> {
838 request_impl(
839 self,
840 Method::POST,
841 format!("/api/servers/{server}/schedules/{schedule}/abort"),
842 None::<&()>,
843 None,
844 )
845 .await
846 }
847
848 pub async fn post_servers_server_schedules_schedule_trigger(
849 &self,
850 server: uuid::Uuid,
851 schedule: uuid::Uuid,
852 data: &super::servers_server_schedules_schedule_trigger::post::RequestBody,
853 ) -> Result<super::servers_server_schedules_schedule_trigger::post::Response, ApiHttpError>
854 {
855 request_impl(
856 self,
857 Method::POST,
858 format!("/api/servers/{server}/schedules/{schedule}/trigger"),
859 Some(data),
860 None,
861 )
862 .await
863 }
864
865 pub async fn post_servers_server_script(
866 &self,
867 server: uuid::Uuid,
868 data: &super::servers_server_script::post::RequestBody,
869 ) -> Result<super::servers_server_script::post::Response, ApiHttpError> {
870 request_impl(
871 self,
872 Method::POST,
873 format!("/api/servers/{server}/script"),
874 Some(data),
875 None,
876 )
877 .await
878 }
879
880 pub async fn post_servers_server_sync(
881 &self,
882 server: uuid::Uuid,
883 data: &super::servers_server_sync::post::RequestBody,
884 ) -> Result<super::servers_server_sync::post::Response, ApiHttpError> {
885 request_impl(
886 self,
887 Method::POST,
888 format!("/api/servers/{server}/sync"),
889 Some(data),
890 None,
891 )
892 .await
893 }
894
895 pub async fn delete_servers_server_transfer(
896 &self,
897 server: uuid::Uuid,
898 ) -> Result<super::servers_server_transfer::delete::Response, ApiHttpError> {
899 request_impl(
900 self,
901 Method::DELETE,
902 format!("/api/servers/{server}/transfer"),
903 None::<&()>,
904 None,
905 )
906 .await
907 }
908
909 pub async fn post_servers_server_transfer(
910 &self,
911 server: uuid::Uuid,
912 data: &super::servers_server_transfer::post::RequestBody,
913 ) -> Result<super::servers_server_transfer::post::Response, ApiHttpError> {
914 request_impl(
915 self,
916 Method::POST,
917 format!("/api/servers/{server}/transfer"),
918 Some(data),
919 None,
920 )
921 .await
922 }
923
924 pub async fn get_servers_server_utilization(
925 &self,
926 server: uuid::Uuid,
927 ) -> Result<super::servers_server_utilization::get::Response, ApiHttpError> {
928 request_impl(
929 self,
930 Method::GET,
931 format!("/api/servers/{server}/utilization"),
932 None::<&()>,
933 None,
934 )
935 .await
936 }
937
938 pub async fn get_servers_server_version(
939 &self,
940 server: uuid::Uuid,
941 game: Game,
942 ) -> Result<super::servers_server_version::get::Response, ApiHttpError> {
943 request_impl(
944 self,
945 Method::GET,
946 format!("/api/servers/{server}/version?game={game}"),
947 None::<&()>,
948 None,
949 )
950 .await
951 }
952
953 pub async fn post_servers_server_ws_broadcast(
954 &self,
955 server: uuid::Uuid,
956 data: &super::servers_server_ws_broadcast::post::RequestBody,
957 ) -> Result<super::servers_server_ws_broadcast::post::Response, ApiHttpError> {
958 request_impl(
959 self,
960 Method::POST,
961 format!("/api/servers/{server}/ws/broadcast"),
962 Some(data),
963 None,
964 )
965 .await
966 }
967
968 pub async fn post_servers_server_ws_deny(
969 &self,
970 server: uuid::Uuid,
971 data: &super::servers_server_ws_deny::post::RequestBody,
972 ) -> Result<super::servers_server_ws_deny::post::Response, ApiHttpError> {
973 request_impl(
974 self,
975 Method::POST,
976 format!("/api/servers/{server}/ws/deny"),
977 Some(data),
978 None,
979 )
980 .await
981 }
982
983 pub async fn post_servers_server_ws_permissions(
984 &self,
985 server: uuid::Uuid,
986 data: &super::servers_server_ws_permissions::post::RequestBody,
987 ) -> Result<super::servers_server_ws_permissions::post::Response, ApiHttpError> {
988 request_impl(
989 self,
990 Method::POST,
991 format!("/api/servers/{server}/ws/permissions"),
992 Some(data),
993 None,
994 )
995 .await
996 }
997
998 pub async fn get_system(&self) -> Result<super::system::get::Response, ApiHttpError> {
999 request_impl(self, Method::GET, "/api/system", None::<&()>, None).await
1000 }
1001
1002 pub async fn get_system_config(
1003 &self,
1004 ) -> Result<super::system_config::get::Response, ApiHttpError> {
1005 request_impl(self, Method::GET, "/api/system/config", None::<&()>, None).await
1006 }
1007
1008 pub async fn get_system_logs(&self) -> Result<super::system_logs::get::Response, ApiHttpError> {
1009 request_impl(self, Method::GET, "/api/system/logs", None::<&()>, None).await
1010 }
1011
1012 pub async fn get_system_logs_file(
1013 &self,
1014 file: &str,
1015 lines: u64,
1016 ) -> Result<super::system_logs_file::get::Response, ApiHttpError> {
1017 request_impl(
1018 self,
1019 Method::GET,
1020 format!("/api/system/logs/{file}?lines={lines}"),
1021 None::<&()>,
1022 None,
1023 )
1024 .await
1025 }
1026
1027 pub async fn get_system_overview(
1028 &self,
1029 ) -> Result<super::system_overview::get::Response, ApiHttpError> {
1030 request_impl(self, Method::GET, "/api/system/overview", None::<&()>, None).await
1031 }
1032
1033 pub async fn get_system_restic_prune(
1034 &self,
1035 ) -> Result<super::system_restic_prune::get::Response, ApiHttpError> {
1036 request_impl(
1037 self,
1038 Method::GET,
1039 "/api/system/restic/prune",
1040 None::<&()>,
1041 None,
1042 )
1043 .await
1044 }
1045
1046 pub async fn post_system_restic_prune(
1047 &self,
1048 data: &super::system_restic_prune::post::RequestBody,
1049 ) -> Result<super::system_restic_prune::post::Response, ApiHttpError> {
1050 request_impl(
1051 self,
1052 Method::POST,
1053 "/api/system/restic/prune",
1054 Some(data),
1055 None,
1056 )
1057 .await
1058 }
1059
1060 pub async fn get_system_restic_stats(
1061 &self,
1062 ) -> Result<super::system_restic_stats::get::Response, ApiHttpError> {
1063 request_impl(
1064 self,
1065 Method::GET,
1066 "/api/system/restic/stats",
1067 None::<&()>,
1068 None,
1069 )
1070 .await
1071 }
1072
1073 pub async fn post_system_restic_stats(
1074 &self,
1075 data: &super::system_restic_stats::post::RequestBody,
1076 ) -> Result<super::system_restic_stats::post::Response, ApiHttpError> {
1077 request_impl(
1078 self,
1079 Method::POST,
1080 "/api/system/restic/stats",
1081 Some(data),
1082 None,
1083 )
1084 .await
1085 }
1086
1087 pub async fn get_system_restic_unlock(
1088 &self,
1089 ) -> Result<super::system_restic_unlock::get::Response, ApiHttpError> {
1090 request_impl(
1091 self,
1092 Method::GET,
1093 "/api/system/restic/unlock",
1094 None::<&()>,
1095 None,
1096 )
1097 .await
1098 }
1099
1100 pub async fn post_system_restic_unlock(
1101 &self,
1102 data: &super::system_restic_unlock::post::RequestBody,
1103 ) -> Result<super::system_restic_unlock::post::Response, ApiHttpError> {
1104 request_impl(
1105 self,
1106 Method::POST,
1107 "/api/system/restic/unlock",
1108 Some(data),
1109 None,
1110 )
1111 .await
1112 }
1113
1114 pub async fn get_system_stats(
1115 &self,
1116 ) -> Result<super::system_stats::get::Response, ApiHttpError> {
1117 request_impl(self, Method::GET, "/api/system/stats", None::<&()>, None).await
1118 }
1119
1120 pub async fn post_system_upgrade(
1121 &self,
1122 data: &super::system_upgrade::post::RequestBody,
1123 ) -> Result<super::system_upgrade::post::Response, ApiHttpError> {
1124 request_impl(self, Method::POST, "/api/system/upgrade", Some(data), None).await
1125 }
1126
1127 pub async fn get_transfers(&self) -> Result<super::transfers::get::Response, ApiHttpError> {
1128 request_impl(self, Method::GET, "/api/transfers", None::<&()>, None).await
1129 }
1130
1131 pub async fn post_transfers(&self) -> Result<super::transfers::post::Response, ApiHttpError> {
1132 request_impl(self, Method::POST, "/api/transfers", None::<&()>, None).await
1133 }
1134
1135 pub async fn get_transfers_capabilities(
1136 &self,
1137 ) -> Result<super::transfers_capabilities::get::Response, ApiHttpError> {
1138 request_impl(
1139 self,
1140 Method::GET,
1141 "/api/transfers/capabilities",
1142 None::<&()>,
1143 None,
1144 )
1145 .await
1146 }
1147
1148 pub async fn post_transfers_files(
1149 &self,
1150 ) -> Result<super::transfers_files::post::Response, ApiHttpError> {
1151 request_impl(
1152 self,
1153 Method::POST,
1154 "/api/transfers/files",
1155 None::<&()>,
1156 None,
1157 )
1158 .await
1159 }
1160
1161 pub async fn get_transfers_query(
1162 &self,
1163 ) -> Result<super::transfers_query::get::Response, ApiHttpError> {
1164 request_impl(self, Method::GET, "/api/transfers/query", None::<&()>, None).await
1165 }
1166
1167 pub async fn delete_transfers_server(
1168 &self,
1169 server: uuid::Uuid,
1170 ) -> Result<super::transfers_server::delete::Response, ApiHttpError> {
1171 request_impl(
1172 self,
1173 Method::DELETE,
1174 format!("/api/transfers/{server}"),
1175 None::<&()>,
1176 None,
1177 )
1178 .await
1179 }
1180
1181 pub async fn post_update(
1182 &self,
1183 data: &super::update::post::RequestBody,
1184 ) -> Result<super::update::post::Response, ApiHttpError> {
1185 request_impl(self, Method::POST, "/api/update", Some(data), None).await
1186 }
1187}