TF-2085 Add RuleConditionGroup

(cherry picked from commit d6e642fe707627a29931265fe156d17fb01d8d64)
This commit is contained in:
hieubt
2023-09-20 12:34:12 +07:00
committed by Dat Vu
parent 286258016f
commit 675259a813
3 changed files with 87 additions and 3 deletions
@@ -0,0 +1,37 @@
import 'package:jmap_dart_client/jmap/core/filter/filter_condition.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart';
part 'rule_condition_group.g.dart';
enum ConditionCombiner {
@JsonValue('AND')
AND,
@JsonValue('OR')
OR
}
@JsonSerializable()
class RuleConditionGroup extends FilterCondition {
final ConditionCombiner conditionCombiner;
final List<RuleCondition> conditions;
RuleConditionGroup({
required this.conditionCombiner,
required this.conditions,
});
@override
List<Object?> get props => [
conditionCombiner,
conditions,
];
factory RuleConditionGroup.fromJson(Map<String, dynamic> json) =>
_$RuleConditionGroupFromJson(json);
@override
Map<String, dynamic> toJson() => _$RuleConditionGroupToJson(this);
}
+19 -3
View File
@@ -4,6 +4,7 @@ import 'package:rule_filter/rule_filter/converter/rule_id_nullable_converter.dar
import 'package:rule_filter/rule_filter/rule.dart'; import 'package:rule_filter/rule_filter/rule.dart';
import 'package:rule_filter/rule_filter/rule_action.dart'; import 'package:rule_filter/rule_filter/rule_action.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart'; import 'package:rule_filter/rule_filter/rule_condition.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:rule_filter/rule_filter/rule_id.dart'; import 'package:rule_filter/rule_filter/rule_id.dart';
part 'tmail_rule.g.dart'; part 'tmail_rule.g.dart';
@@ -14,26 +15,39 @@ part 'tmail_rule.g.dart';
class TMailRule extends Rule { class TMailRule extends Rule {
final RuleId? id; final RuleId? id;
final String name; final String name;
final RuleCondition condition; final RuleCondition? condition;
final RuleConditionGroup? conditionGroup;
final RuleAction action; final RuleAction action;
TMailRule({ TMailRule({
this.id, this.id,
required this.name, required this.name,
required this.condition, this.condition,
this.conditionGroup,
required this.action, required this.action,
}); });
factory TMailRule.fromJson(Map<String, dynamic> json) => factory TMailRule.fromJson(Map<String, dynamic> json) =>
_$TMailRuleFromJson(json); _$TMailRuleFromJson(json);
Map<String, dynamic> toJson() => _$TMailRuleToJson(this); Map<String, dynamic> toJson() {
final result = _$TMailRuleToJson(this);
if (result['condition'] != null) {
result.remove('conditionGroup');
} else {
result.remove('condition');
}
return result;
}
@override @override
List<Object?> get props => [ List<Object?> get props => [
name, name,
condition, condition,
action, action,
conditionGroup,
]; ];
TMailRule copyWith({ TMailRule copyWith({
@@ -41,12 +55,14 @@ class TMailRule extends Rule {
String? name, String? name,
RuleCondition? condition, RuleCondition? condition,
RuleAction? action, RuleAction? action,
RuleConditionGroup? conditionGroup,
}) { }) {
return TMailRule( return TMailRule(
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
condition: condition ?? this.condition, condition: condition ?? this.condition,
action: action ?? this.action, action: action ?? this.action,
conditionGroup: conditionGroup ?? this.conditionGroup,
); );
} }
} }
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:rule_filter/rule_filter/rule_action.dart'; import 'package:rule_filter/rule_filter/rule_action.dart';
import 'package:rule_filter/rule_filter/rule_append_in.dart'; import 'package:rule_filter/rule_filter/rule_append_in.dart';
import 'package:rule_filter/rule_filter/rule_condition.dart'; import 'package:rule_filter/rule_filter/rule_condition.dart';
import 'package:rule_filter/rule_filter/rule_condition_group.dart';
import 'package:rule_filter/rule_filter/rule_filter_id.dart'; import 'package:rule_filter/rule_filter/rule_filter_id.dart';
import 'package:rule_filter/rule_filter/rule_id.dart'; import 'package:rule_filter/rule_filter/rule_id.dart';
import 'package:rule_filter/rule_filter/set/set_rule_filter_method.dart'; import 'package:rule_filter/rule_filter/set/set_rule_filter_method.dart';
@@ -20,6 +21,21 @@ void main() {
final expectedUpdated = TMailRule( final expectedUpdated = TMailRule(
id: RuleId(id: Id('1')), id: RuleId(id: Id('1')),
name: 'My first rule', name: 'My first rule',
conditionGroup: RuleConditionGroup(
conditionCombiner: ConditionCombiner.AND,
conditions: [
RuleCondition(
value: 'question',
comparator: Comparator.contains,
field: Field.subject,
),
RuleCondition(
field: Field.from,
comparator: Comparator.contains,
value: 'user2'
)
]
),
condition: RuleCondition( condition: RuleCondition(
value: 'question', value: 'question',
comparator: Comparator.contains, comparator: Comparator.contains,
@@ -54,6 +70,21 @@ void main() {
"singleton": { "singleton": {
"id": "1", "id": "1",
"name": "My first rule", "name": "My first rule",
"conditionGroup": {
"conditionCombiner": "AND",
"conditions": [
{
"field": "subject",
"comparator": "contains",
"value": "question"
},
{
"field": "from",
"comparator": "contains",
"value": "user2"
},
]
},
"condition": { "condition": {
"field": "subject", "field": "subject",
"comparator": "contains", "comparator": "contains",