This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch 3.9.x
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 7d6b19f0fd22f4fb2644c89a3c207f347ebf8f56
Author: Quan Tran <[email protected]>
AuthorDate: Tue Sep 30 09:58:55 2025 +0700

    JAMES-4148 Filter serializer should support moveTo action
---
 .../src/test/resources/json/event-v4.json          |  3 +
 .../src/test/resources/json/eventComplex-v4.json   | 15 +++++
 .../src/test/resources/json/increment-v4.json      | 12 ++++
 .../org/apache/james/jmap/api/filtering/Rule.java  | 68 +++++++++++++++++++---
 .../apache/james/jmap/api/filtering/RuleDTO.java   | 49 +++++++++++++++-
 .../james/jmap/api/filtering/RuleFixture.java      |  3 +-
 6 files changed, 138 insertions(+), 12 deletions(-)

diff --git 
a/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json 
b/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json
index e354e06566..bb54fd57fa 100644
--- a/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/event-v4.json
@@ -25,6 +25,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
diff --git 
a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json 
b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json
index 437eaeff39..96ea617cad 100644
--- 
a/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json
+++ 
b/server/data/data-jmap-cassandra/src/test/resources/json/eventComplex-v4.json
@@ -40,6 +40,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -67,6 +70,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -94,6 +100,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -121,6 +130,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -148,6 +160,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
diff --git 
a/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json 
b/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json
index fb7b0b6174..1509fc10ef 100644
--- a/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json
+++ b/server/data/data-jmap-cassandra/src/test/resources/json/increment-v4.json
@@ -20,6 +20,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -47,6 +50,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -76,6 +82,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
@@ -105,6 +114,9 @@
         "appendIn": {
           "mailboxIds":["id-01"]
         },
+        "moveTo": {
+          "mailboxName": "Trash"
+        },
         "important":true,
         "keyworkds":["abc"],
         "reject":true,
diff --git 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
index c892df422a..123439a385 100644
--- 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
+++ 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/Rule.java
@@ -376,6 +376,39 @@ public class Rule {
             }
         }
 
