sea_orm/rbac/
schema.rs

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
10/// Create RBAC tables, will currently fail if any of them already exsits
11pub 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
29/// All tables associated with RBAC, created by SeaORM
30pub 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}