diff --git a/services/src/main/java/org/exoplatform/news/model/NewsDraftObject.java b/services/src/main/java/org/exoplatform/news/model/NewsDraftObject.java index 147f0bf032..2be3c8bf77 100644 --- a/services/src/main/java/org/exoplatform/news/model/NewsDraftObject.java +++ b/services/src/main/java/org/exoplatform/news/model/NewsDraftObject.java @@ -23,7 +23,7 @@ public class NewsDraftObject extends MetadataObject { public NewsDraftObject() { } - public NewsDraftObject(String objectType, String objectId, String parentObjectId) { - super(objectType, objectId, parentObjectId); + public NewsDraftObject(String objectType, String objectId, String parentObjectId, long spaceId) { + super(objectType, objectId, parentObjectId, spaceId); } } 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 9628cac75d..7b1c0d1b1c 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 @@ -366,7 +366,41 @@ public News getNewsById(String newsId, */ @Override public List getNews(NewsFilter filter, Identity currentIdentity) throws Exception { - return new ArrayList<>(); + List newsList = new ArrayList<>(); + if (filter != null) { + if (filter.isArchivedNews()) { + // TODO + } + if (filter.getSearchText() != null && !filter.getSearchText().equals("")) { + // TODO + } else { + // TODO + } + if (filter.isPublishedNews()) { + // TODO + } + + List spaces = filter.getSpaces(); + if (spaces != null && spaces.size() != 0) { + // TODO + } + if (filter.isDraftNews()) { + newsList = buildDraftArticles(filter, currentIdentity); + } else if (filter.isScheduledNews()) { + // TODO + } else { + // TODO + } + } else { + throw new Exception("Unable to build query, filter is null"); + } + newsList.stream().forEach(news -> { + news.setCanEdit(canEditNews(news, currentIdentity.getUserId())); + news.setCanDelete(canDeleteNews(currentIdentity, news.getAuthor(), news.getSpaceId())); + news.setCanPublish(NewsUtils.canPublishNews(news.getSpaceId(), currentIdentity)); + news.setCanArchive(canArchiveNews(currentIdentity, news.getAuthor())); + }); + return newsList; } /** @@ -540,10 +574,11 @@ private News createDraftArticleForNewPage(News draftArticle, String pageOwnerId, draftArticle.setId(draftArticlePage.getId()); draftArticle.setCreationDate(draftArticlePage.getCreatedDate()); draftArticle.setUpdateDate(draftArticlePage.getUpdatedDate()); - + Space draftArticleSpace = spaceService.getSpaceByGroupId(pageOwnerId); NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, draftArticlePage.getId(), - null); + null, + Long.parseLong(draftArticleSpace.getId())); MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0); String draftArticleMetadataItemCreatorIdentityId = identityManager.getOrCreateUserIdentity(draftArticleCreator).getId(); Map draftArticleMetadataItemProperties = new HashMap<>(); @@ -581,9 +616,11 @@ private News updateDraftArticleForNewPage(News draftArticle, String draftArticle // created and updated date set by default during the draft creation // process draftArticlePage = noteService.updateDraftForNewPage(draftArticlePage, System.currentTimeMillis()); + Space draftArticleSpace = spaceService.getSpaceByGroupId(draftArticlePage.getWikiOwner()); NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, draftArticlePage.getId(), - null); + null, + Long.parseLong(draftArticleSpace.getId())); MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0); List draftArticleMetadataItems = metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey, @@ -650,25 +687,20 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator draftArticle.setUpdateDate(draftArticlePage.getUpdatedDate()); draftArticle.setBody(draftArticlePage.getContent()); draftArticle.setPublicationState(PublicationDefaultStates.DRAFT); - if (draftArticlePage.getWikiOwner() != null) { - Space draftArticleSpace = spaceService.getSpaceByGroupId(draftArticlePage.getWikiOwner()); - if (draftArticleSpace != null) { - draftArticle.setSpaceId(draftArticleSpace.getId()); - draftArticle.setSpaceAvatarUrl(draftArticleSpace.getAvatarUrl()); - draftArticle.setSpaceDisplayName(draftArticleSpace.getDisplayName()); - boolean hiddenSpace = draftArticleSpace.getVisibility().equals(Space.HIDDEN) - && !spaceService.isMember(draftArticleSpace, draftArticleCreator) - && !spaceService.isSuperManager(draftArticleCreator); - draftArticle.setHiddenSpace(hiddenSpace); - boolean isSpaceMember = spaceService.isSuperManager(draftArticleCreator) - || spaceService.isMember(draftArticleSpace, draftArticleCreator); - draftArticle.setSpaceMember(isSpaceMember); - if (StringUtils.isNotEmpty(draftArticleSpace.getGroupId())) { - String spaceGroupId = draftArticleSpace.getGroupId().split("/")[2]; - String spaceUrl = "/portal/g/:spaces:" + spaceGroupId + "/" + draftArticleSpace.getPrettyName(); - draftArticle.setSpaceUrl(spaceUrl); - } - } + Space draftArticleSpace = spaceService.getSpaceByGroupId(draftArticlePage.getWikiOwner()); + draftArticle.setSpaceId(draftArticleSpace.getId()); + draftArticle.setSpaceAvatarUrl(draftArticleSpace.getAvatarUrl()); + draftArticle.setSpaceDisplayName(draftArticleSpace.getDisplayName()); + boolean hiddenSpace = draftArticleSpace.getVisibility().equals(Space.HIDDEN) + && !spaceService.isMember(draftArticleSpace, draftArticleCreator) && !spaceService.isSuperManager(draftArticleCreator); + draftArticle.setHiddenSpace(hiddenSpace); + boolean isSpaceMember = spaceService.isSuperManager(draftArticleCreator) + || spaceService.isMember(draftArticleSpace, draftArticleCreator); + draftArticle.setSpaceMember(isSpaceMember); + if (StringUtils.isNotEmpty(draftArticleSpace.getGroupId())) { + String spaceGroupId = draftArticleSpace.getGroupId().split("/")[2]; + String spaceUrl = "/portal/g/:spaces:" + spaceGroupId + "/" + draftArticleSpace.getPrettyName(); + draftArticle.setSpaceUrl(spaceUrl); } StringBuilder draftArticleUrl = new StringBuilder(""); draftArticleUrl.append("/") @@ -680,8 +712,10 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator .append("&type=draft"); draftArticle.setUrl(draftArticleUrl.toString()); - NewsDraftObject draftArticleMetaDataObject = - new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, draftArticle.getId(), null); + NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, + draftArticle.getId(), + null, + Long.parseLong(draftArticleSpace.getId())); MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0); List draftArticleMetadataItems = metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey, @@ -705,13 +739,43 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator return null; } + private List buildDraftArticles(NewsFilter filter, Identity currentIdentity) throws Exception { + List allowedDraftNewsSpacesIds = NewsUtils.getAllowedDraftNewsSpaces(currentIdentity) + .stream() + .map(Space::getId) + .map(spaceId -> Long.parseLong(spaceId)) + .toList(); + List draftArticles = + metadataService.getMetadataItemsByMetadataNameAndTypeAndObjectAndSpaceIds(NEWS_METADATA_NAME, + NEWS_METADATA_TYPE.getName(), + NEWS_METADATA_DRAFT_OBJECT_TYPE, + allowedDraftNewsSpacesIds, + filter.getOffset(), + filter.getLimit()) + .stream() + .map(draftArticle -> { + try { + return buildDraftArticle(draftArticle.getObjectId(), currentIdentity.getUserId()); + } catch (IllegalAccessException | WikiException e) { + // TODO Auto-generated catch + // block + e.printStackTrace(); + return null; + } + }) + .toList(); + return draftArticles; + } + private void deleteDraftArticle(String draftArticleId, String draftArticleCreator) throws Exception { DraftPage draftArticlePage = noteService.getDraftNoteById(draftArticleId, draftArticleCreator); if (draftArticlePage != null) { noteService.removeDraftById(draftArticlePage.getId()); + Space draftArticleSpace = spaceService.getSpaceByGroupId(draftArticlePage.getWikiOwner()); NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE, draftArticlePage.getId(), - null); + null, + Long.parseLong(draftArticleSpace.getId())); MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0); List draftArticleMetadataItems = metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey, 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 81720e5bd0..564cc3bc27 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 @@ -24,6 +24,7 @@ import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -35,6 +36,7 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,6 +53,7 @@ import org.exoplatform.commons.search.index.IndexingService; import org.exoplatform.commons.utils.CommonsUtils; import org.exoplatform.container.PortalContainer; +import org.exoplatform.news.filter.NewsFilter; import org.exoplatform.news.model.News; import org.exoplatform.news.model.NewsDraftObject; import org.exoplatform.news.service.NewsService; @@ -378,4 +381,62 @@ public void testDeleteDraftArticle() throws Exception { verify(noteService, times(1)).removeDraftById(draftPage.getId()); verify(metadataService, times(1)).deleteMetadataItem(any(Long.class), anyBoolean()); } + + @Test + public void testGetDraftArticles() throws Exception { + + // Given + DraftPage draftPage = new DraftPage(); + draftPage.setContent("draft body"); + draftPage.setTitle("draft article for new page"); + draftPage.setId("1"); + draftPage.setAuthor("john"); + draftPage.setWikiOwner("/space/groupId"); + + Space space1 = mock(Space.class); + when(space1.getId()).thenReturn("1"); + when(spaceService.getSpaceByGroupId(anyString())).thenReturn(space1); + when(space1.getGroupId()).thenReturn("/space/groupId"); + when(space1.getAvatarUrl()).thenReturn("space/avatar/url"); + when(space1.getDisplayName()).thenReturn("spaceDisplayName"); + when(space1.getVisibility()).thenReturn("public"); + when(spaceService.getSpaceById("1")).thenReturn(space1); + when(spaceService.isSuperManager(anyString())).thenReturn(true); + when(noteService.getDraftNoteById(anyString(), anyString())).thenReturn(draftPage); + + Map properties = new HashMap<>(); + properties.put(NEWS_SUMMARY, draftPage.getContent()); + MetadataItem metadataItem = mock(MetadataItem.class); + List metadataItems = Arrays.asList(metadataItem); + when(metadataItem.getObjectId()).thenReturn("1"); + when(metadataItem.getProperties()).thenReturn(properties); + when(metadataService.getMetadataItemsByMetadataAndObject(any(MetadataKey.class), + any(MetadataObject.class))).thenReturn(metadataItems); + PORTAL_CONTAINER.when(() -> PortalContainer.getCurrentPortalContainerName()).thenReturn("portal"); + COMMONS_UTILS.when(() -> CommonsUtils.getCurrentPortalOwner()).thenReturn("dw"); + Identity identity = mock(Identity.class); + when(identity.getUserId()).thenReturn("john"); + List allowedDraftNewsSpaces = Arrays.asList(space1); + NEWS_UTILS.when(() -> NewsUtils.getAllowedDraftNewsSpaces(identity)).thenReturn(allowedDraftNewsSpaces); + when(metadataService.getMetadataItemsByMetadataNameAndTypeAndObjectAndSpaceIds(anyString(), + anyString(), + anyString(), + anyList(), + anyLong(), + anyLong())).thenReturn(metadataItems); + + when(activityManager.getActivity(nullable(String.class))).thenReturn(null); + when(newsTargetingService.getTargetsByNewsId(anyString())).thenReturn(null); + + // When + NewsFilter newsFilter = new NewsFilter(); + newsFilter.setDraftNews(true); + newsFilter.setOffset(0); + newsFilter.setLimit(10); + List newsList = newsService.getNews(newsFilter, identity); + + // Then + assertNotNull(newsList); + assertEquals(newsList.size(), 1); + } } diff --git a/webapp/src/main/webapp/news/components/NewsApp.vue b/webapp/src/main/webapp/news/components/NewsApp.vue index 2c0079b025..77d5af1d5c 100644 --- a/webapp/src/main/webapp/news/components/NewsApp.vue +++ b/webapp/src/main/webapp/news/components/NewsApp.vue @@ -246,7 +246,7 @@ export default { updatedDate: this.isDraftsFilter ? newsPublicationDate : newsUpdateDate, spaceDisplayName: item.spaceDisplayName, spaceUrl: item.spaceUrl, - url: this.isDraftsFilter ? `${eXo.env.portal.context}/${eXo.env.portal.metaPortalName}/news/editor?spaceId=${item.spaceId}&newsId=${item.id}&activityId=${activityId}` : item.url, + url: this.isDraftsFilter ? `${eXo.env.portal.context}/${eXo.env.portal.metaPortalName}/news/editor?spaceId=${item.spaceId}&newsId=${item.id}&activityId=${activityId}&type=draft` : item.url, authorFullName: item.authorDisplayName, authorProfileURL: `${eXo.env.portal.context}/${eXo.env.portal.metaPortalName}/profile/${item.author}`, viewsCount: item.viewsCount == null ? 0 : item.viewsCount, @@ -265,6 +265,7 @@ export default { hiddenSpace: item.hiddenSpace, spaceId: item.spaceId, target: this.newsFilter === 'drafts' ? '_blank' : '_self', + type: this.newsFilter === 'drafts' ? 'draft' : 'article' }); }); if (append) { diff --git a/webapp/src/main/webapp/news/components/NewsAppItem.vue b/webapp/src/main/webapp/news/components/NewsAppItem.vue index 55c2f59084..f41e072e93 100644 --- a/webapp/src/main/webapp/news/components/NewsAppItem.vue +++ b/webapp/src/main/webapp/news/components/NewsAppItem.vue @@ -168,7 +168,7 @@ export default { }, methods: { editLink(news) { - const editUrl = `${eXo.env.portal.context}/${eXo.env.portal.metaPortalName}/news/editor?spaceId=${news.spaceId}&newsId=${news.newsId}&activityId=${news.activityId}`; + const editUrl = `${eXo.env.portal.context}/${eXo.env.portal.metaPortalName}/news/editor?spaceId=${news.spaceId}&newsId=${news.newsId}&activityId=${news.activityId}&type=${news.type}`; window.open(editUrl, '_blank'); }, deleteConfirmDialog() {