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 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)?;
19 create_table(db, entity::resource::Entity, None)?;
20 create_table(db, entity::role::Entity, None)?;
21 create_table(db, entity::role_hierarchy::Entity, None)?;
22 create_table(db, entity::role_permission::Entity, None)?;
23 create_table(db, entity::user_override::Entity, user_override_relation)?;
24 create_table(db, entity::user_role::Entity, user_role_relation)?;
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
44fn create_table<C, E>(db: &C, entity: E, rel: Option<RelationDef>) -> Result<ExecResult, DbErr>
45where
46 C: ConnectionTrait,
47 E: EntityTrait,
48{
49 let backend = db.get_database_backend();
50 let schema = Schema::new(backend);
51
52 let mut stmt = schema.create_table_from_entity(entity);
53 if let Some(rel) = rel {
54 stmt.foreign_key(&mut rel.into());
55 }
56 let res = db.execute(&stmt)?;
57
58 for stmt in schema.create_index_from_entity(entity) {
59 db.execute(&stmt)?;
60 }
61
62 Ok(res)
63}