oss-api-client 1.5.0

A Rust-based object storage service system that provides functionalities similar to Alibaba Cloud OSS. Supports file upload, download, preview, bucket management and more, using Axum as the web framework and SeaORM as the database ORM.
Documentation
use crate::api_client::oss_file_api_client::OssFileApiClient;
use arc_swap::ArcSwapOption;
use config::Value;
use robotech::api_client::ApiClient;
use robotech::api_client::{ApiClientConfig, API_CLIENT_CONFIG_KEY};
use robotech::cfg::CfgError;
use robotech::micro_svc::FeignClient;
use std::collections::HashMap;
use std::sync::Arc;
use tracing::info;
use wheel_rs::config_utils::has_config_changed;

static OSS_API_CLIENT: ArcSwapOption<OssApiClient> = ArcSwapOption::const_empty();
const OSS_API_CLIENT_CONFIG_KEY: &str = "oss";

pub struct OssApiClient {
    pub file_client: OssFileApiClient,
}

pub fn get_oss_api_client() -> Result<Arc<OssApiClient>, CfgError> {
    OSS_API_CLIENT.load_full().ok_or(CfgError::NotInit(
        "OSS_API_CLIENT not initialized".to_string(),
    ))
}

pub async fn setup_oss_api_client(
    apis_config: HashMap<String, ApiClientConfig>,
    changed: &Option<HashMap<String, Value>>,
) -> Result<(), CfgError> {
    info!("setup oss api client...: {apis_config:?} {changed:?}");
    if changed
        .as_ref()
        .map(|changed| has_config_changed(API_CLIENT_CONFIG_KEY, changed))
        .unwrap_or(true)
    {
        let mut oss_api_client: Option<OssFileApiClient> = None;
        for (key, api_client_config) in apis_config {
            if key == OSS_API_CLIENT_CONFIG_KEY {
                if let Some(ref feign_svc) = api_client_config.svc_name {
                    info!("feign mode: using service discovery for '{}'", feign_svc);
                    oss_api_client = Some(OssFileApiClient::new_feign(
                        FeignClient::new_default(feign_svc).await,
                    ));
                } else {
                    let base_url = api_client_config
                        .base_url
                        .ok_or(CfgError::NotInit("base_url not initialized".to_string()))?;
                    info!("static mode: using base_url '{base_url}' for '{key}'",);
                    oss_api_client = Some(OssFileApiClient::new_static(ApiClient::new(base_url)));
                }
            }
        }
        let oss_api_client = oss_api_client.ok_or(CfgError::NotInit(
            "OSS API client not initialized".to_string(),
        ))?;

        OSS_API_CLIENT.store(Some(Arc::new(OssApiClient {
            file_client: oss_api_client,
        })));
    }
    Ok(())
}