use std::sync::{atomic::AtomicBool, Arc};
use crate::{
app_error_from,
common::{
data::AppResult,
rbatis::{IRbatisClient, RbatisExecutor, RbatisExecutorContainer},
server::session::{Session, SessionInner},
},
};
use super::request_ext::RequestExt;
impl Session {
pub async fn from_http_request<Req: RequestExt>(req: &Req) -> AppResult<Self> {
let (session, is_new) = {
match req.get_session() {
None => {
let locale = Arc::new(req.get_locale().to_owned());
let application = req.get_application()?;
let route_config = match req.get_route_config() {
Ok(v) => v,
Err(err) => return Err(err),
};
let request_time = req.get_request_time()?;
let rbatis = match application.get_rbatis() {
Ok(v) => v,
Err(err) => return Err(err),
};
let rbatis_executor = match RbatisExecutor::new(rbatis).map_err(app_error_from!()) {
Ok(v) => v,
Err(err) => return Err(err),
};
let enable_token = route_config.enable_token;
let session = Session::new(SessionInner {
application,
enable_token,
locale,
request_time,
route_config: Some(route_config),
rbatis_executor: Some(RbatisExecutorContainer::new(rbatis_executor)),
transaction_flag: AtomicBool::new(false),
extension: Default::default(),
attributes: Arc::new(Default::default()),
});
(session, true)
}
Some(session) => (session.clone(), false),
}
};
if is_new {
req.set_session(session.clone());
}
Ok(session)
}
}