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_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<String, dynamic> 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
List<Object?> 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,
);
}
}
@@ -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",