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