sz_rust_orm_facade/data_scope/modes/
dept.rs1use 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
11pub 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}