From 123a7dcac5c44882abb0fd36d3706dc676e41c22 Mon Sep 17 00:00:00 2001 From: Sofien Haj Chedhli Date: Tue, 26 Mar 2024 14:58:14 +0100 Subject: [PATCH] feat: Create the news root page if it does not exist when creating the first draft article - EXO-70331 (#1160) --- .../news/service/impl/NewsServiceImplV2.java | 69 +++++++++++++++---- .../service/impl/NewsServiceImplV2Test.java | 10 ++- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java b/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java index dc6eaf7028..018805175d 100644 --- a/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java +++ b/services/src/main/java/org/exoplatform/news/service/impl/NewsServiceImplV2.java @@ -23,6 +23,7 @@ import java.io.FileInputStream; import java.io.InputStream; import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -69,7 +70,10 @@ import org.exoplatform.wiki.WikiException; import org.exoplatform.wiki.model.DraftPage; import org.exoplatform.wiki.model.Page; +import org.exoplatform.wiki.model.Wiki; +import org.exoplatform.wiki.model.WikiType; import org.exoplatform.wiki.service.NoteService; +import org.exoplatform.wiki.service.WikiService; public class NewsServiceImplV2 implements NewsService { @@ -89,6 +93,7 @@ public class NewsServiceImplV2 implements NewsService { public static final String NEWS_UPLOAD_ID = "uploadId"; + private static final Log LOG = ExoLogger.getLogger(NewsServiceImplV2.class); private final SpaceService spaceService; @@ -111,6 +116,8 @@ public class NewsServiceImplV2 implements NewsService { private final ActivityManager activityManager; + private final WikiService wikiService; + public NewsServiceImplV2(SpaceService spaceService, NoteService noteService, MetadataService metadataService, @@ -120,6 +127,7 @@ public NewsServiceImplV2(SpaceService spaceService, IdentityManager identityManager, UserACL userACL, ActivityManager activityManager, + WikiService wikiService, UploadService uploadService) { this.spaceService = spaceService; this.noteService = noteService; @@ -131,6 +139,7 @@ public NewsServiceImplV2(SpaceService spaceService, this.identityManager = identityManager; this.userACL = userACL; this.activityManager = activityManager; + this.wikiService = wikiService; } /** @@ -486,14 +495,28 @@ public boolean canArchiveNews(Identity currentIdentity, String newsAuthor) { } private News createDraftArticleForNewPage(News draftArticle, String pageOwnerId, String draftArticleCreator) throws Exception { - Page articlesRootPage = getArticlesRootPage(pageOwnerId); - if (articlesRootPage != null) { + Wiki wiki = wikiService.getWikiByTypeAndOwner(WikiType.GROUP.name().toLowerCase(), pageOwnerId); + Page newsArticlesRootNotePage = null; + if (wiki != null) { + newsArticlesRootNotePage = noteService.getNoteOfNoteBookByName(WikiType.GROUP.name().toLowerCase(), pageOwnerId, NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); + // create the news root page if the wiki exist + if (newsArticlesRootNotePage == null) { + newsArticlesRootNotePage = createNewsArticlesNoteRootPage(wiki); + } + } else { + // create the wiki + pageOwnerId = formatWikiOwnerToGroupId(pageOwnerId); + wiki = wikiService.createWiki(WikiType.GROUP.name().toLowerCase(), pageOwnerId); + // create the news root page + newsArticlesRootNotePage = createNewsArticlesNoteRootPage(wiki); + } + if (newsArticlesRootNotePage != null) { DraftPage draftArticlePage = new DraftPage(); draftArticlePage.setNewPage(true); draftArticlePage.setTargetPageId(null); draftArticlePage.setTitle(draftArticle.getTitle()); draftArticlePage.setContent(draftArticle.getBody()); - draftArticlePage.setParentPageId(articlesRootPage.getId()); + draftArticlePage.setParentPageId(newsArticlesRootNotePage.getId()); draftArticlePage.setAuthor(draftArticle.getAuthor()); draftArticlePage = noteService.createDraftForNewPage(draftArticlePage, System.currentTimeMillis()); @@ -527,15 +550,6 @@ private News createDraftArticleForNewPage(News draftArticle, String pageOwnerId, return null; } - private Page getArticlesRootPage(String ownerId) { - List notes = - noteService.getNotesOfWiki("group", ownerId) - .stream() - .filter(e -> e.getName().equals(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME) && e.getParentPageId() == null) - .toList(); - return notes.isEmpty() ? null : notes.get(0); - } - private News recreateIfDraftDeleted(News news) throws Exception { return null; } @@ -756,6 +770,37 @@ private boolean isMemberOfsharedInSpaces(News news, String username) { return false; } + private Page createNewsArticlesNoteRootPage(Wiki wiki) throws WikiException { + if (wiki != null) { + Page newsArticlesRootNotePage = new Page(); + newsArticlesRootNotePage.setWikiType(wiki.getType()); + newsArticlesRootNotePage.setWikiOwner(wiki.getOwner()); + newsArticlesRootNotePage.setName(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); + newsArticlesRootNotePage.setTitle(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); + Date now = Calendar.getInstance().getTime(); + newsArticlesRootNotePage.setCreatedDate(now); + newsArticlesRootNotePage.setUpdatedDate(now); + newsArticlesRootNotePage.setContent(""); + // inherit syntax from wiki + newsArticlesRootNotePage.setSyntax(wiki.getPreferences().getWikiPreferencesSyntax().getDefaultSyntax()); + return noteService.createNote(wiki, null, newsArticlesRootNotePage); + } + return null; + } + + private String formatWikiOwnerToGroupId(String wikiOwner) { + if (wikiOwner == null || wikiOwner.length() == 0) { + return null; + } + if (!wikiOwner.startsWith("/")) { + wikiOwner = "/" + wikiOwner; + } + if (wikiOwner.endsWith("/")) { + wikiOwner = wikiOwner.substring(0, wikiOwner.length() - 1); + } + return wikiOwner; + } + private void sendNotification(String currentUserId, News news, NotificationConstants.NOTIFICATION_CONTEXT context) throws Exception { diff --git a/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java b/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java index b3ba3b80eb..c76b318bcc 100644 --- a/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java +++ b/services/src/test/java/org/exoplatform/news/service/impl/NewsServiceImplV2Test.java @@ -41,6 +41,8 @@ import org.exoplatform.portal.config.UserACL; import org.exoplatform.social.core.manager.ActivityManager; +import org.exoplatform.wiki.model.Wiki; +import org.exoplatform.wiki.service.WikiService; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; @@ -100,6 +102,9 @@ public class NewsServiceImplV2Test { @Mock ActivityManager activityManager; + @Mock + WikiService wikiService; + private NewsService newsService; private UserACL userACL; @@ -122,6 +127,7 @@ public void setUp() { identityManager, userACL, activityManager, + wikiService, uploadService); } @@ -156,6 +162,8 @@ public void testCreateDraftArticle() throws Exception { when(identity.getUserId()).thenReturn("john"); when(spaceService.getSpaceById(any())).thenReturn(space); when(spaceService.isSuperManager(anyString())).thenReturn(true); + Wiki wiki = mock(Wiki.class); + when(wikiService.getWikiByTypeAndOwner(anyString(), anyString())).thenReturn(wiki); org.exoplatform.wiki.model.Page rootPage = mock(org.exoplatform.wiki.model.Page.class); when(rootPage.getName()).thenReturn(NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME); // @@ -164,7 +172,7 @@ public void testCreateDraftArticle() throws Exception { // assertNull(savedDraftArticle); // - when(noteService.getNotesOfWiki("group", space.getGroupId())).thenReturn(Arrays.asList(rootPage)); + when(noteService.getNoteOfNoteBookByName("group", space.getGroupId(), NEWS_ARTICLES_ROOT_NOTE_PAGE_NAME)).thenReturn(rootPage); when(noteService.createDraftForNewPage(any(DraftPage.class), anyLong())).thenReturn(draftPage); when(rootPage.getId()).thenReturn("1"); org.exoplatform.social.core.identity.model.Identity identity1 =