1use super::def::*;
2use super::output_request::*;
3use super::processor::*;
4use crate::base::*;
5use crate::root_state::*;
6use crate::stack::SharedObjectStackDecID;
7use crate::requestor::*;
8use cyfs_base::*;
9
10use http_types::{Method, Request, Url};
11use std::sync::Arc;
12
13#[derive(Clone)]
14pub struct GlobalStateMetaRequestor {
15 category: GlobalStateCategory,
16 dec_id: Option<SharedObjectStackDecID>,
17 requestor: HttpRequestorRef,
18 service_url: Url,
19}
20
21impl GlobalStateMetaRequestor {
22 pub fn new_root_state(
23 dec_id: Option<SharedObjectStackDecID>,
24 requestor: HttpRequestorRef,
25 ) -> Self {
26 Self::new(GlobalStateCategory::RootState, dec_id, requestor)
27 }
28
29 pub fn new_local_cache(
30 dec_id: Option<SharedObjectStackDecID>,
31 requestor: HttpRequestorRef,
32 ) -> Self {
33 Self::new(GlobalStateCategory::LocalCache, dec_id, requestor)
34 }
35
36 pub fn new(
37 category: GlobalStateCategory,
38 dec_id: Option<SharedObjectStackDecID>,
39 requestor: HttpRequestorRef,
40 ) -> Self {
41 let addr = requestor.remote_addr();
42
43 let url = format!("http://{}/{}/meta/", addr, category.as_str());
44 let url = Url::parse(&url).unwrap();
45
46 let ret = Self {
47 category,
48 dec_id,
49 requestor,
50 service_url: url,
51 };
52
53 ret
54 }
55
56 pub fn category(&self) -> &GlobalStateCategory {
57 &self.category
58 }
59
60 pub fn into_processor(self) -> GlobalStateMetaOutputProcessorRef {
61 Arc::new(Box::new(self))
62 }
63
64 pub fn clone_processor(&self) -> GlobalStateMetaOutputProcessorRef {
65 self.clone().into_processor()
66 }
67
68 fn encode_common_headers(
70 &self,
71 action: MetaAction,
72 com_req: &MetaOutputRequestCommon,
73 http_req: &mut Request,
74 ) {
75 if let Some(dec_id) = &com_req.dec_id {
76 http_req.insert_header(cyfs_base::CYFS_DEC_ID, dec_id.to_string());
77 } else if let Some(dec_id) = &self.dec_id {
78 if let Some(dec_id) = dec_id.get() {
79 http_req.insert_header(cyfs_base::CYFS_DEC_ID, dec_id.to_string());
80 }
81 }
82
83 if let Some(target_dec_id) = &com_req.target_dec_id {
84 http_req.insert_header(cyfs_base::CYFS_TARGET_DEC_ID, target_dec_id.to_string());
85 }
86
87 if let Some(target) = &com_req.target {
88 http_req.insert_header(cyfs_base::CYFS_TARGET, target.to_string());
89 }
90
91 http_req.insert_header(cyfs_base::CYFS_FLAGS, com_req.flags.to_string());
92
93 http_req.insert_header(cyfs_base::CYFS_META_ACTION, action.to_string());
94 }
95
96 fn encode_add_access_request(&self, req: &GlobalStateMetaAddAccessOutputRequest) -> Request {
98 let url = self.service_url.join("access").unwrap();
99 let mut http_req = Request::new(Method::Put, url);
100 self.encode_common_headers(MetaAction::GlobalStateAddAccess, &req.common, &mut http_req);
101
102 let value = serde_json::to_string(&req).unwrap();
103 http_req.set_body(value);
104 http_req
105 }
106
107 async fn add_access(
108 &self,
109 req: GlobalStateMetaAddAccessOutputRequest,
110 ) -> BuckyResult<GlobalStateMetaAddAccessOutputResponse> {
111 let http_req = self.encode_add_access_request(&req);
112 let mut resp = self.requestor.request(http_req).await?;
113
114 if resp.status().is_success() {
115 let resp: GlobalStateMetaAddAccessOutputResponse =
116 RequestorHelper::decode_serde_json_body(&mut resp).await?;
117 info!(
118 "global state meta add access success: req={:?}, resp={:?}",
119 req, resp,
120 );
121 Ok(resp)
122 } else {
123 let e = RequestorHelper::error_from_resp(&mut resp).await;
124 error!("global state meta add access error! req={:?}, {}", req, e);
125 Err(e)
126 }
127 }
128
129 fn encode_remove_access_request(
131 &self,
132 req: &GlobalStateMetaRemoveAccessOutputRequest,
133 ) -> Request {
134 let url = self.service_url.join("access").unwrap();
135 let mut http_req = Request::new(Method::Delete, url);
136 self.encode_common_headers(
137 MetaAction::GlobalStateRemoveAccess,
138 &req.common,
139 &mut http_req,
140 );
141
142 let value = serde_json::to_string(&req).unwrap();
143 http_req.set_body(value);
144 http_req
145 }
146
147 async fn remove_access(
148 &self,
149 req: GlobalStateMetaRemoveAccessOutputRequest,
150 ) -> BuckyResult<GlobalStateMetaRemoveAccessOutputResponse> {
151 let http_req = self.encode_remove_access_request(&req);
152 let mut resp = self.requestor.request(http_req).await?;
153
154 if resp.status().is_success() {
155 let resp: GlobalStateMetaRemoveAccessOutputResponse =
156 RequestorHelper::decode_serde_json_body(&mut resp).await?;
157 info!(
158 "global state meta remove access success: req={:?}, resp={:?}",
159 req, resp,
160 );
161 Ok(resp)
162 } else {
163 let e = RequestorHelper::error_from_resp(&mut resp).await;
164 error!(
165 "global state meta remove access error! req={:?}, {}",
166 req, e
167 );
168 Err(e)
169 }
170 }
171
172 fn encode_clear_access_request(
174 &self,
175 req: &GlobalStateMetaClearAccessOutputRequest,
176 ) -> Request {
177 let url = self.service_url.join("accesses").unwrap();
178 let mut http_req = Request::new(Method::Delete, url);
179 self.encode_common_headers(
180 MetaAction::GlobalStateClearAccess,
181 &req.common,
182 &mut http_req,
183 );
184
185 let value = serde_json::to_string(&req).unwrap();
186 http_req.set_body(value);
187 http_req
188 }
189
190 async fn clear_access(
191 &self,
192 req: GlobalStateMetaClearAccessOutputRequest,
193 ) -> BuckyResult<GlobalStateMetaClearAccessOutputResponse> {
194 let http_req = self.encode_clear_access_request(&req);
195 let mut resp = self.requestor.request(http_req).await?;
196
197 if resp.status().is_success() {
198 let resp: GlobalStateMetaClearAccessOutputResponse =
199 RequestorHelper::decode_serde_json_body(&mut resp).await?;
200 info!(
201 "global state meta clear access success: req={:?}, resp={:?}",
202 req, resp,
203 );
204 Ok(resp)
205 } else {
206 let e = RequestorHelper::error_from_resp(&mut resp).await;
207 error!("global state meta clear access error! req={:?}, {}", req, e);
208 Err(e)
209 }
210 }
211
212 fn encode_add_link_request(&self, req: &GlobalStateMetaAddLinkOutputRequest) -> Request {
214 let url = self.service_url.join("link").unwrap();
215 let mut http_req = Request::new(Method::Put, url);
216 self.encode_common_headers(MetaAction::GlobalStateAddLink, &req.common, &mut http_req);
217
218 let value = serde_json::to_string(&req).unwrap();
219 http_req.set_body(value);
220 http_req
221 }
222
223 async fn add_link(
224 &self,
225 req: GlobalStateMetaAddLinkOutputRequest,
226 ) -> BuckyResult<GlobalStateMetaAddLinkOutputResponse> {
227 let http_req = self.encode_add_link_request(&req);
228 let mut resp = self.requestor.request(http_req).await?;
229
230 if resp.status().is_success() {
231 let resp = RequestorHelper::decode_serde_json_body(&mut resp).await?;
232 info!(
233 "global state meta add link success: req={:?}, resp={:?}",
234 req, resp,
235 );
236 Ok(resp)
237 } else {
238 let e = RequestorHelper::error_from_resp(&mut resp).await;
239 error!("global state meta add link error! req={:?}, {}", req, e);
240 Err(e)
241 }
242 }
243
244 fn encode_remove_link_request(&self, req: &GlobalStateMetaRemoveLinkOutputRequest) -> Request {
246 let url = self.service_url.join("link").unwrap();
247 let mut http_req = Request::new(Method::Delete, url);
248 self.encode_common_headers(
249 MetaAction::GlobalStateRemoveLink,
250 &req.common,
251 &mut http_req,
252 );
253
254 let value = serde_json::to_string(&req).unwrap();
255 http_req.set_body(value);
256 http_req
257 }
258
259 async fn remove_link(
260 &self,
261 req: GlobalStateMetaRemoveLinkOutputRequest,
262 ) -> BuckyResult<GlobalStateMetaRemoveLinkOutputResponse> {
263 let http_req = self.encode_remove_link_request(&req);
264 let mut resp = self.requestor.request(http_req).await?;
265
266 if resp.status().is_success() {
267 let resp = RequestorHelper::decode_serde_json_body(&mut resp).await?;
268 info!(
269 "global state meta remove link success: req={:?}, resp={:?}",
270 req, resp,
271 );
272 Ok(resp)
273 } else {
274 let e = RequestorHelper::error_from_resp(&mut resp).await;
275 error!("global state meta remove link error! req={:?}, {}", req, e);
276 Err(e)
277 }
278 }
279
280 fn encode_clear_link_request(&self, req: &GlobalStateMetaClearLinkOutputRequest) -> Request {
282 let url = self.service_url.join("links").unwrap();
283 let mut http_req = Request::new(Method::Delete, url);
284 self.encode_common_headers(MetaAction::GlobalStateClearLink, &req.common, &mut http_req);
285
286 let value = serde_json::to_string(&req).unwrap();
287 http_req.set_body(value);
288 http_req
289 }
290
291 async fn clear_link(
292 &self,
293 req: GlobalStateMetaClearLinkOutputRequest,
294 ) -> BuckyResult<GlobalStateMetaClearLinkOutputResponse> {
295 let http_req = self.encode_clear_link_request(&req);
296 let mut resp = self.requestor.request(http_req).await?;
297
298 if resp.status().is_success() {
299 let resp = RequestorHelper::decode_serde_json_body(&mut resp).await?;
300 info!(
301 "global state meta clear links success: req={:?}, resp={:?}",
302 req, resp,
303 );
304 Ok(resp)
305 } else {
306 let e = RequestorHelper::error_from_resp(&mut resp).await;
307 error!("global state meta clear links error! req={:?}, {}", req, e);
308 Err(e)
309 }
310 }
311
312 fn encode_add_object_meta_request(
314 &self,
315 req: &GlobalStateMetaAddObjectMetaOutputRequest,
316 ) -> Request {
317 let url = self.service_url.join("object-meta").unwrap();
318 let mut http_req = Request::new(Method::Put, url);
319 self.encode_common_headers(
320 MetaAction::GlobalStateAddObjectMeta,
321 &req.common,
322 &mut http_req,
323 );
324
325 let value = serde_json::to_string(&req).unwrap();
326 http_req.set_body(value);
327 http_req
328 }
329
330 async fn add_object_meta(
331 &self,
332 req: GlobalStateMetaAddObjectMetaOutputRequest,
333 ) -> BuckyResult<GlobalStateMetaAddObjectMetaOutputResponse> {
334 let http_req = self.encode_add_object_meta_request(&req);
335 let mut resp = self.requestor.request(http_req).await?;
336
337 if resp.status().is_success() {
338 let resp: GlobalStateMetaAddObjectMetaOutputResponse =
339 RequestorHelper::decode_serde_json_body(&mut resp).await?;
340 info!(
341 "global state meta add object meta success: req={:?}, resp={:?}",
342 req, resp,
343 );
344 Ok(resp)
345 } else {
346 let e = RequestorHelper::error_from_resp(&mut resp).await;
347 error!(
348 "global state meta add object meta error! req={:?}, {}",
349 req, e
350 );
351 Err(e)
352 }
353 }
354
355 fn encode_remove_object_meta_request(
357 &self,
358 req: &GlobalStateMetaRemoveObjectMetaOutputRequest,
359 ) -> Request {
360 let url = self.service_url.join("object-meta").unwrap();
361 let mut http_req = Request::new(Method::Delete, url);
362 self.encode_common_headers(
363 MetaAction::GlobalStateRemoveObjectMeta,
364 &req.common,
365 &mut http_req,
366 );
367
368 let value = serde_json::to_string(&req).unwrap();
369 http_req.set_body(value);
370 http_req
371 }
372
373 async fn remove_object_meta(
374 &self,
375 req: GlobalStateMetaRemoveObjectMetaOutputRequest,
376 ) -> BuckyResult<GlobalStateMetaRemoveObjectMetaOutputResponse> {
377 let http_req = self.encode_remove_object_meta_request(&req);
378 let mut resp = self.requestor.request(http_req).await?;
379
380 if resp.status().is_success() {
381 let resp: GlobalStateMetaRemoveObjectMetaOutputResponse =
382 RequestorHelper::decode_serde_json_body(&mut resp).await?;
383 info!(
384 "global state meta remove object meta success: req={:?}, resp={:?}",
385 req, resp,
386 );
387 Ok(resp)
388 } else {
389 let e = RequestorHelper::error_from_resp(&mut resp).await;
390 error!(
391 "global state meta remove object meta error! req={:?}, {}",
392 req, e
393 );
394 Err(e)
395 }
396 }
397
398 fn encode_clear_object_meta_request(
400 &self,
401 req: &GlobalStateMetaClearObjectMetaOutputRequest,
402 ) -> Request {
403 let url = self.service_url.join("object-metas").unwrap();
404 let mut http_req = Request::new(Method::Delete, url);
405 self.encode_common_headers(
406 MetaAction::GlobalStateClearObjectMeta,
407 &req.common,
408 &mut http_req,
409 );
410
411 let value = serde_json::to_string(&req).unwrap();
412 http_req.set_body(value);
413 http_req
414 }
415
416 async fn clear_object_meta(
417 &self,
418 req: GlobalStateMetaClearObjectMetaOutputRequest,
419 ) -> BuckyResult<GlobalStateMetaClearObjectMetaOutputResponse> {
420 let http_req = self.encode_clear_object_meta_request(&req);
421 let mut resp = self.requestor.request(http_req).await?;
422
423 if resp.status().is_success() {
424 let resp: GlobalStateMetaClearObjectMetaOutputResponse =
425 RequestorHelper::decode_serde_json_body(&mut resp).await?;
426 info!(
427 "global state meta clear object meta success: req={:?}, resp={:?}",
428 req, resp,
429 );
430 Ok(resp)
431 } else {
432 let e = RequestorHelper::error_from_resp(&mut resp).await;
433 error!(
434 "global state meta clear object meta error! req={:?}, {}",
435 req, e
436 );
437 Err(e)
438 }
439 }
440
441 fn encode_add_path_config_request(
444 &self,
445 req: &GlobalStateMetaAddPathConfigOutputRequest,
446 ) -> Request {
447 let url = self.service_url.join("path-config").unwrap();
448 let mut http_req = Request::new(Method::Put, url);
449 self.encode_common_headers(
450 MetaAction::GlobalStateAddPathConfig,
451 &req.common,
452 &mut http_req,
453 );
454
455 let value = serde_json::to_string(&req).unwrap();
456 http_req.set_body(value);
457 http_req
458 }
459
460 async fn add_path_config(
461 &self,
462 req: GlobalStateMetaAddPathConfigOutputRequest,
463 ) -> BuckyResult<GlobalStateMetaAddPathConfigOutputResponse> {
464 let http_req = self.encode_add_path_config_request(&req);
465 let mut resp = self.requestor.request(http_req).await?;
466
467 if resp.status().is_success() {
468 let resp: GlobalStateMetaAddPathConfigOutputResponse =
469 RequestorHelper::decode_serde_json_body(&mut resp).await?;
470 info!(
471 "global state meta add path config success: req={:?}, resp={:?}",
472 req, resp,
473 );
474 Ok(resp)
475 } else {
476 let e = RequestorHelper::error_from_resp(&mut resp).await;
477 error!(
478 "global state meta add path config error! req={:?}, {}",
479 req, e
480 );
481 Err(e)
482 }
483 }
484
485 fn encode_remove_path_config_request(
487 &self,
488 req: &GlobalStateMetaRemovePathConfigOutputRequest,
489 ) -> Request {
490 let url = self.service_url.join("path-config").unwrap();
491 let mut http_req = Request::new(Method::Delete, url);
492 self.encode_common_headers(
493 MetaAction::GlobalStateRemovePathConfig,
494 &req.common,
495 &mut http_req,
496 );
497
498 let value = serde_json::to_string(&req).unwrap();
499 http_req.set_body(value);
500 http_req
501 }
502
503 async fn remove_path_config(
504 &self,
505 req: GlobalStateMetaRemovePathConfigOutputRequest,
506 ) -> BuckyResult<GlobalStateMetaRemovePathConfigOutputResponse> {
507 let http_req = self.encode_remove_path_config_request(&req);
508 let mut resp = self.requestor.request(http_req).await?;
509
510 if resp.status().is_success() {
511 let resp: GlobalStateMetaRemovePathConfigOutputResponse =
512 RequestorHelper::decode_serde_json_body(&mut resp).await?;
513 info!(
514 "global state meta remove path config success: req={:?}, resp={:?}",
515 req, resp,
516 );
517 Ok(resp)
518 } else {
519 let e = RequestorHelper::error_from_resp(&mut resp).await;
520 error!(
521 "global state meta remove path config error! req={:?}, {}",
522 req, e
523 );
524 Err(e)
525 }
526 }
527
528 fn encode_clear_path_config_request(
530 &self,
531 req: &GlobalStateMetaClearPathConfigOutputRequest,
532 ) -> Request {
533 let url = self.service_url.join("path-configs").unwrap();
534 let mut http_req = Request::new(Method::Delete, url);
535 self.encode_common_headers(
536 MetaAction::GlobalStateClearPathConfig,
537 &req.common,
538 &mut http_req,
539 );
540
541 let value = serde_json::to_string(&req).unwrap();
542 http_req.set_body(value);
543 http_req
544 }
545
546 async fn clear_path_config(
547 &self,
548 req: GlobalStateMetaClearPathConfigOutputRequest,
549 ) -> BuckyResult<GlobalStateMetaClearPathConfigOutputResponse> {
550 let http_req = self.encode_clear_path_config_request(&req);
551 let mut resp = self.requestor.request(http_req).await?;
552
553 if resp.status().is_success() {
554 let resp: GlobalStateMetaClearPathConfigOutputResponse =
555 RequestorHelper::decode_serde_json_body(&mut resp).await?;
556 info!(
557 "global state meta clear path config success: req={:?}, resp={:?}",
558 req, resp,
559 );
560 Ok(resp)
561 } else {
562 let e = RequestorHelper::error_from_resp(&mut resp).await;
563 error!(
564 "global state meta clear path config error! req={:?}, {}",
565 req, e
566 );
567 Err(e)
568 }
569 }
570}
571
572#[async_trait::async_trait]
573impl GlobalStateMetaOutputProcessor for GlobalStateMetaRequestor {
574 async fn add_access(
575 &self,
576 req: GlobalStateMetaAddAccessOutputRequest,
577 ) -> BuckyResult<GlobalStateMetaAddAccessOutputResponse> {
578 Self::add_access(&self, req).await
579 }
580
581 async fn remove_access(
582 &self,
583 req: GlobalStateMetaRemoveAccessOutputRequest,
584 ) -> BuckyResult<GlobalStateMetaRemoveAccessOutputResponse> {
585 Self::remove_access(&self, req).await
586 }
587
588 async fn clear_access(
589 &self,
590 req: GlobalStateMetaClearAccessOutputRequest,
591 ) -> BuckyResult<GlobalStateMetaClearAccessOutputResponse> {
592 Self::clear_access(&self, req).await
593 }
594
595 async fn add_link(
596 &self,
597 req: GlobalStateMetaAddLinkOutputRequest,
598 ) -> BuckyResult<GlobalStateMetaAddLinkOutputResponse> {
599 Self::add_link(&self, req).await
600 }
601
602 async fn remove_link(
603 &self,
604 req: GlobalStateMetaRemoveLinkOutputRequest,
605 ) -> BuckyResult<GlobalStateMetaRemoveLinkOutputResponse> {
606 Self::remove_link(&self, req).await
607 }
608
609 async fn clear_link(
610 &self,
611 req: GlobalStateMetaClearLinkOutputRequest,
612 ) -> BuckyResult<GlobalStateMetaClearLinkOutputResponse> {
613 Self::clear_link(&self, req).await
614 }
615
616 async fn add_object_meta(
618 &self,
619 req: GlobalStateMetaAddObjectMetaOutputRequest,
620 ) -> BuckyResult<GlobalStateMetaAddObjectMetaOutputResponse> {
621 Self::add_object_meta(&self, req).await
622 }
623
624 async fn remove_object_meta(
625 &self,
626 req: GlobalStateMetaRemoveObjectMetaOutputRequest,
627 ) -> BuckyResult<GlobalStateMetaRemoveObjectMetaOutputResponse> {
628 Self::remove_object_meta(&self, req).await
629 }
630
631 async fn clear_object_meta(
632 &self,
633 req: GlobalStateMetaClearObjectMetaOutputRequest,
634 ) -> BuckyResult<GlobalStateMetaClearObjectMetaOutputResponse> {
635 Self::clear_object_meta(&self, req).await
636 }
637
638 async fn add_path_config(
640 &self,
641 req: GlobalStateMetaAddPathConfigOutputRequest,
642 ) -> BuckyResult<GlobalStateMetaAddPathConfigOutputResponse> {
643 Self::add_path_config(&self, req).await
644 }
645
646 async fn remove_path_config(
647 &self,
648 req: GlobalStateMetaRemovePathConfigOutputRequest,
649 ) -> BuckyResult<GlobalStateMetaRemovePathConfigOutputResponse> {
650 Self::remove_path_config(&self, req).await
651 }
652
653 async fn clear_path_config(
654 &self,
655 req: GlobalStateMetaClearPathConfigOutputRequest,
656 ) -> BuckyResult<GlobalStateMetaClearPathConfigOutputResponse> {
657 Self::clear_path_config(&self, req).await
658 }
659}