bios_basic/rbum/
rbum_initializer.rs

1use serde::{Deserialize, Serialize};
2use tardis::basic::dto::TardisContext;
3use tardis::basic::result::TardisResult;
4use tardis::db::reldb_client::TardisActiveModel;
5use tardis::db::sea_orm;
6use tardis::db::sea_orm::sea_query::*;
7use tardis::TardisFuns;
8use tardis::TardisFunsInst;
9
10use crate::rbum::domain::{
11    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,
12};
13use crate::rbum::rbum_config::{RbumConfig, RbumConfigManager};
14
15pub async fn init(code: &str, config: RbumConfig) -> TardisResult<()> {
16    RbumConfigManager::add(code, config)?;
17    TardisFuns::reldb_by_module_or_default(code).init_basic_tables().await?;
18    let db_kind = TardisFuns::reldb_by_module_or_default(code).backend();
19    let mut tx = TardisFuns::reldb_by_module_or_default(code).conn();
20    let compatible_type = TardisFuns::reldb_by_module_or_default(code).compatible_type();
21    if TardisFuns::dict.get("__RBUM_INIT__", &tx).await?.is_some() {
22        return Ok(());
23    }
24    tx.begin().await?;
25    TardisFuns::dict.add("__RBUM_INIT__", "", "", &tx).await?;
26    tx.init(rbum_domain::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
27    tx.init(rbum_kind::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
28    tx.init(rbum_item::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
29    tx.init(rbum_kind_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
30    tx.init(rbum_item_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
31    tx.init(rbum_rel::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
32    tx.init(rbum_rel_attr::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
33    tx.init(rbum_rel_env::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
34    tx.init(rbum_cert_conf::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
35    tx.init(rbum_cert::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
36    tx.init(rbum_set::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
37    tx.init(rbum_set_cate::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
38    tx.init(rbum_set_item::ActiveModel::init(db_kind, Some("update_time"), compatible_type)).await?;
39    tx.commit().await?;
40    Ok(())
41}
42
43pub async fn get_first_account_context<'a>(rbum_kind_code: &str, rbum_domain_code: &str, funs: &TardisFunsInst) -> TardisResult<Option<TardisContext>> {
44    #[derive(Deserialize, sea_orm::FromQueryResult, Serialize, Clone, Debug)]
45    struct TmpContext {
46        pub id: String,
47        pub own_paths: String,
48    }
49
50    let mut query = Query::select();
51    query
52        .column((rbum_item::Entity, rbum_item::Column::Id))
53        .column((rbum_item::Entity, rbum_item::Column::OwnPaths))
54        .from(rbum_item::Entity)
55        .inner_join(
56            rbum_kind::Entity,
57            Expr::col((rbum_kind::Entity, rbum_kind::Column::Id)).equals((rbum_item::Entity, rbum_item::Column::RelRbumKindId)),
58        )
59        .inner_join(
60            rbum_domain::Entity,
61            Expr::col((rbum_domain::Entity, rbum_domain::Column::Id)).equals((rbum_item::Entity, rbum_item::Column::RelRbumDomainId)),
62        )
63        .and_where(Expr::col((rbum_kind::Entity, rbum_kind::Column::Code)).eq(rbum_kind_code))
64        .and_where(Expr::col((rbum_domain::Entity, rbum_domain::Column::Code)).eq(rbum_domain_code))
65        .order_by((rbum_item::Entity, rbum_item::Column::CreateTime), Order::Asc);
66
67    let context: Option<TmpContext> = funs.db().get_dto(&query).await?;
68
69    if let Some(context) = context {
70        Ok(Some(TardisContext {
71            own_paths: context.own_paths.to_string(),
72            owner: context.id,
73            ak: "_".to_string(),
74            roles: vec![],
75            groups: vec![],
76            ext: Default::default(),
77            sync_task_fns: Default::default(),
78            async_task_fns: Default::default(),
79        }))
80    } else {
81        Ok(None)
82    }
83}
84
85pub async fn truncate_data<'a>(funs: &TardisFunsInst) -> TardisResult<()> {
86    funs.db().execute(Table::truncate().table(rbum_cert::Entity)).await?;
87    funs.db().execute(Table::truncate().table(rbum_cert_conf::Entity)).await?;
88    funs.db().execute(Table::truncate().table(rbum_domain::Entity)).await?;
89    funs.db().execute(Table::truncate().table(rbum_item::Entity)).await?;
90    funs.db().execute(Table::truncate().table(rbum_item_attr::Entity)).await?;
91    funs.db().execute(Table::truncate().table(rbum_kind::Entity)).await?;
92    funs.db().execute(Table::truncate().table(rbum_kind_attr::Entity)).await?;
93    funs.db().execute(Table::truncate().table(rbum_rel::Entity)).await?;
94    funs.db().execute(Table::truncate().table(rbum_rel_attr::Entity)).await?;
95    funs.db().execute(Table::truncate().table(rbum_rel_env::Entity)).await?;
96    funs.db().execute(Table::truncate().table(rbum_set::Entity)).await?;
97    funs.db().execute(Table::truncate().table(rbum_set_cate::Entity)).await?;
98    funs.db().execute(Table::truncate().table(rbum_set_item::Entity)).await?;
99    funs.cache().flushdb().await?;
100    Ok(())
101}