diff --git a/notes-service/src/main/java/org/exoplatform/wiki/jpa/JPADataStorage.java b/notes-service/src/main/java/org/exoplatform/wiki/jpa/JPADataStorage.java index 6b7718caa..15c572df2 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/jpa/JPADataStorage.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/jpa/JPADataStorage.java @@ -1594,7 +1594,24 @@ public PageVersion getPageVersionById(long versionId) { * {@inheritDoc} */ @Override - public List getDraftsOfWiki(String wikiOwner, String wikiType) { - return convertDraftPageEntitiesToDraftPages(draftPageDAO.findDraftsOfWiki(wikiOwner, wikiType)); + public List getDraftsOfWiki(String wikiOwner, String wikiType, String wikiHome) { + // The Note API allows multiple home pages to be created within the wiki. + // To avoid retrieving drafts from all home pages, + // we need to specifically fetch all pages under the target home page and search + // for drafts. + // Although this approach may seem performance-intensive, it is the only + // reliable solution. + PageEntity pageEntity = pageDAO.getPageOfWikiByName(wikiType, wikiOwner, wikiHome); + List draftPageEntities = new ArrayList<>(); + getDraftsOfPage(pageEntity, draftPageEntities); + return convertDraftPageEntitiesToDraftPages(draftPageEntities); + } + + private void getDraftsOfPage(PageEntity pageEntity, List drafts) { + drafts.addAll(draftPageDAO.findDraftPagesByParentPage(pageEntity.getId())); + List childrenPages = pageDAO.getChildrenPages(pageEntity); + for (PageEntity child : childrenPages) { + getDraftsOfPage(child, drafts); + } } } diff --git a/notes-service/src/main/java/org/exoplatform/wiki/jpa/dao/DraftPageDAO.java b/notes-service/src/main/java/org/exoplatform/wiki/jpa/dao/DraftPageDAO.java index 479414671..0aabbba16 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/jpa/dao/DraftPageDAO.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/jpa/dao/DraftPageDAO.java @@ -116,14 +116,4 @@ public Long countDraftPagesByParentPage(long parentPageId) { .setParameter("parentPageId", parentPageId) .getSingleResult(); } - - public List findDraftsOfWiki(String wikiOwner, String wikiType) { - Query query = getEntityManager().createNativeQuery(""" - SELECT * FROM WIKI_DRAFT_PAGES wdp WHERE wdp.PARENT_PAGE_ID IN - (SELECT wp.PAGE_ID FROM WIKI_PAGES wp INNER JOIN WIKI_WIKIS ww ON wp.WIKI_ID = ww.WIKI_ID - WHERE ww.OWNER=:wikiOwner and ww.type=:wikiType)""", DraftPageEntity.class); - query.setParameter("wikiOwner", wikiOwner); - query.setParameter("wikiType", wikiType); - return query.getResultList(); - } } diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/DataStorage.java b/notes-service/src/main/java/org/exoplatform/wiki/service/DataStorage.java index 0eb0caa70..5a0ba26cd 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/DataStorage.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/DataStorage.java @@ -319,12 +319,14 @@ public default List getAttachmentsOfPage(Page page, boolean loadCont */ PageVersion getPageVersionById(long versionId); + /** * Gets draft pages of a given wiki - * + * * @param wikiOwner wiki owner * @param wikiType wiki type + * @param wikiHome wiki home page * @return {@link List} of {@link DraftPage} */ - List getDraftsOfWiki(String wikiOwner, String wikiType); + List getDraftsOfWiki(String wikiOwner, String wikiType, String wikiHome); } diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/NoteService.java b/notes-service/src/main/java/org/exoplatform/wiki/service/NoteService.java index f94f0a1b7..c284b095c 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/NoteService.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/NoteService.java @@ -858,7 +858,8 @@ Page getNoteByIdAndLang(Long pageId, Identity userIdentity, String source, Strin * * @param wikiOwner wiki owner * @param wikiType wiki type + * @param wikiHome wiki home page * @return {@link List} of {@link DraftPage} */ - List getDraftsOfWiki(String wikiOwner, String wikiType); + List getDraftsOfWiki(String wikiOwner, String wikiType, String wikiHome); } diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java index e16e3e48d..3188ff908 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/impl/NoteServiceImpl.java @@ -1531,12 +1531,13 @@ public void deleteVersionsByNoteIdAndLang(Long noteId, String userName, String l deleteVersionsByNoteIdAndLang(noteId, lang); } + /** * {@inheritDoc} */ @Override - public List getDraftsOfWiki(String wikiOwner, String wikiType) { - return dataStorage.getDraftsOfWiki(wikiOwner, wikiType); + public List getDraftsOfWiki(String wikiOwner, String wikiType, String wikiHome) { + return dataStorage.getDraftsOfWiki(wikiOwner, wikiType, wikiHome); } public ExoCache getRenderingCache() { @@ -1547,7 +1548,6 @@ public Map> getPageLinksMap() { return pageLinksMap; } - // ******* Listeners *******/ public void postUpdatePageVersionLanguage(String versionPageId) { diff --git a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java index 21b8f37aa..14ce12386 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/service/rest/NotesRestService.java @@ -1215,7 +1215,6 @@ public Response getNoteTreeData(@Parameter(description = "Tree of selected path rootNodeData = getJsonTree(noteParam, context, identity, request.getLocale()).getFirst(); treeNodeData.addAll(rootNodeData.getChildren()); } - if (rootNodeData != null) { responseData = List.of(rootNodeData); } @@ -1504,7 +1503,7 @@ private void buildNoteDraftsTree(JsonNodeData rootNode, Map context, Identity identity, Locale locale) { - List draftPages = noteService.getDraftsOfWiki(params.getOwner(), params.getType()); + List draftPages = noteService.getDraftsOfWiki(params.getOwner(), params.getType(), params.getPageName()); Map> draftsByParentPage = draftPages.stream().map(draftPage -> { try { PageTreeNode pageTreeNode = new PageTreeNode(draftPage); @@ -1522,20 +1521,23 @@ private void buildNoteDraftsTree(JsonNodeData rootNode, draftsByParentPage.forEach((parentPageId, drafts) -> { try { drafts = TreeUtils.cleanDraftChildren(drafts, locale); - Page parent = noteService.getNoteById(String.valueOf(parentPageId)); - PageTreeNode pageTreeNode = new PageTreeNode(parent); - Boolean canEdit = context != null && context.get(TreeNode.CAN_EDIT) != null && (Boolean) context.get(TreeNode.CAN_EDIT); - JsonNodeData parentJsonData = TreeUtils.toJsonNodeData(pageTreeNode, - path, - parent, - context, - canEdit, - true, - identity, - locale, - noteService); + JsonNodeData parentJsonData = findParent(parentPageId, treeNodeData); + if (parentJsonData == null) { + Page parent = noteService.getNoteById(String.valueOf(parentPageId)); + PageTreeNode pageTreeNode = new PageTreeNode(parent); + Boolean canEdit = context != null && context.get(TreeNode.CAN_EDIT) != null && (Boolean) context.get(TreeNode.CAN_EDIT); + parentJsonData = TreeUtils.toJsonNodeData(pageTreeNode, + path, + parent, + context, + canEdit, + true, + identity, + locale, + noteService); + } if (!Objects.equals(parentJsonData.getNoteId(), rootNode.getNoteId())) { - parentJsonData.setChildren(drafts); + parentJsonData.addChildren(drafts); treeNodeData.add(parentJsonData); buildPageAscendants(rootNode, parentJsonData, treeNodeData, context, identity, locale, path); } else { @@ -1546,7 +1548,7 @@ private void buildNoteDraftsTree(JsonNodeData rootNode, } }); } - + private void buildPageAscendants(JsonNodeData rootNode, JsonNodeData parentJsonData, List treeNodeData, @@ -1556,23 +1558,28 @@ private void buildPageAscendants(JsonNodeData rootNode, String path) throws Exception { String parentPageId = parentJsonData.getParentPageId(); if (parentPageId != null && !parentPageId.equals(rootNode.getNoteId())) { - Page parent = noteService.getNoteById(parentJsonData.getParentPageId()); - PageTreeNode pageTreeNode = new PageTreeNode(parent); - Boolean canEdit = context != null && context.get(TreeNode.CAN_EDIT) != null && (Boolean) context.get(TreeNode.CAN_EDIT); - JsonNodeData parentNode = TreeUtils.toJsonNodeData(pageTreeNode, - path, - parent, - context, - canEdit, - true, - identity, - locale, - noteService); - parentNode.addChildren(List.of(parentJsonData)); + JsonNodeData parentNode = findParent(parentPageId, treeNodeData); + if (parentNode == null) { + Page parent = noteService.getNoteById(parentJsonData.getParentPageId()); + PageTreeNode pageTreeNode = new PageTreeNode(parent); + Boolean canEdit = context != null && context.get(TreeNode.CAN_EDIT) != null && (Boolean) context.get(TreeNode.CAN_EDIT); + parentNode = TreeUtils.toJsonNodeData(pageTreeNode, path, parent, context, canEdit, true, identity, locale, noteService); + } + addChildIfNoExists(parentNode, parentJsonData); treeNodeData.add(parentNode); buildPageAscendants(rootNode, parentNode, treeNodeData, context, identity, locale, path); } else { - rootNode.addChildren(List.of(parentJsonData)); + addChildIfNoExists(rootNode, parentJsonData); + } + } + + private JsonNodeData findParent(String parentId, List list) { + return list.stream().filter(obj -> obj.getNoteId().equals(parentId)).findFirst().orElse(null); + } + + private void addChildIfNoExists(JsonNodeData parent, JsonNodeData child) { + if (findParent(child.getNoteId(), parent.getChildren()) == null) { + parent.addChildren(List.of(child)); } } } diff --git a/notes-service/src/main/java/org/exoplatform/wiki/tree/JsonNodeData.java b/notes-service/src/main/java/org/exoplatform/wiki/tree/JsonNodeData.java index 28ec02d7e..601c69629 100644 --- a/notes-service/src/main/java/org/exoplatform/wiki/tree/JsonNodeData.java +++ b/notes-service/src/main/java/org/exoplatform/wiki/tree/JsonNodeData.java @@ -126,26 +126,6 @@ public Boolean isHasDraftDescendant() { return hasDraftDescendant; } - public void setHasDraftDescendant(Boolean hasDraftDescendant) { - this.hasDraftDescendant = hasDraftDescendant; - } - - public String getLang() { - return lang; - } - - public void setLang(String lang) { - this.lang = lang; - } - - public String getTargetPageId() { - return targetPageId; - } - - public void setTargetPageId(String targetPageId) { - this.targetPageId = targetPageId; - } - public void addChildren(List children) { if (this.children == null) { this.children = new ArrayList(); diff --git a/notes-service/src/test/java/org/exoplatform/wiki/service/TestNoteService.java b/notes-service/src/test/java/org/exoplatform/wiki/service/TestNoteService.java index 658ca6915..a80f0b71c 100644 --- a/notes-service/src/test/java/org/exoplatform/wiki/service/TestNoteService.java +++ b/notes-service/src/test/java/org/exoplatform/wiki/service/TestNoteService.java @@ -985,7 +985,7 @@ public void testGetDraftsOfWiki() throws Exception { noteService.createDraftForExistPage(draftPage, note, null, new Date().getTime(), "root"); draftPage.setParentPageId(note2.getId()); noteService.createDraftForExistPage(draftPage, note, null, new Date().getTime(), "root"); - assertEquals(2, noteService.getDraftsOfWiki(portalWiki.getOwner(), portalWiki.getType()).size()); + assertEquals(2, noteService.getDraftsOfWiki(portalWiki.getOwner(), portalWiki.getType(), portalWiki.getWikiHome().getName()).size()); } } diff --git a/notes-webapp/src/main/webapp/vue-app/notes/components/NoteContentTableItem.vue b/notes-webapp/src/main/webapp/vue-app/notes/components/NoteContentTableItem.vue index ecdd14f77..1b2e1dd89 100644 --- a/notes-webapp/src/main/webapp/vue-app/notes/components/NoteContentTableItem.vue +++ b/notes-webapp/src/main/webapp/vue-app/notes/components/NoteContentTableItem.vue @@ -20,8 +20,8 @@ -->