Skip to main content

sz_rust_orm_facade/data_scope/modes/
dept.rs

1//! DEPT 模式 — 本部门数据(`WHERE dept_id = ?`)
2
3use super::ModeEvaluator;
4use crate::data_scope::context::DataScopeContext;
5use crate::data_scope::error::DataScopeError;
6use crate::data_scope::rule::DataScopeRule;
7use crate::repository::{WhereCondition, WhereOp};
8use crate::Value;
9use async_trait::async_trait;
10
11/// DEPT 模式评估器
12pub struct DeptMode;
13
14#[async_trait]
15impl ModeEvaluator for DeptMode {
16    async fn evaluate(
17        &self,
18        ctx: &DataScopeContext,
19        rule: &DataScopeRule,
20    ) -> Result<Vec<WhereCondition>, DataScopeError> {
21        let field = rule
22            .dept_field
23            .as_deref()
24            .ok_or_else(|| DataScopeError::InvalidRule("DEPT mode requires dept_field".into()))?;
25        Ok(vec![WhereCondition::new(
26            field,
27            WhereOp::Eq,
28            Value::I64(ctx.dept_id),
29        )])
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[tokio::test]
38    async fn test_dept_mode() {
39        let mode = DeptMode;
40        let ctx = DataScopeContext::new(1, 5, false);
41        let rule = DataScopeRule::new("order", crate::data_scope::rule::DataScopeMode::Dept)
42            .with_dept_field("dept_id");
43        let conditions = mode.evaluate(&ctx, &rule).await.unwrap();
44        assert_eq!(conditions.len(), 1);
45    }
46
47    #[tokio::test]
48    async fn test_dept_mode_missing_field() {
49        let mode = DeptMode;
50        let ctx = DataScopeContext::new(1, 5, false);
51        let rule = DataScopeRule::new("order", crate::data_scope::rule::DataScopeMode::Dept);
52        let result = mode.evaluate(&ctx, &rule).await;
53        assert!(result.is_err());
54    }
55}