use std::sync::Arc;
use std::time::Duration;
use genies_core::jwt::*;
use serde::{Deserialize, Serialize};
use genies_config::app_config::ApplicationConfig;
use genies_cache::cache_service::CacheService;
use rbatis::RBatis;
use rbdc_mysql::driver::MysqlDriver;
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct RemoteToken {
pub access_token: String,
}
impl RemoteToken {
pub fn new() -> Self {
let config = ApplicationConfig::default();
Self {
access_token: futures::executor::block_on(async {
get_temp_access_token(
&config.keycloak_auth_server_url,
&config.keycloak_realm,
&config.keycloak_resource,
&config.keycloak_credentials_secret,
)
.await
}),
}
}
}
pub struct ApplicationContext {
pub config: ApplicationConfig,
pub rbatis: RBatis,
pub cache_service: CacheService,
pub redis_save_service: CacheService,
pub keycloak_keys: Keys,
}
impl ApplicationContext {
pub async fn init_mysql(&self) {
log::debug!(
"rbatis mysql init ({})...",
self.config.database_url
);
let _= self.rbatis.init(rbdc_mysql::driver::MysqlDriver {}, &self.config.database_url).unwrap();
let _ = self.rbatis.get_pool().unwrap().set_max_open_conns(self.config.max_connections as u64);
let _ = self.rbatis.get_pool().unwrap().set_max_idle_conns(self.config.wait_timeout as u64);
let _ = self.rbatis.get_pool().unwrap().set_conn_max_lifetime(Some(Duration::from_secs(self.config.max_lifetime as u64)));
let _ = self.rbatis.get_pool().unwrap().get().await;
log::info!("rbatis mysql init success! pool state = {:?}",
self.rbatis.get_pool().expect("pool not init!").state().await
);
}
pub fn new() -> Self {
let config = ApplicationConfig::from_sources("./application.yml").unwrap();
log::debug!("config = {:?}", config);
ApplicationContext {
keycloak_keys: futures::executor::block_on(async {
get_keycloak_keys(&config.keycloak_auth_server_url, &config.keycloak_realm).await
}),
rbatis: RBatis::new(),
cache_service: CacheService::new(&config),
redis_save_service: CacheService::new_saved(&config),
config,
}
}
}
impl Default for ApplicationContext {
fn default() -> Self {
Self::new()
}
}