bios-basic 0.2.0

An embeddable message queue system
Documentation
use serde::{Deserialize, Serialize};
use tardis::basic::dto::TardisContext;
use tardis::basic::result::TardisResult;
use tardis::db::reldb_client::TardisActiveModel;
use tardis::db::sea_orm;
use tardis::db::sea_orm::sea_query::*;
use tardis::TardisFuns;
use tardis::TardisFunsInst;

use crate::rbum::domain::{
    rbum_cert, rbum_cert_conf, rbum_domain, rbum_item, rbum_item_attr, rbum_kind, rbum_kind_attr, rbum_rel, rbum_rel_attr, rbum_rel_env, rbum_set, rbum_set_cate, rbum_set_item,
};
use crate::rbum::rbum_config::{RbumConfig, RbumConfigManager};

pub async fn init(code: &str, config: RbumConfig) -> TardisResult<()> {
    RbumConfigManager::add(code, config)?;
    TardisFuns::reldb_by_module_or_default(code).init_basic_tables().await?;
    let db_kind = TardisFuns::reldb_by_module_or_default(code).backend();
    let mut tx = TardisFuns::reldb_by_module_or_default(code).conn();
    let compatible_type = TardisFuns::reldb_by_module_or_default(code).compatible_type();
    if TardisFuns::dict.get("__RBUM_INIT__", &tx).await?.is_some() {
        return Ok(());
    }
    tx.begin().await?;
    TardisFuns::dict.add("__RBUM_INIT__", "", "", &tx).await?;
    tx.init(rbum_domain::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_kind::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_item::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_kind_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_item_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_rel::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_rel_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_rel_env::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_cert_conf::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_cert::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_set::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_set_cate::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.init(rbum_set_item::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
    tx.commit().await?;
    Ok(())
}

pub async fn get_first_account_context<'a>(rbum_kind_code: &str, rbum_domain_code: &str, funs: &TardisFunsInst) -> TardisResult<Option<TardisContext>> {
    #[derive(Deserialize, sea_orm::FromQueryResult, Serialize, Clone, Debug)]
    struct TmpContext {
        pub id: String,
        pub own_paths: String,
    }

    let mut query = Query::select();
    query
        .column((rbum_item::Entity, rbum_item::Column::Id))
        .column((rbum_item::Entity, rbum_item::Column::OwnPaths))
        .from(rbum_item::Entity)
        .inner_join(
            rbum_kind::Entity,
            Expr::col((rbum_kind::Entity, rbum_kind::Column::Id)).equals((rbum_item::Entity, rbum_item::Column::RelRbumKindId)),
        )
        .inner_join(
            rbum_domain::Entity,
            Expr::col((rbum_domain::Entity, rbum_domain::Column::Id)).equals((rbum_item::Entity, rbum_item::Column::RelRbumDomainId)),
        )
        .and_where(Expr::col((rbum_kind::Entity, rbum_kind::Column::Code)).eq(rbum_kind_code))
        .and_where(Expr::col((rbum_domain::Entity, rbum_domain::Column::Code)).eq(rbum_domain_code))
        .order_by((rbum_item::Entity, rbum_item::Column::CreateTime), Order::Asc);

    let context: Option<TmpContext> = funs.db().get_dto(&query).await?;

    if let Some(context) = context {
        Ok(Some(TardisContext {
            own_paths: context.own_paths.to_string(),
            owner: context.id,
            ak: "_".to_string(),
            roles: vec![],
            groups: vec![],
            ext: Default::default(),
            sync_task_fns: Default::default(),
            async_task_fns: Default::default(),
        }))
    } else {
        Ok(None)
    }
}

pub async fn truncate_data<'a>(funs: &TardisFunsInst) -> TardisResult<()> {
    funs.db().execute(Table::truncate().table(rbum_cert::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_cert_conf::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_domain::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_item::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_item_attr::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_kind::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_kind_attr::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_rel::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_rel_attr::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_rel_env::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_set::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_set_cate::Entity)).await?;
    funs.db().execute(Table::truncate().table(rbum_set_item::Entity)).await?;
    funs.cache().flushdb().await?;
    Ok(())
}