From 675259a8132f062efd60c225d7d694e1edbaf290 Mon Sep 17 00:00:00 2001 From: hieubt Date: Wed, 20 Sep 2023 12:34:12 +0700 Subject: [PATCH] TF-2085 Add RuleConditionGroup (cherry picked from commit d6e642fe707627a29931265fe156d17fb01d8d64) --- .../lib/rule_filter/rule_condition_group.dart | 37 +++++++++++++++++++ rule_filter/lib/rule_filter/tmail_rule.dart | 22 +++++++++-- .../set_rule_filter_method_test.dart | 31 ++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 rule_filter/lib/rule_filter/rule_condition_group.dart diff --git a/rule_filter/lib/rule_filter/rule_condition_group.dart b/rule_filter/lib/rule_filter/rule_condition_group.dart new file mode 100644 index 000000000..30ddf5e71 --- /dev/null +++ b/rule_filter/lib/rule_filter/rule_condition_group.dart @@ -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 conditions; + + RuleConditionGroup({ + required this.conditionCombiner, + required this.conditions, + }); + + @override + List get props => [ + conditionCombiner, + conditions, + ]; + + factory RuleConditionGroup.fromJson(Map json) => + _$RuleConditionGroupFromJson(json); + + @override + Map toJson() => _$RuleConditionGroupToJson(this); + +} diff --git a/rule_filter/lib/rule_filter/tmail_rule.dart b/rule_filter/lib/rule_filter/tmail_rule.dart index f448b1672..265da12a9 100644 --- a/rule_filter/lib/rule_filter/tmail_rule.dart +++ b/rule_filter/lib/rule_filter/tmail_rule.dart @@ -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_action.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'; part 'tmail_rule.g.dart'; @@ -14,26 +15,39 @@ part 'tmail_rule.g.dart'; class TMailRule extends Rule { final RuleId? id; final String name; - final RuleCondition condition; + final RuleCondition? condition; + final RuleConditionGroup? conditionGroup; final RuleAction action; TMailRule({ this.id, required this.name, - required this.condition, + this.condition, + this.conditionGroup, required this.action, }); factory TMailRule.fromJson(Map json) => _$TMailRuleFromJson(json); - Map toJson() => _$TMailRuleToJson(this); + Map toJson() { + final result = _$TMailRuleToJson(this); + + if (result['condition'] != null) { + result.remove('conditionGroup'); + } else { + result.remove('condition'); + } + + return result; + } @override List get props => [ name, condition, action, + conditionGroup, ]; TMailRule copyWith({ @@ -41,12 +55,14 @@ class TMailRule extends Rule { String? name, RuleCondition? condition, RuleAction? action, + RuleConditionGroup? conditionGroup, }) { return TMailRule( id: id ?? this.id, name: name ?? this.name, condition: condition ?? this.condition, action: action ?? this.action, + conditionGroup: conditionGroup ?? this.conditionGroup, ); } } diff --git a/rule_filter/test/rule_filter/set_rule_filter_method_test.dart b/rule_filter/test/rule_filter/set_rule_filter_method_test.dart index 3aed41597..4f6634df3 100644 --- a/rule_filter/test/rule_filter/set_rule_filter_method_test.dart +++ b/rule_filter/test/rule_filter/set_rule_filter_method_test.dart @@ -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_append_in.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_id.dart'; import 'package:rule_filter/rule_filter/set/set_rule_filter_method.dart'; @@ -20,6 +21,21 @@ void main() { final expectedUpdated = TMailRule( id: RuleId(id: Id('1')), 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( value: 'question', comparator: Comparator.contains, @@ -54,6 +70,21 @@ void main() { "singleton": { "id": "1", "name": "My first rule", + "conditionGroup": { + "conditionCombiner": "AND", + "conditions": [ + { + "field": "subject", + "comparator": "contains", + "value": "question" + }, + { + "field": "from", + "comparator": "contains", + "value": "user2" + }, + ] + }, "condition": { "field": "subject", "comparator": "contains",