Skip to main content

oss_api_client/api_client/
oss_api_client_utils.rs

1use crate::api_client::oss_file_api_client::OssFileApiClient;
2use arc_swap::ArcSwapOption;
3use config::Value;
4use robotech::api_client::ApiClient;
5use robotech::api_client::{ApiClientConfig, API_CLIENT_CONFIG_KEY};
6use robotech::cfg::CfgError;
7use robotech::micro_svc::FeignClient;
8use std::collections::HashMap;
9use std::sync::Arc;
10use tracing::info;
11use wheel_rs::config_utils::has_config_changed;
12
13static OSS_API_CLIENT: ArcSwapOption<OssApiClient> = ArcSwapOption::const_empty();
14const OSS_API_CLIENT_CONFIG_KEY: &str = "oss";
15
16pub struct OssApiClient {
17    pub file_client: OssFileApiClient,
18}
19
20pub fn get_oss_api_client() -> Result<Arc<OssApiClient>, CfgError> {
21    OSS_API_CLIENT.load_full().ok_or(CfgError::NotInit(
22        "OSS_API_CLIENT not initialized".to_string(),
23    ))
24}
25
26pub async fn setup_oss_api_client(
27    apis_config: HashMap<String, ApiClientConfig>,
28    changed: &Option<HashMap<String, Value>>,
29) -> Result<(), CfgError> {
30    info!("setup oss api client...: {apis_config:?} {changed:?}");
31    if changed
32        .as_ref()
33        .map(|changed| has_config_changed(API_CLIENT_CONFIG_KEY, changed))
34        .unwrap_or(true)
35    {
36        let mut oss_api_client: Option<OssFileApiClient> = None;
37        for (key, api_client_config) in apis_config {
38            if key == OSS_API_CLIENT_CONFIG_KEY {
39                if let Some(ref feign_svc) = api_client_config.svc_name {
40                    info!("feign mode: using service discovery for '{}'", feign_svc);
41                    oss_api_client = Some(OssFileApiClient::new_feign(
42                        FeignClient::new_default(feign_svc).await,
43                    ));
44                } else {
45                    let base_url = api_client_config
46                        .base_url
47                        .ok_or(CfgError::NotInit("base_url not initialized".to_string()))?;
48                    info!("static mode: using base_url '{base_url}' for '{key}'",);
49                    oss_api_client = Some(OssFileApiClient::new_static(ApiClient::new(base_url)));
50                }
51            }
52        }
53        let oss_api_client = oss_api_client.ok_or(CfgError::NotInit(
54            "OSS API client not initialized".to_string(),
55        ))?;
56
57        OSS_API_CLIENT.store(Some(Arc::new(OssApiClient {
58            file_client: oss_api_client,
59        })));
60    }
61    Ok(())
62}