use sea_orm::{ColumnTrait, Condition, EntityTrait, sea_query::Expr};
use crate::secure::{AccessScope, ScopableEntity};
use modkit_security::pep_properties;
pub trait TenantFilterProvider {
fn tenant_condition<E>(scope: &AccessScope) -> Option<Condition>
where
E: ScopableEntity + EntityTrait,
E::Column: ColumnTrait + Copy;
}
pub struct SimpleTenantFilter;
impl TenantFilterProvider for SimpleTenantFilter {
fn tenant_condition<E>(scope: &AccessScope) -> Option<Condition>
where
E: ScopableEntity + EntityTrait,
E::Column: ColumnTrait + Copy,
{
let tenant_ids = scope.all_uuid_values_for(pep_properties::OWNER_TENANT_ID);
if tenant_ids.is_empty() {
return None;
}
let Some(tcol) = E::tenant_col() else {
return Some(Condition::all().add(Expr::value(false)));
};
Some(Condition::all().add(Expr::col(tcol).is_in(tenant_ids)))
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn test_provider_trait_compiles() {
let scope = AccessScope::default();
assert!(scope.is_deny_all());
}
}