sz_rust_orm_facade/data_scope/modes/
self_mode.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 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}