JAMES-3148 ACL deletion
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
index 43eeef8..376cd0a 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
@@ -49,6 +49,7 @@
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import reactor.core.publisher.Mono;
@@ -64,6 +65,7 @@
private final PreparedStatement conditionalInsertStatement;
private final PreparedStatement conditionalUpdateStatement;
private final PreparedStatement readStatement;
+ private final PreparedStatement deleteStatement;
@Inject
public CassandraACLMapper(Session session, CassandraUserMailboxRightsDAO userMailboxRightsDAO, CassandraConfiguration cassandraConfiguration) {
@@ -72,9 +74,17 @@
this.conditionalInsertStatement = prepareConditionalInsert(session);
this.conditionalUpdateStatement = prepareConditionalUpdate(session);
this.readStatement = prepareReadStatement(session);
+ this.deleteStatement = prepareDelete(session);
this.userMailboxRightsDAO = userMailboxRightsDAO;
}
+ private PreparedStatement prepareDelete(Session session) {
+ return session.prepare(
+ QueryBuilder.delete().from(CassandraACLTable.TABLE_NAME)
+ .where(eq(CassandraACLTable.ID, bindMarker(CassandraACLTable.ID)))
+ .ifExists());
+ }
+
private PreparedStatement prepareConditionalInsert(Session session) {
return session.prepare(
insertInto(CassandraACLTable.TABLE_NAME)
@@ -157,6 +167,12 @@
.map(any -> aclWithVersion.mailboxACL);
}
+ public Mono<Void> delete(CassandraId cassandraId) {
+ return executor.executeVoid(
+ deleteStatement.bind()
+ .setUUID(CassandraACLTable.ID, cassandraId.asUuid()));
+ }
+
private Mono<MailboxACL> insertACL(CassandraId cassandraId, MailboxACL acl) {
return executor.executeReturnApplied(
conditionalInsertStatement.bind()
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index d6b66e9..d6dafc1 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -21,6 +21,7 @@
import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
import static org.apache.james.backends.cassandra.Scenario.Builder.awaitOn;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
@@ -88,6 +89,25 @@
}
@Test
+ void deleteShouldRemoveACL() throws Exception {
+ MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
+ MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);
+
+ cassandraACLMapper.updateACL(MAILBOX_ID,
+ MailboxACL.command().key(key).rights(rights).asAddition());
+
+ cassandraACLMapper.delete(MAILBOX_ID).block();
+
+ assertThat(cassandraACLMapper.getACL(MAILBOX_ID).block()).isEqualTo(MailboxACL.EMPTY);
+ }
+
+ @Test
+ void deleteShouldNotThrowWhenDoesNotExist() {
+ assertThatCode(() -> cassandraACLMapper.delete(MAILBOX_ID).block())
+ .doesNotThrowAnyException();
+ }
+
+ @Test
void addACLWhenNoneStoredShouldReturnUpdatedACL() throws Exception {
MailboxACL.EntryKey key = new MailboxACL.EntryKey("bob", MailboxACL.NameType.user, false);
MailboxACL.Rfc4314Rights rights = new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read);