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 ) -> Result<super::servers_server_files_list::get::Response, ApiHttpError> {
486 let directory = urlencoding::encode(directory);
487 let ignored = ignored
488 .into_iter()
489 .map(|s| urlencoding::encode(&s).into())
490 .collect::<Vec<compact_str::CompactString>>()
491 .join("&ignored=");
492 request_impl(self, Method::GET, format!("/api/servers/{server}/files/list?directory={directory}&ignored={ignored}&per_page={per_page}&page={page}"), None::<&()>, None).await
493 }
494
495 pub async fn get_servers_server_files_list_directory(
496 &self,
497 server: uuid::Uuid,
498 directory: &str,
499 ) -> Result<super::servers_server_files_list_directory::get::Response, ApiHttpError> {
500 let directory = urlencoding::encode(directory);
501 request_impl(
502 self,
503 Method::GET,
504 format!("/api/servers/{server}/files/list-directory?directory={directory}"),
505 None::<&()>,
506 None,
507 )
508 .await
509 }
510
511 pub async fn delete_servers_server_files_operations_operation(
512 &self,
513 server: uuid::Uuid,
514 operation: uuid::Uuid,
515 ) -> Result<super::servers_server_files_operations_operation::delete::Response, ApiHttpError>
516 {
517 request_impl(
518 self,
519 Method::DELETE,
520 format!("/api/servers/{server}/files/operations/{operation}"),
521 None::<&()>,
522 None,
523 )
524 .await
525 }
526
527 pub async fn get_servers_server_files_pull(
528 &self,
529 server: uuid::Uuid,
530 ) -> Result<super::servers_server_files_pull::get::Response, ApiHttpError> {
531 request_impl(
532 self,
533 Method::GET,
534 format!("/api/servers/{server}/files/pull"),
535 None::<&()>,
536 None,
537 )
538 .await
539 }
540
541 pub async fn post_servers_server_files_pull(
542 &self,
543 server: uuid::Uuid,
544 data: &super::servers_server_files_pull::post::RequestBody,
545 ) -> Result<super::servers_server_files_pull::post::Response, ApiHttpError> {
546 request_impl(
547 self,
548 Method::POST,
549 format!("/api/servers/{server}/files/pull"),
550 Some(data),
551 None,
552 )
553 .await
554 }
555
556 pub async fn post_servers_server_files_pull_query(
557 &self,
558 server: uuid::Uuid,
559 data: &super::servers_server_files_pull_query::post::RequestBody,
560 ) -> Result<super::servers_server_files_pull_query::post::Response, ApiHttpError> {
561 request_impl(
562 self,
563 Method::POST,
564 format!("/api/servers/{server}/files/pull/query"),
565 Some(data),
566 None,
567 )
568 .await
569 }
570
571 pub async fn delete_servers_server_files_pull_pull(
572 &self,
573 server: uuid::Uuid,
574 pull: uuid::Uuid,
575 ) -> Result<super::servers_server_files_pull_pull::delete::Response, ApiHttpError> {
576 request_impl(
577 self,
578 Method::DELETE,
579 format!("/api/servers/{server}/files/pull/{pull}"),
580 None::<&()>,
581 None,
582 )
583 .await
584 }
585
586 pub async fn put_servers_server_files_rename(
587 &self,
588 server: uuid::Uuid,
589 data: &super::servers_server_files_rename::put::RequestBody,
590 ) -> Result<super::servers_server_files_rename::put::Response, ApiHttpError> {
591 request_impl(
592 self,
593 Method::PUT,
594 format!("/api/servers/{server}/files/rename"),
595 Some(data),
596 None,
597 )
598 .await
599 }
600
601 pub async fn post_servers_server_files_search(
602 &self,
603 server: uuid::Uuid,
604 data: &super::servers_server_files_search::post::RequestBody,
605 ) -> Result<super::servers_server_files_search::post::Response, ApiHttpError> {
606 request_impl(
607 self,
608 Method::POST,
609 format!("/api/servers/{server}/files/search"),
610 Some(data),
611 None,
612 )
613 .await
614 }
615
616 pub async fn post_servers_server_files_write(
617 &self,
618 server: uuid::Uuid,
619 file: &str,
620 data: super::servers_server_files_write::post::RequestBody,
621 ) -> Result<super::servers_server_files_write::post::Response, ApiHttpError> {
622 let file = urlencoding::encode(file);
623 request_impl(
624 self,
625 Method::POST,
626 format!("/api/servers/{server}/files/write?file={file}"),
627 None::<&()>,
628 Some(data),
629 )
630 .await
631 }
632
633 pub async fn post_servers_server_install_abort(
634 &self,
635 server: uuid::Uuid,
636 ) -> Result<super::servers_server_install_abort::post::Response, ApiHttpError> {
637 request_impl(
638 self,
639 Method::POST,
640 format!("/api/servers/{server}/install/abort"),
641 None::<&()>,
642 None,
643 )
644 .await
645 }
646
647 pub async fn get_servers_server_logs(
648 &self,
649 server: uuid::Uuid,
650 lines: u64,
651 ) -> Result<super::servers_server_logs::get::Response, ApiHttpError> {
652 request_impl(
653 self,
654 Method::GET,
655 format!("/api/servers/{server}/logs?lines={lines}"),
656 None::<&()>,
657 None,
658 )
659 .await
660 }
661
662 pub async fn get_servers_server_logs_install(
663 &self,
664 server: uuid::Uuid,
665 lines: u64,
666 ) -> Result<super::servers_server_logs_install::get::Response, ApiHttpError> {
667 request_impl(
668 self,
669 Method::GET,
670 format!("/api/servers/{server}/logs/install?lines={lines}"),
671 None::<&()>,
672 None,
673 )
674 .await
675 }
676
677 pub async fn post_servers_server_power(
678 &self,
679 server: uuid::Uuid,
680 data: &super::servers_server_power::post::RequestBody,
681 ) -> Result<super::servers_server_power::post::Response, ApiHttpError> {
682 request_impl(
683 self,
684 Method::POST,
685 format!("/api/servers/{server}/power"),
686 Some(data),
687 None,
688 )
689 .await
690 }
691
692 pub async fn post_servers_server_reinstall(
693 &self,
694 server: uuid::Uuid,
695 data: &super::servers_server_reinstall::post::RequestBody,
696 ) -> Result<super::servers_server_reinstall::post::Response, ApiHttpError> {
697 request_impl(
698 self,
699 Method::POST,
700 format!("/api/servers/{server}/reinstall"),
701 Some(data),
702 None,
703 )
704 .await
705 }
706
707 pub async fn get_servers_server_schedules_schedule(
708 &self,
709 server: uuid::Uuid,
710 schedule: uuid::Uuid,
711 ) -> Result<super::servers_server_schedules_schedule::get::Response, ApiHttpError> {
712 request_impl(
713 self,
714 Method::GET,
715 format!("/api/servers/{server}/schedules/{schedule}"),
716 None::<&()>,
717 None,
718 )
719 .await
720 }
721
722 pub async fn post_servers_server_schedules_schedule_abort(
723 &self,
724 server: uuid::Uuid,
725 schedule: uuid::Uuid,
726 ) -> Result<super::servers_server_schedules_schedule_abort::post::Response, ApiHttpError> {
727 request_impl(
728 self,
729 Method::POST,
730 format!("/api/servers/{server}/schedules/{schedule}/abort"),
731 None::<&()>,
732 None,
733 )
734 .await
735 }
736
737 pub async fn post_servers_server_schedules_schedule_trigger(
738 &self,
739 server: uuid::Uuid,
740 schedule: uuid::Uuid,
741 data: &super::servers_server_schedules_schedule_trigger::post::RequestBody,
742 ) -> Result<super::servers_server_schedules_schedule_trigger::post::Response, ApiHttpError>
743 {
744 request_impl(
745 self,
746 Method::POST,
747 format!("/api/servers/{server}/schedules/{schedule}/trigger"),
748 Some(data),
749 None,
750 )
751 .await
752 }
753
754 pub async fn post_servers_server_script(
755 &self,
756 server: uuid::Uuid,
757 data: &super::servers_server_script::post::RequestBody,
758 ) -> Result<super::servers_server_script::post::Response, ApiHttpError> {
759 request_impl(
760 self,
761 Method::POST,
762 format!("/api/servers/{server}/script"),
763 Some(data),
764 None,
765 )
766 .await
767 }
768
769 pub async fn post_servers_server_sync(
770 &self,
771 server: uuid::Uuid,
772 data: &super::servers_server_sync::post::RequestBody,
773 ) -> Result<super::servers_server_sync::post::Response, ApiHttpError> {
774 request_impl(
775 self,
776 Method::POST,
777 format!("/api/servers/{server}/sync"),
778 Some(data),
779 None,
780 )
781 .await
782 }
783
784 pub async fn delete_servers_server_transfer(
785 &self,
786 server: uuid::Uuid,
787 ) -> Result<super::servers_server_transfer::delete::Response, ApiHttpError> {
788 request_impl(
789 self,
790 Method::DELETE,
791 format!("/api/servers/{server}/transfer"),
792 None::<&()>,
793 None,
794 )
795 .await
796 }
797
798 pub async fn post_servers_server_transfer(
799 &self,
800 server: uuid::Uuid,
801 data: &super::servers_server_transfer::post::RequestBody,
802 ) -> Result<super::servers_server_transfer::post::Response, ApiHttpError> {
803 request_impl(
804 self,
805 Method::POST,
806 format!("/api/servers/{server}/transfer"),
807 Some(data),
808 None,
809 )
810 .await
811 }
812
813 pub async fn get_servers_server_utilization(
814 &self,
815 server: uuid::Uuid,
816 ) -> Result<super::servers_server_utilization::get::Response, ApiHttpError> {
817 request_impl(
818 self,
819 Method::GET,
820 format!("/api/servers/{server}/utilization"),
821 None::<&()>,
822 None,
823 )
824 .await
825 }
826
827 pub async fn get_servers_server_version(
828 &self,
829 server: uuid::Uuid,
830 game: Game,
831 ) -> Result<super::servers_server_version::get::Response, ApiHttpError> {
832 request_impl(
833 self,
834 Method::GET,
835 format!("/api/servers/{server}/version?game={game}"),
836 None::<&()>,
837 None,
838 )
839 .await
840 }
841
842 pub async fn post_servers_server_ws_broadcast(
843 &self,
844 server: uuid::Uuid,
845 data: &super::servers_server_ws_broadcast::post::RequestBody,
846 ) -> Result<super::servers_server_ws_broadcast::post::Response, ApiHttpError> {
847 request_impl(
848 self,
849 Method::POST,
850 format!("/api/servers/{server}/ws/broadcast"),
851 Some(data),
852 None,
853 )
854 .await
855 }
856
857 pub async fn post_servers_server_ws_deny(
858 &self,
859 server: uuid::Uuid,
860 data: &super::servers_server_ws_deny::post::RequestBody,
861 ) -> Result<super::servers_server_ws_deny::post::Response, ApiHttpError> {
862 request_impl(
863 self,
864 Method::POST,
865 format!("/api/servers/{server}/ws/deny"),
866 Some(data),
867 None,
868 )
869 .await
870 }
871
872 pub async fn post_servers_server_ws_permissions(
873 &self,
874 server: uuid::Uuid,
875 data: &super::servers_server_ws_permissions::post::RequestBody,
876 ) -> Result<super::servers_server_ws_permissions::post::Response, ApiHttpError> {
877 request_impl(
878 self,
879 Method::POST,
880 format!("/api/servers/{server}/ws/permissions"),
881 Some(data),
882 None,
883 )
884 .await
885 }
886
887 pub async fn get_system(&self) -> Result<super::system::get::Response, ApiHttpError> {
888 request_impl(self, Method::GET, "/api/system", None::<&()>, None).await
889 }
890
891 pub async fn get_system_config(
892 &self,
893 ) -> Result<super::system_config::get::Response, ApiHttpError> {
894 request_impl(self, Method::GET, "/api/system/config", None::<&()>, None).await
895 }
896
897 pub async fn get_system_logs(&self) -> Result<super::system_logs::get::Response, ApiHttpError> {
898 request_impl(self, Method::GET, "/api/system/logs", None::<&()>, None).await
899 }
900
901 pub async fn get_system_logs_file(
902 &self,
903 file: &str,
904 lines: u64,
905 ) -> Result<super::system_logs_file::get::Response, ApiHttpError> {
906 request_impl(
907 self,
908 Method::GET,
909 format!("/api/system/logs/{file}?lines={lines}"),
910 None::<&()>,
911 None,
912 )
913 .await
914 }
915
916 pub async fn get_system_overview(
917 &self,
918 ) -> Result<super::system_overview::get::Response, ApiHttpError> {
919 request_impl(self, Method::GET, "/api/system/overview", None::<&()>, None).await
920 }
921
922 pub async fn get_system_stats(
923 &self,
924 ) -> Result<super::system_stats::get::Response, ApiHttpError> {
925 request_impl(self, Method::GET, "/api/system/stats", None::<&()>, None).await
926 }
927
928 pub async fn post_system_upgrade(
929 &self,
930 data: &super::system_upgrade::post::RequestBody,
931 ) -> Result<super::system_upgrade::post::Response, ApiHttpError> {
932 request_impl(self, Method::POST, "/api/system/upgrade", Some(data), None).await
933 }
934
935 pub async fn get_transfers(&self) -> Result<super::transfers::get::Response, ApiHttpError> {
936 request_impl(self, Method::GET, "/api/transfers", None::<&()>, None).await
937 }
938
939 pub async fn post_transfers(&self) -> Result<super::transfers::post::Response, ApiHttpError> {
940 request_impl(self, Method::POST, "/api/transfers", None::<&()>, None).await
941 }
942
943 pub async fn post_transfers_files(
944 &self,
945 ) -> Result<super::transfers_files::post::Response, ApiHttpError> {
946 request_impl(
947 self,
948 Method::POST,
949 "/api/transfers/files",
950 None::<&()>,
951 None,
952 )
953 .await
954 }
955
956 pub async fn delete_transfers_server(
957 &self,
958 server: uuid::Uuid,
959 ) -> Result<super::transfers_server::delete::Response, ApiHttpError> {
960 request_impl(
961 self,
962 Method::DELETE,
963 format!("/api/transfers/{server}"),
964 None::<&()>,
965 None,
966 )
967 .await
968 }
969
970 pub async fn post_update(
971 &self,
972 data: &super::update::post::RequestBody,
973 ) -> Result<super::update::post::Response, ApiHttpError> {
974 request_impl(self, Method::POST, "/api/update", Some(data), None).await
975 }
976}