Skip to main content

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 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
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
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}