+        public static class MoveTo {
+            private final String mailboxName;
+
+            public MoveTo(String mailboxName) {
+                this.mailboxName = mailboxName;
+            }
+
+            public String getMailboxName() {
+                return mailboxName;
+            }
+
+            @Override
+            public final boolean equals(Object o) {
+                if (o instanceof MoveTo) {
+                    MoveTo moveTo = (MoveTo) o;
+                    return Objects.equals(mailboxName, moveTo.mailboxName);
+                }
+                return false;
+            }
+
+            @Override
+            public final int hashCode() {
+                return Objects.hash(mailboxName);
+            }
+
+            @Override
+            public String toString() {
+                return MoreObjects.toStringHelper(this)
+                    .add("mailboxName", mailboxName)
+                    .toString();
+            }
+        }
+
         public static class Builder {
             private AppendInMailboxes appendInMailboxes;
             private boolean markAsSeen;
@@ -383,6 +416,7 @@ public class Rule {
             private boolean reject;
             private List<String> withKeywords;
             private Optional<Forward> forward;
+            private Optional<MoveTo> moveTo;
 
             public Builder setAppendInMailboxes(AppendInMailboxes 
appendInMailboxes) {
                 this.appendInMailboxes = appendInMailboxes;
@@ -419,6 +453,11 @@ public class Rule {
                 return this;
             }
 
+            public Builder setMoveTo(Optional<MoveTo> moveTo) {
+                this.moveTo = moveTo;
+                return this;
+            }
+
             public Action build() {
                 appendInMailboxes = Optional.ofNullable(appendInMailboxes)
                     
.orElse(Rule.Action.AppendInMailboxes.withMailboxIds(ImmutableList.of()));
@@ -426,8 +465,10 @@ public class Rule {
                     .orElse(ImmutableList.of());
                 forward = Optional.ofNullable(forward)
                     .orElse(Optional.empty());
+                moveTo = Optional.ofNullable(moveTo)
+                    .orElse(Optional.empty());
 
-                return new Action(appendInMailboxes, markAsSeen, 
markAsImportant, reject, withKeywords, forward);
+                return new Action(appendInMailboxes, markAsSeen, 
markAsImportant, reject, withKeywords, forward, moveTo);
             }
         }
 
@@ -436,16 +477,18 @@ public class Rule {
         }
 
         public static Action of(AppendInMailboxes appendInMailboxes) {
-            return new Action(appendInMailboxes, false, false, false, 
ImmutableList.of(), Optional.empty());
+            return new Action(appendInMailboxes, false, false, false, 
ImmutableList.of(), Optional.empty(),
+                Optional.empty());
         }
 
         public static Action of(AppendInMailboxes appendInMailboxes, boolean 
markAsSeen, boolean markAsImportant, boolean reject, List<String> withKeywords) 
{
-            return new Action(appendInMailboxes, markAsSeen, markAsImportant, 
reject, withKeywords, Optional.empty());
+            return new Action(appendInMailboxes, markAsSeen, markAsImportant, 
reject, withKeywords, Optional.empty(), Optional.empty());
         }
 
         public static Action of(AppendInMailboxes appendInMailboxes, boolean 
markAsSeen, boolean markAsImportant,
-                                boolean reject, List<String> withKeywords, 
Optional<Forward> forward) {
-            return new Action(appendInMailboxes, markAsSeen, markAsImportant, 
reject, withKeywords, forward);
+                                boolean reject, List<String> withKeywords, 
Optional<Forward> forward,
+                                Optional<MoveTo> moveTo) {
+            return new Action(appendInMailboxes, markAsSeen, markAsImportant, 
reject, withKeywords, forward, moveTo);
         }
 
         private final AppendInMailboxes appendInMailboxes;
@@ -454,15 +497,18 @@ public class Rule {
         private final boolean reject;
         private final List<String> withKeywords;
         private final Optional<Forward> forward;
+        private final Optional<MoveTo> moveTo;
 
         private Action(AppendInMailboxes appendInMailboxes, boolean 
markAsSeen, boolean markAsImportant,
-                       boolean reject, List<String> withKeywords, 
Optional<Forward> forward) {
+                       boolean reject, List<String> withKeywords, 
Optional<Forward> forward,
+                       Optional<MoveTo> moveTo) {
             this.appendInMailboxes = appendInMailboxes;
             this.markAsSeen = markAsSeen;
             this.markAsImportant = markAsImportant;
             this.reject = reject;
             this.withKeywords = withKeywords;
             this.forward = forward;
+            this.moveTo = moveTo;
         }
         
         public AppendInMailboxes getAppendInMailboxes() {
@@ -489,6 +535,10 @@ public class Rule {
             return forward;
         }
 
+        public Optional<MoveTo> getMoveTo() {
+            return moveTo;
+        }
+
         @Override
         public final boolean equals(Object o) {
             if (o instanceof Action) {
@@ -498,14 +548,15 @@ public class Rule {
                     && Objects.equals(markAsImportant, action.markAsImportant)
                     && Objects.equals(reject, action.reject)
                     && Objects.equals(withKeywords, action.withKeywords)
-                    && Objects.equals(forward, action.forward);
+                    && Objects.equals(forward, action.forward)
+                    && Objects.equals(moveTo, action.moveTo);
             }
             return false;
         }
 
         @Override
         public final int hashCode() {
-            return Objects.hash(appendInMailboxes, markAsImportant, 
markAsSeen, reject, withKeywords, forward);
+            return Objects.hash(appendInMailboxes, markAsImportant, 
markAsSeen, reject, withKeywords, forward, moveTo);
         }
 
         @Override
@@ -517,6 +568,7 @@ public class Rule {
                 .add("reject", reject)
                 .add("withKeywords", withKeywords)
                 .add("forward", forward)
+                .add("moveTo", moveTo)
                 .toString();
         }
     }
diff --git 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java
 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java
index 9f9794437b..cffdbbdd6a 100644
--- 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java
+++ 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/filtering/RuleDTO.java
@@ -224,13 +224,48 @@ public class RuleDTO {
             }
         }
 
+        public static class MoveToDTO {
+            public static MoveToDTO from(Rule.Action.MoveTo moveTo) {
+                return new MoveToDTO(moveTo.getMailboxName());
+            }
+
+            private final String mailboxName;
+
+            public MoveToDTO(@JsonProperty("mailboxName") String mailboxName) {
+                this.mailboxName = mailboxName;
+            }
+
+            public String getMailboxName() {
+                return mailboxName;
+            }
+
+            public Rule.Action.MoveTo toMoveTo() {
+                return new Rule.Action.MoveTo(mailboxName);
+            }
+
+            @Override
+            public final boolean equals(Object o) {
+                if (o instanceof MoveToDTO) {
+                    MoveToDTO that = (MoveToDTO) o;
+                    return Objects.equals(this.mailboxName, that.mailboxName);
+                }
+                return false;
+            }
+
+            @Override
+            public final int hashCode() {
+                return Objects.hash(mailboxName);
+            }
+        }
+
         public static ActionDTO from(Rule.Action action) {
             return new 
ActionDTO(AppendInMailboxesDTO.from(action.getAppendInMailboxes()),
                 action.isMarkAsSeen(),
                 action.isMarkAsImportant(),
                 action.isReject(),
                 ImmutableList.copyOf(action.getWithKeywords()),
-                action.getForward().map(ForwardDTO::from));
+                action.getForward().map(ForwardDTO::from),
+                action.getMoveTo().map(MoveToDTO::from));
         }
 
         @JsonCreator
@@ -239,13 +274,15 @@ public class RuleDTO {
                          @JsonProperty("important") boolean important,
                          @JsonProperty("reject") boolean reject,
                          @JsonProperty("keywords") @JsonSetter(nulls = 
Nulls.AS_EMPTY)  List<String> keyworkds,
-                         @JsonProperty("forwardTo") Optional<ForwardDTO> 
forwardTo) {
+                         @JsonProperty("forwardTo") Optional<ForwardDTO> 
forwardTo,
+                         @JsonProperty("moveTo") Optional<MoveToDTO> moveTo) {
             this.appendIn = appendIn;
             this.keyworkds = keyworkds;
             this.seen = seen;
             this.important = important;
             this.reject = reject;
             this.forwardTo = forwardTo;
+            this.moveTo = moveTo;
         }
 
         private final AppendInMailboxesDTO appendIn;
@@ -254,6 +291,7 @@ public class RuleDTO {
         private final boolean reject;
         private final List<String> keyworkds;
         private Optional<ForwardDTO> forwardTo;
+        private Optional<MoveToDTO> moveTo;
 
         public AppendInMailboxesDTO getAppendIn() {
             return appendIn;
@@ -279,13 +317,18 @@ public class RuleDTO {
             return forwardTo;
         }
 
+        public Optional<MoveToDTO> getMoveTo() {
+            return moveTo;
+        }
+
         public Rule.Action toAction() {
             return Rule.Action.of(appendIn.toAppendInMailboxes(),
                 isSeen(),
                 isImportant(),
                 isReject(),
                 getKeyworkds(),
-                forwardTo.map(ForwardDTO::toForward));
+                forwardTo.map(ForwardDTO::toForward),
+                moveTo.map(MoveToDTO::toMoveTo));
         }
 
         @Override
diff --git 
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
 
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
index e027ca94f3..daac0973bf 100644
--- 
a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
+++ 
b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/filtering/RuleFixture.java
@@ -43,7 +43,8 @@ public interface RuleFixture {
                 .stream()
                 .map(Throwing.function(MailAddress::new))
                 .collect(ImmutableList.toImmutableList()))
-            .keepACopy()));
+            .keepACopy()),
+        Optional.of(new Rule.Action.MoveTo("Trash")));
     Rule.Builder RULE_BUILDER = 
Rule.builder().name(NAME).conditionGroup(CONDITION).action(ACTION);
     Rule RULE_1 = RULE_BUILDER.id(Rule.Id.of("1")).build();
     Rule RULE_1_MODIFIED = Rule.builder()


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to