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)); + } }