diff --git a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumService.java index 57cb619100..07d1198d67 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/BasicForumService.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/BasicForumService.java @@ -32,5 +32,10 @@ public interface BasicForumService extends Serializable { boolean canDelete(ForumPost forumPost); - void deletePost(ForumPost post); + Deletion deletePost(ForumPost post); + + enum Deletion { + SINGLE_POST, + ENTIRE_THREAD, + } } 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 ed3da2c4a0..a3760aaa8f 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 @@ -185,15 +185,17 @@ public class BasicForumServiceImpl implements BasicForumService { @Override @Transactional - public void deletePost(ForumPost post) { + public Deletion deletePost(ForumPost post) { if (!canDelete(post)) { throw new PostCantBeDeletedException(); } if (isInitialPost(post)) { threadRepository.delete(post.getForumThread()); + return Deletion.ENTIRE_THREAD; } else { post.setDeleted(true); postRepository.save(post); + return Deletion.SINGLE_POST; } } diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java index a6ac11ebcd..9269f37f49 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumService.java @@ -24,4 +24,8 @@ public interface ProjectForumService { List<Pair<ProjectThread, ForumPost>> latestPost(Project a, int amount); long getUnreadThreadsCount(Project project, User user); + + boolean canDelete(ProjectThread projectThread, ForumPost forumPost); + + void deletePost(ProjectThread projectThread, ForumPost forumPost); } diff --git a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java index 0c6b65227f..5850bffdc0 100644 --- a/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java +++ b/core/src/main/java/se/su/dsv/scipro/forum/ProjectForumServiceImpl.java @@ -121,6 +121,20 @@ public class ProjectForumServiceImpl implements ProjectForumService { return basicForumService.countUnreadThreads(list, user); } + @Override + public boolean canDelete(ProjectThread projectThread, ForumPost forumPost) { + return basicForumService.canDelete(forumPost); + } + + @Override + @Transactional + public void deletePost(ProjectThread projectThread, ForumPost forumPost) { + BasicForumService.Deletion deletion = basicForumService.deletePost(forumPost); + if (deletion == BasicForumService.Deletion.ENTIRE_THREAD) { + projectThreadRepository.delete(projectThread); + } + } + @Override public ProjectThread findOne(long threadId) { return projectThreadRepository.findOne(threadId); 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 3c35391a5f..d1726b6295 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 @@ -5,6 +5,7 @@ import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -57,7 +58,10 @@ public class BasicForumServiceIntegrationTest extends IntegrationTest { setLoggedInAs(commenter); assertTrue(basicForumService.canDelete(reply)); - assertDoesNotThrow(() -> basicForumService.deletePost(reply)); + assertDoesNotThrow(() -> { + BasicForumService.Deletion deletion = basicForumService.deletePost(reply); + assertEquals(BasicForumService.Deletion.SINGLE_POST, deletion); + }); } @Test @@ -204,7 +208,8 @@ public class BasicForumServiceIntegrationTest extends IntegrationTest { setLoggedInAs(op); - basicForumService.deletePost(post); + BasicForumService.Deletion deletion = basicForumService.deletePost(post); + assertEquals(BasicForumService.Deletion.ENTIRE_THREAD, deletion); ForumThread threadById = basicForumService.findThreadById(thread.getId()); assertNull(threadById, "Thread was not deleted"); diff --git a/view/src/main/java/se/su/dsv/scipro/forum/ForumThread.java b/view/src/main/java/se/su/dsv/scipro/forum/ForumThread.java index d291c15e25..a7a321d3d3 100644 --- a/view/src/main/java/se/su/dsv/scipro/forum/ForumThread.java +++ b/view/src/main/java/se/su/dsv/scipro/forum/ForumThread.java @@ -10,4 +10,10 @@ public interface ForumThread<A> extends IClusterable { ForumPost reply(A a, User poster, String content, Set<Attachment> attachments); String getSubject(A a); void setRead(User user, A a); + + default boolean canDelete(A a, ForumPost forumPost) { + return false; + } + + default void deletePost(A a, ForumPost forumPost) {} } diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ForumPostPanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ForumPostPanel.java index 225240d8e1..3b03413500 100644 --- a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ForumPostPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ForumPostPanel.java @@ -1,6 +1,5 @@ package se.su.dsv.scipro.forum.panels.threaded; -import jakarta.inject.Inject; import org.apache.wicket.Component; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.link.Link; @@ -13,11 +12,9 @@ import se.su.dsv.scipro.components.ListAdapterModel; import se.su.dsv.scipro.components.SmarterLinkMultiLineLabel; import se.su.dsv.scipro.data.enums.DateStyle; import se.su.dsv.scipro.file.FileReference; -import se.su.dsv.scipro.forum.BasicForumService; import se.su.dsv.scipro.forum.dataobjects.ForumPost; import se.su.dsv.scipro.profile.UserLinkPanel; import se.su.dsv.scipro.repository.panels.ViewAttachmentPanel; -import se.su.dsv.scipro.session.SciProSession; public class ForumPostPanel extends Panel { @@ -26,9 +23,6 @@ public class ForumPostPanel extends Panel { public static final String CONTENT = "content"; public static final String ATTACHMENT = "attachment"; - @Inject - private BasicForumService basicForumService; - public ForumPostPanel(String id, final IModel<ForumPost> model) { super(id); add(new UserLinkPanel(POSTED_BY, LambdaModel.of(model, ForumPost::getPostedBy, ForumPost::setPostedBy))); @@ -75,22 +69,23 @@ public class ForumPostPanel extends Panel { @Override public void onClick() { ForumPost post = getModelObject(); - basicForumService.deletePost(post); - onPostDeleted(); + deletePost(post).run(); } @Override protected void onConfigure() { super.onConfigure(); - setVisible(allowDeletion() && basicForumService.canDelete(getModelObject())); + setVisible(deletePost(getModelObject()) != null); } } ); } - protected boolean allowDeletion() { - return false; + /** + * @param forumPost the post to delete + * @return a runnable that deletes the post, or {@code null} if it can not be deleted + */ + protected Runnable deletePost(ForumPost forumPost) { + return null; } - - protected void onPostDeleted() {} } diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ProjectForumThread.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ProjectForumThread.java index f8239b1732..bcb4bb3449 100644 --- a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ProjectForumThread.java +++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ProjectForumThread.java @@ -40,4 +40,14 @@ public class ProjectForumThread implements ForumThread<ProjectThread> { public void setRead(User user, ProjectThread thread) { projectForumService.markRead(user, thread); } + + @Override + public boolean canDelete(ProjectThread projectThread, ForumPost forumPost) { + return projectForumService.canDelete(projectThread, forumPost); + } + + @Override + public void deletePost(ProjectThread projectThread, ForumPost forumPost) { + projectForumService.deletePost(projectThread, forumPost); + } } diff --git a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ViewForumThreadPanel.java b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ViewForumThreadPanel.java index 06b89d7e14..1550ff6310 100644 --- a/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ViewForumThreadPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/forum/panels/threaded/ViewForumThreadPanel.java @@ -62,14 +62,16 @@ public class ViewForumThreadPanel<A> extends GenericPanel<A> { item.add( new ForumPostPanel(POST, item.getModel()) { @Override - protected boolean allowDeletion() { - return true; - } - - @Override - protected void onPostDeleted() { - // Refresh the list of posts - listView.detach(); + protected Runnable deletePost(ForumPost forumPost) { + if (forumThread.canDelete(ViewForumThreadPanel.this.getModelObject(), forumPost)) { + return () -> { + forumThread.deletePost(ViewForumThreadPanel.this.getModelObject(), forumPost); + // Refresh the list of posts + listView.detach(); + }; + } else { + return null; + } } } );