Skip to main content

sz_rust_orm_facade/data_scope/modes/
self_mode.rs

1//! SELF 模式 — 仅本人创建的数据(`WHERE creator_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/// SELF 模式评估器
12pub struct SelfMode;
13
14#[async_trait]
15impl ModeEvaluator for SelfMode {
16    async fn evaluate(
17        &self,
18        ctx: &DataScopeContext,
19        rule: &DataScopeRule,
20    ) -> Result<Vec<WhereCondition>, DataScopeError> {
21        let field = rule.creator_field.as_deref().ok_or_else(|| {
22            DataScopeError::InvalidRule("SELF mode requires creator_field".into())
23        })?;
24        Ok(vec![WhereCondition::new(
25            field,
26            WhereOp::Eq,
27            Value::I64(ctx.user_id),
28        )])
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[tokio::test]
37    async fn test_self_mode() {
38        let mode = SelfMode;
39        let ctx = DataScopeContext::new(10, 5, false);
40        let rule = DataScopeRule::new("order", crate::data_scope::rule::DataScopeMode::Self_)
41            .with_creator_field("creator_id");
42        let conditions = mode.evaluate(&ctx, &rule).await.unwrap();
43        assert_eq!(conditions.len(), 1);
44    }
45
46    #[tokio::test]
47    async fn test_self_mode_missing_field() {
48        let mode = SelfMode;
49        let ctx = DataScopeContext::new(10, 5, false);
50        let rule = DataScopeRule::new("order", crate::data_scope::rule::DataScopeMode::Self_);
51        let result = mode.evaluate(&ctx, &rule).await;
52        assert!(result.is_err());
53    }
54}