From 6834ebaac1d9522e7bcf3168a6686c48fc9850fd Mon Sep 17 00:00:00 2001
From: Andreas Svanberg <andreass@dsv.su.se>
Date: Mon, 10 Mar 2025 14:02:34 +0100
Subject: [PATCH] Allow deletion of initial post

---
 .../scipro/forum/BasicForumServiceImpl.java   | 15 ++++++----
 .../BasicForumServiceIntegrationTest.java     | 29 +++++++++++++++++--
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java
index c74a6fecab..5591930bf2 100644
--- a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java
+++ b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumServiceImpl.java
@@ -158,13 +158,13 @@ public class BasicForumServiceImpl implements BasicForumService {
 
     @Override
     public boolean canDelete(ForumPost forumPost) {
-        ForumPost initialPost = forumPost.getForumThread().getPosts().get(0);
-        if (forumPost.equals(initialPost)) {
-            // The initial post in a thread can never be deleted
-            return false;
+        User user = currentUserProvider.get();
+        if (isInitialPost(forumPost)) {
+            // can delete original if no replies
+            boolean hasNoReplies = forumPost.getForumThread().getPosts().size() == 1;
+            return hasNoReplies && Objects.equals(forumPost.getPostedBy(), user);
         }
 
-        User user = currentUserProvider.get();
         // Current user can be null meaning the call came from the system
         if (user == null) {
             // Allow the system to delete any post
@@ -173,6 +173,11 @@ public class BasicForumServiceImpl implements BasicForumService {
         return Objects.equals(forumPost.getPostedBy(), user);
     }
 
+    private static boolean isInitialPost(ForumPost forumPost) {
+        ForumPost initialPost = forumPost.getForumThread().getPosts().get(0);
+        return forumPost.equals(initialPost);
+    }
+
     @Override
     @Transactional
     public void deletePost(ForumPost post) {
diff --git a/core/src/test/java/se/su/dsv/scipro/forum/BasicForumServiceIntegrationTest.java b/core/src/test/java/se/su/dsv/scipro/forum/BasicForumServiceIntegrationTest.java
index ec5d815af7..d9d762deee 100644
--- a/core/src/test/java/se/su/dsv/scipro/forum/BasicForumServiceIntegrationTest.java
+++ b/core/src/test/java/se/su/dsv/scipro/forum/BasicForumServiceIntegrationTest.java
@@ -32,14 +32,14 @@ public class BasicForumServiceIntegrationTest extends IntegrationTest {
     }
 
     @Test
-    public void can_not_delete_original_post() {
+    public void can_delete_entire_thread_if_no_replies() {
         ForumThread thread = basicForumService.createThread("Test thread");
         ForumPost originalPost = basicForumService.createReply(thread, op, "Test post", Set.of());
 
         setLoggedInAs(op);
 
-        assertFalse(basicForumService.canDelete(originalPost));
-        assertThrows(IllegalArgumentException.class, () -> basicForumService.deletePost(originalPost));
+        assertTrue(basicForumService.canDelete(originalPost));
+        assertDoesNotThrow(() -> basicForumService.deletePost(originalPost));
     }
 
     @Test
@@ -80,4 +80,27 @@ public class BasicForumServiceIntegrationTest extends IntegrationTest {
         assertTrue(basicForumService.canDelete(secondReply));
         assertDoesNotThrow(() -> basicForumService.deletePost(secondReply));
     }
+
+    @Test
+    public void can_not_delete_original_post_with_replies() {
+        ForumThread thread = basicForumService.createThread("Test thread");
+        ForumPost originalPost = basicForumService.createReply(thread, op, "Test post", Set.of());
+        ForumPost reply = basicForumService.createReply(thread, commenter, "Test reply", Set.of());
+
+        setLoggedInAs(op);
+
+        assertFalse(basicForumService.canDelete(originalPost));
+        assertThrows(IllegalArgumentException.class, () -> basicForumService.deletePost(originalPost));
+    }
+
+    @Test
+    public void can_not_delete_someone_elses_original_post() {
+        ForumThread thread = basicForumService.createThread("Test thread");
+        ForumPost originalPost = basicForumService.createReply(thread, op, "Test post", Set.of());
+
+        setLoggedInAs(commenter);
+
+        assertFalse(basicForumService.canDelete(originalPost));
+        assertThrows(IllegalArgumentException.class, () -> basicForumService.deletePost(originalPost));
+    }
 }