Skip to content

Commit

Permalink
feat: Implement get draft articles for non existing article - EXO-70405
Browse files Browse the repository at this point in the history
… (#1164)
  • Loading branch information
azayati authored Mar 27, 2024
1 parent 8be717f commit 07e4686
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,41 @@ public News getNewsById(String newsId,
*/
@Override
public List<News> getNews(NewsFilter filter, Identity currentIdentity) throws Exception {
return new ArrayList<>();
List<News> 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<String> 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;
}

/**
Expand Down Expand Up @@ -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<String, String> draftArticleMetadataItemProperties = new HashMap<>();
Expand Down Expand Up @@ -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<MetadataItem> draftArticleMetadataItems =
metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey,
Expand Down Expand Up @@ -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("/")
Expand All @@ -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<MetadataItem> draftArticleMetadataItems =
metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey,
Expand All @@ -705,13 +739,43 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator
return null;
}

private List<News> buildDraftArticles(NewsFilter filter, Identity currentIdentity) throws Exception {
List<Long> allowedDraftNewsSpacesIds = NewsUtils.getAllowedDraftNewsSpaces(currentIdentity)
.stream()
.map(Space::getId)
.map(spaceId -> Long.parseLong(spaceId))
.toList();
List<News> 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<MetadataItem> draftArticleMetadataItems =
metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<String, String> properties = new HashMap<>();
properties.put(NEWS_SUMMARY, draftPage.getContent());
MetadataItem metadataItem = mock(MetadataItem.class);
List<MetadataItem> 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<Space> 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<News> newsList = newsService.getNews(newsFilter, identity);

// Then
assertNotNull(newsList);
assertEquals(newsList.size(), 1);
}
}
3 changes: 2 additions & 1 deletion webapp/src/main/webapp/news/components/NewsApp.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion webapp/src/main/webapp/news/components/NewsAppItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit 07e4686

Please sign in to comment.