From 11f56d5070aaeaa7eef845364c7177c487309225 Mon Sep 17 00:00:00 2001
From: Nico Alt <nicoalt@posteo.org>
Date: Fri, 25 Sep 2020 18:30:44 +0200
Subject: [PATCH] Add method to delete all private messages to REST API

Needed for https://code.briarproject.org/briar/briar-gtk/-/issues/11.

Fixes #1782
---
 briar-headless/README.md                      |  6 +++++
 .../org/briarproject/briar/headless/Router.kt |  3 +++
 .../headless/messaging/MessagingController.kt |  2 ++
 .../messaging/MessagingControllerImpl.kt      | 11 ++++++++
 .../messaging/MessagingControllerImplTest.kt  | 25 +++++++++++++++++++
 5 files changed, 47 insertions(+)

diff --git a/briar-headless/README.md b/briar-headless/README.md
index fbeb7c8042..701c74770c 100644
--- a/briar-headless/README.md
+++ b/briar-headless/README.md
@@ -234,6 +234,12 @@ The text of the message should be posted as JSON:
 }
 ```
 
+### Deleting all private messages
+
+`DELETE /v1/messages/{contactId}/all`
+
+It returns with a status code `200`, if removal was successful.
+
 ### Listing blog posts
 
 `GET /v1/blogs/posts`
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
index 940eac8fe2..25d474b8b3 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
@@ -86,6 +86,9 @@ constructor(
                     get { ctx -> messagingController.list(ctx) }
                     post { ctx -> messagingController.write(ctx) }
                 }
+                path("/messages/:contactId/all") {
+                    delete { ctx -> messagingController.deleteAllMessages(ctx) }
+                }
                 path("/forums") {
                     get { ctx -> forumController.list(ctx) }
                     post { ctx -> forumController.create(ctx) }
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingController.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingController.kt
index 55d7024f4d..cc53b1c237 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingController.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingController.kt
@@ -8,4 +8,6 @@ interface MessagingController {
 
     fun write(ctx: Context): Context
 
+    fun deleteAllMessages(ctx: Context): Context
+
 }
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt
index df5607170e..147f333690 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt
@@ -83,6 +83,17 @@ constructor(
         return ctx.json(m.output(contact.id, text))
     }
 
+    override fun deleteAllMessages(ctx: Context): Context {
+        val contactId = ctx.getContactIdFromPathParam()
+        try {
+            conversationManager.deleteAllMessages(contactId)
+        } catch (e: NoSuchContactException) {
+            throw NotFoundResponse()
+        }
+        return ctx
+
+    }
+
     override fun eventOccurred(e: Event) {
         when (e) {
             is ConversationMessageReceivedEvent<*> -> {
diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt
index 6feac73e2f..96e5b3629f 100644
--- a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt
+++ b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt
@@ -17,6 +17,7 @@ import org.briarproject.bramble.test.ImmediateExecutor
 import org.briarproject.bramble.test.TestUtils.getRandomId
 import org.briarproject.bramble.util.StringUtils.getRandomString
 import org.briarproject.briar.api.client.SessionId
+import org.briarproject.briar.api.conversation.DeletionResult
 import org.briarproject.briar.api.introduction.IntroductionRequest
 import org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_TEXT_LENGTH
 import org.briarproject.briar.api.messaging.MessagingManager
@@ -315,6 +316,30 @@ internal class MessagingControllerImplTest : ControllerTest() {
         assertJsonEquals(json, request.output(contact.id))
     }
 
+    @Test
+    fun testDeleteAllMessages() {
+        every { ctx.pathParam("contactId") } returns "1"
+        every { conversationManager.deleteAllMessages(ContactId(1)) } returns DeletionResult()
+        controller.deleteAllMessages(ctx)
+    }
+
+    @Test
+    fun testDeleteAllMessagesInvalidContactId() {
+        every { ctx.pathParam("contactId") } returns "foo"
+        assertThrows(NotFoundResponse::class.java) {
+            controller.deleteAllMessages(ctx)
+        }
+    }
+
+    @Test
+    fun testDeleteAllMessagesNonexistentContactId() {
+        every { ctx.pathParam("contactId") } returns "1"
+        every { conversationManager.deleteAllMessages(ContactId(1)) } throws NoSuchContactException()
+        assertThrows(NotFoundResponse::class.java) {
+            controller.deleteAllMessages(ctx)
+        }
+    }
+
     private fun expectGetContact() {
         every { ctx.pathParam("contactId") } returns contact.id.int.toString()
         every { contactManager.getContact(contact.id) } returns contact
-- 
GitLab