#![cfg(feature = "tenancy")]
use crate::core::Model;
use crate::sql::sqlx::PgPool;
use crate::tenancy::TenancyError;
pub use crate::tenancy::permissions::{
assign_role, auto_create_permissions, clear_user_perm, create_role, ensure_tables,
get_or_create_role, grant_role_perm, has_all_perms, has_any_perm, has_perm, model_codenames,
remove_role, revoke_role_perm, set_user_perm, user_permissions, user_roles, user_roles_qs,
Role, RolePermission, UserPermission, UserRole,
};
#[must_use]
pub fn model_codenames_for<T: Model>() -> [String; 4] {
model_codenames(T::SCHEMA.table)
}
#[must_use]
pub fn codename_for<T: Model>(action: &str) -> String {
format!("{}.{action}", T::SCHEMA.table)
}
pub async fn has_perm_for_model<T: Model>(
uid: i64,
action: &str,
pool: &PgPool,
) -> Result<bool, sqlx::Error> {
has_perm(uid, &codename_for::<T>(action), pool).await
}
pub async fn grant_role_perm_for_model<T: Model>(
role_id: i64,
action: &str,
pool: &PgPool,
) -> Result<(), TenancyError> {
grant_role_perm(role_id, &codename_for::<T>(action), pool).await
}
pub async fn revoke_role_perm_for_model<T: Model>(
role_id: i64,
action: &str,
pool: &PgPool,
) -> Result<(), TenancyError> {
revoke_role_perm(role_id, &codename_for::<T>(action), pool).await
}
pub async fn set_user_perm_for_model<T: Model>(
uid: i64,
action: &str,
granted: bool,
pool: &PgPool,
) -> Result<(), TenancyError> {
set_user_perm(uid, &codename_for::<T>(action), granted, pool).await
}
pub async fn clear_user_perm_for_model<T: Model>(
uid: i64,
action: &str,
pool: &PgPool,
) -> Result<(), TenancyError> {
clear_user_perm(uid, &codename_for::<T>(action), pool).await
}
#[cfg(test)]
mod tests {
use super::*;
use crate::sql::Auto;
#[derive(crate::Model)]
#[rustango(table = "perm_t_blog_post")]
#[allow(dead_code)]
pub struct Post {
#[rustango(primary_key)]
pub id: Auto<i64>,
#[rustango(max_length = 200)]
pub title: String,
}
#[test]
fn model_codenames_for_resolves_through_schema() {
let codenames = model_codenames_for::<Post>();
assert_eq!(codenames[0], "perm_t_blog_post.add");
assert_eq!(codenames[1], "perm_t_blog_post.change");
assert_eq!(codenames[2], "perm_t_blog_post.delete");
assert_eq!(codenames[3], "perm_t_blog_post.view");
}
#[test]
fn codename_for_builds_table_dot_action() {
assert_eq!(codename_for::<Post>("publish"), "perm_t_blog_post.publish");
}
}