1use super::entity;
2use crate::{ConnectionTrait, DbErr, EntityTrait, ExecResult, RelationDef, Schema};
3
4#[derive(Debug, Default)]
5pub struct RbacCreateTablesParams {
6 pub user_override_relation: Option<RelationDef>,
7 pub user_role_relation: Option<RelationDef>,
8}
9
10pub async fn create_tables<C: ConnectionTrait>(
12 db: &C,
13 RbacCreateTablesParams {
14 user_override_relation,
15 user_role_relation,
16 }: RbacCreateTablesParams,
17) -> Result<(), DbErr> {
18 create_table(db, entity::permission::Entity, None).await?;
19 create_table(db, entity::resource::Entity, None).await?;
20 create_table(db, entity::role::Entity, None).await?;
21 create_table(db, entity::role_hierarchy::Entity, None).await?;
22 create_table(db, entity::role_permission::Entity, None).await?;
23 create_table(db, entity::user_override::Entity, user_override_relation).await?;
24 create_table(db, entity::user_role::Entity, user_role_relation).await?;
25
26 Ok(())
27}
28
29pub fn all_tables() -> Vec<&'static str> {
31 use crate::EntityName;
32
33 vec![
34 entity::permission::Entity.table_name(),
35 entity::resource::Entity.table_name(),
36 entity::role::Entity.table_name(),
37 entity::role_hierarchy::Entity.table_name(),
38 entity::role_permission::Entity.table_name(),
39 entity::user_override::Entity.table_name(),
40 entity::user_role::Entity.table_name(),
41 ]
42}
43
44async fn create_table<C, E>(
45 db: &C,
46 entity: E,
47 rel: Option<RelationDef>,
48) -> Result<ExecResult, DbErr>
49where
50 C: ConnectionTrait,
51 E: EntityTrait,
52{
53 let backend = db.get_database_backend();
54 let schema = Schema::new(backend);
55
56 let mut stmt = schema.create_table_from_entity(entity);
57 if let Some(rel) = rel {
58 stmt.foreign_key(&mut rel.into());
59 }
60 let res = db.execute(&stmt).await?;
61
62 for stmt in schema.create_index_from_entity(entity) {
63 db.execute(&stmt).await?;
64 }
65
66 Ok(res)
67}