wx_rust_open/api/impl/
wx_open_service_impl.rs1use std::sync::{Arc, OnceLock, RwLock};
10
11use async_trait::async_trait;
12
13use wx_rust_common::bean::result::WxMinishopImageUploadResult;
14use wx_rust_common::error::WxErrorException;
15
16use crate::api::r#impl::{MinishopUploadRequestExecutor, WxOpenComponentServiceImpl};
17use crate::api::{WxOpenComponentService, WxOpenService};
18use crate::config::WxOpenConfigStorage;
19
20pub struct WxOpenServiceImpl {
22 client: reqwest::Client,
23 config_storage: RwLock<Arc<dyn WxOpenConfigStorage>>,
24 component_service: OnceLock<Arc<dyn WxOpenComponentService>>,
25}
26
27impl WxOpenServiceImpl {
28 pub fn new_arc(config: Arc<dyn WxOpenConfigStorage>) -> Arc<Self> {
33 let arc = Arc::new(Self {
34 client: reqwest::Client::new(),
35 config_storage: RwLock::new(config),
36 component_service: OnceLock::new(),
37 });
38 let dyn_arc: Arc<dyn WxOpenService> = arc.clone();
40 let weak = Arc::downgrade(&dyn_arc);
41 let _ = arc
42 .component_service
43 .set(Arc::new(WxOpenComponentServiceImpl::new(weak)));
44 arc
45 }
46}
47
48#[async_trait]
49impl WxOpenService for WxOpenServiceImpl {
50 fn wx_open_component_service(&self) -> Option<Arc<dyn WxOpenComponentService>> {
51 self.component_service.get().cloned()
52 }
53
54 fn wx_open_config_storage(&self) -> Arc<dyn WxOpenConfigStorage> {
55 self.config_storage.read().unwrap().clone()
56 }
57
58 fn set_wx_open_config_storage(&self, wx_open_config_storage: Arc<dyn WxOpenConfigStorage>) {
59 *self.config_storage.write().unwrap() = wx_open_config_storage;
60 }
64
65 fn http_client(&self) -> &reqwest::Client {
66 &self.client
67 }
68
69 async fn upload_minishop_media_file(
76 &self,
77 url: &str,
78 file_path: &str,
79 ) -> Result<WxMinishopImageUploadResult, WxErrorException> {
80 MinishopUploadRequestExecutor::new(self.http_client().clone())
81 .upload(url, file_path)
82 .await
83 }
84}