tina-core 0.0.2

Tina platform
Documentation
//! Session 扩展

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)
    }
}