Skip to content

Commit

Permalink
feat: Implement delete draft article - EXO-69641 (#1163)
Browse files Browse the repository at this point in the history
  • Loading branch information
azayati authored Mar 27, 2024
1 parent 123a7dc commit 8be717f
Show file tree
Hide file tree
Showing 4 changed files with 176 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.exoplatform.news.search.NewsESSearchResult;
import org.exoplatform.news.service.NewsService;
import org.exoplatform.news.utils.NewsUtils;
import org.exoplatform.news.utils.NewsUtils.NewsObjectType;
import org.exoplatform.portal.application.localization.LocalizationFilter;
import org.exoplatform.services.cms.thumbnail.ThumbnailService;
import org.exoplatform.services.log.ExoLogger;
Expand Down Expand Up @@ -272,7 +273,7 @@ public Response deleteNews(@Context HttpServletRequest request,
if (StringUtils.isBlank(id)) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
News news = newsService.getNewsById(id, currentIdentity, false);
News news = newsService.getNewsById(id, currentIdentity, false, isDraft ? NewsObjectType.DRAFT.name().toLowerCase() : NewsObjectType.ARTICLE.name().toLowerCase());
if (news == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import org.exoplatform.commons.exception.ObjectNotFoundException;
Expand All @@ -49,6 +48,7 @@
import org.exoplatform.news.service.NewsService;
import org.exoplatform.news.service.NewsTargetingService;
import org.exoplatform.news.utils.NewsUtils;
import org.exoplatform.news.utils.NewsUtils.NewsObjectType;
import org.exoplatform.portal.config.UserACL;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
Expand All @@ -64,6 +64,7 @@
import org.exoplatform.social.metadata.MetadataService;
import org.exoplatform.social.metadata.model.MetadataItem;
import org.exoplatform.social.metadata.model.MetadataKey;
import org.exoplatform.social.metadata.model.MetadataObject;
import org.exoplatform.social.metadata.model.MetadataType;
import org.exoplatform.upload.UploadResource;
import org.exoplatform.upload.UploadService;
Expand Down Expand Up @@ -93,7 +94,6 @@ 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;
Expand Down Expand Up @@ -177,8 +177,10 @@ public News postNews(News news, String poster) throws Exception {
*/
@Override
public boolean canCreateNews(Space space, org.exoplatform.services.security.Identity currentIdentity) throws Exception {
return space != null && (NewsUtils.canPublishNews(space.getId(), currentIdentity) || spaceService.canRedactOnSpace(space, currentIdentity));
return space != null
&& (NewsUtils.canPublishNews(space.getId(), currentIdentity) || spaceService.canRedactOnSpace(space, currentIdentity));
}

/**
* {@inheritDoc}
*/
Expand Down Expand Up @@ -257,8 +259,23 @@ public News updateNews(News news, String updater, Boolean post, boolean publish,
* {@inheritDoc}
*/
@Override
public void deleteNews(String id, Identity currentIdentity, boolean isDraft) throws Exception {

public void deleteNews(String newsId, Identity currentIdentity, boolean isDraft) throws Exception {
News news = getNewsById(newsId,
currentIdentity,
false,
isDraft ? NewsObjectType.DRAFT.name().toLowerCase() : NewsObjectType.ARTICLE.name().toLowerCase());
if (!news.isCanDelete()) {
throw new IllegalArgumentException("User " + currentIdentity.getUserId() + " is not authorized to delete news");
}
if (isDraft) {
deleteDraftArticle(newsId, currentIdentity.getUserId());
} else {
// TODO delete article
indexingService.unindex(NewsIndexingServiceConnector.TYPE, String.valueOf(news.getId()));
MetadataObject newsMetadataObject = new MetadataObject(NewsUtils.NEWS_METADATA_OBJECT_TYPE, newsId);
metadataService.deleteMetadataItemsByObject(newsMetadataObject);
NewsUtils.broadcastEvent(NewsUtils.DELETE_NEWS, currentIdentity.getUserId(), news);
}
}

/**
Expand Down Expand Up @@ -302,20 +319,19 @@ public News getNewsById(String newsId,
boolean editMode,
String newsObjectType) throws IllegalAccessException {
News news = null;
if (newsObjectType == null) {
throw new IllegalArgumentException("required argument news type could not be null");
}
if (DRAFT.name().toLowerCase().equals(newsObjectType)) {
try {
news = buildDraftArticle(newsId, currentIdentity.getUserId());
try {
if (newsObjectType == null) {
throw new IllegalArgumentException("Required argument news object type could not be null");
}
catch (WikiException wikiException) {
return null;
if (DRAFT.name().toLowerCase().equals(newsObjectType)) {
news = buildDraftArticle(newsId, currentIdentity.getUserId());
} else if (LATEST_DRAFT.name().toLowerCase().equals(newsObjectType)) {
// TODO
} else if (ARTICLE.name().toLowerCase().equals(newsObjectType)) {
// TODO
}
} else if (LATEST_DRAFT.name().toLowerCase().equals(newsObjectType)) {
// TODO
} else if (ARTICLE.name().toLowerCase().equals(newsObjectType)) {
// TODO
} catch (Exception exception) {
LOG.error("An error occurred while retrieving news with id {}", newsId, exception);
}
if (news != null) {
if (editMode) {
Expand Down Expand Up @@ -438,18 +454,17 @@ public boolean canViewNews(News news, String authenticatedUser) {
LOG.warn("Can't find space with id {} when checking access on news with id {}", spaceId, news.getId());
return false;
}
if (!news.isPublished()
&& StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.PUBLISHED)
&& !(spaceService.isSuperManager(authenticatedUser)
|| spaceService.isMember(space, authenticatedUser)
if (!news.isPublished() && StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.PUBLISHED)
&& !(spaceService.isSuperManager(authenticatedUser) || spaceService.isMember(space, authenticatedUser)
|| isMemberOfsharedInSpaces(news, authenticatedUser))) {
return false;
}
if (news.isPublished() && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE) && !spaceService.isMember(space, authenticatedUser)) {
if (news.isPublished() && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE)
&& !spaceService.isMember(space, authenticatedUser)) {
return false;
}
if (StringUtils.equals(news.getPublicationState(), PublicationDefaultStates.STAGED)
&& !canScheduleNews(space, NewsUtils.getUserIdentity(authenticatedUser))) {
&& !canScheduleNews(space, NewsUtils.getUserIdentity(authenticatedUser))) {
return false;
}
} catch (Exception e) {
Expand Down Expand Up @@ -498,7 +513,9 @@ private News createDraftArticleForNewPage(News draftArticle, String pageOwnerId,
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);
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);
Expand Down Expand Up @@ -640,11 +657,11 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator
draftArticle.setSpaceAvatarUrl(draftArticleSpace.getAvatarUrl());
draftArticle.setSpaceDisplayName(draftArticleSpace.getDisplayName());
boolean hiddenSpace = draftArticleSpace.getVisibility().equals(Space.HIDDEN)
&& !spaceService.isMember(draftArticleSpace, draftArticleCreator)
&& !spaceService.isSuperManager(draftArticleCreator);
&& !spaceService.isMember(draftArticleSpace, draftArticleCreator)
&& !spaceService.isSuperManager(draftArticleCreator);
draftArticle.setHiddenSpace(hiddenSpace);
boolean isSpaceMember = spaceService.isSuperManager(draftArticleCreator)
|| spaceService.isMember(draftArticleSpace, draftArticleCreator);
|| spaceService.isMember(draftArticleSpace, draftArticleCreator);
draftArticle.setSpaceMember(isSpaceMember);
if (StringUtils.isNotEmpty(draftArticleSpace.getGroupId())) {
String spaceGroupId = draftArticleSpace.getGroupId().split("/")[2];
Expand All @@ -655,12 +672,12 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator
}
StringBuilder draftArticleUrl = new StringBuilder("");
draftArticleUrl.append("/")
.append(PortalContainer.getCurrentPortalContainerName())
.append("/")
.append(CommonsUtils.getCurrentPortalOwner())
.append("/news/detail?newsId=")
.append(draftArticle.getId())
.append("&type=draft");
.append(PortalContainer.getCurrentPortalContainerName())
.append("/")
.append(CommonsUtils.getCurrentPortalOwner())
.append("/news/detail?newsId=")
.append(draftArticle.getId())
.append("&type=draft");
draftArticle.setUrl(draftArticleUrl.toString());

NewsDraftObject draftArticleMetaDataObject =
Expand Down Expand Up @@ -688,6 +705,30 @@ private News buildDraftArticle(String draftArticleId, String draftArticleCreator
return null;
}

private void deleteDraftArticle(String draftArticleId, String draftArticleCreator) throws Exception {
DraftPage draftArticlePage = noteService.getDraftNoteById(draftArticleId, draftArticleCreator);
if (draftArticlePage != null) {
noteService.removeDraftById(draftArticlePage.getId());
NewsDraftObject draftArticleMetaDataObject = new NewsDraftObject(NEWS_METADATA_DRAFT_OBJECT_TYPE,
draftArticlePage.getId(),
null);
MetadataKey draftArticleMetadataKey = new MetadataKey(NEWS_METADATA_TYPE.getName(), NEWS_METADATA_NAME, 0);
List<MetadataItem> draftArticleMetadataItems =
metadataService.getMetadataItemsByMetadataAndObject(draftArticleMetadataKey,
draftArticleMetaDataObject);
if (draftArticleMetadataItems != null && !draftArticleMetadataItems.isEmpty()) {
Map<String, String> draftArticleMetadataItemProperties = draftArticleMetadataItems.get(0).getProperties();
if (draftArticleMetadataItemProperties != null && draftArticleMetadataItemProperties.containsKey(NEWS_ILLUSTRATION_ID)
&& draftArticleMetadataItemProperties.get(NEWS_ILLUSTRATION_ID) != null) {
FileItem draftArticleIllustrationFileItem =
fileService.getFile(Long.parseLong(draftArticleMetadataItemProperties.get(NEWS_ILLUSTRATION_ID)));
fileService.deleteFile(draftArticleIllustrationFileItem.getFileInfo().getId());
}
metadataService.deleteMetadataItem(draftArticleMetadataItems.get(0).getId(), false);
}
}
}

private boolean canEditNews(News news, String authenticatedUser) {
String spaceId = news.getSpaceId();
Space space = spaceId == null ? null : spaceService.getSpaceById(spaceId);
Expand All @@ -699,7 +740,8 @@ private boolean canEditNews(News news, String authenticatedUser) {
LOG.warn("Can't find user with id {} when checking access on news with id {}", authenticatedUser, news.getId());
return false;
}
return NewsUtils.canPublishNews(news.getSpaceId(), authenticatedUserIdentity) || spaceService.canRedactOnSpace(space, authenticatedUserIdentity);
return NewsUtils.canPublishNews(news.getSpaceId(), authenticatedUserIdentity)
|| spaceService.canRedactOnSpace(space, authenticatedUserIdentity);
}

private void setArticleIllustration(News article, Long articleIllustrationId, String newsObjectType) {
Expand Down Expand Up @@ -757,13 +799,13 @@ private boolean canDeleteNews(org.exoplatform.services.security.Identity current
String authenticatedUser = currentIdentity.getUserId();
Space currentSpace = spaceService.getSpaceById(spaceId);
return authenticatedUser.equals(posterId) || userACL.isSuperUser() || spaceService.isSuperManager(authenticatedUser)
|| spaceService.isManager(currentSpace, authenticatedUser);
|| spaceService.isManager(currentSpace, authenticatedUser);
}

private boolean isMemberOfsharedInSpaces(News news, String username) {
for (String sharedInSpaceId : news.getSharedInSpacesList()) {
Space sharedInSpace = spaceService.getSpaceById(sharedInSpaceId);
if(sharedInSpace != null && spaceService.isMember(sharedInSpace, username)) {
if (sharedInSpace != null && spaceService.isMember(sharedInSpace, username)) {
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1056,7 +1056,7 @@ public void shouldDeleteNewsWhenNewsExists() throws Exception {
news.setSpaceId("1");
news.setCanDelete(true);

lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news);
Space space1 = new Space();
space1.setId("1");
space1.setPrettyName("space1");
Expand Down Expand Up @@ -1085,7 +1085,7 @@ public void shouldNotDeleteNewsWhenUserIsNotDraftAuthor() throws Exception {
news.setSpaceId("1");
news.setCanDelete(true);

lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news);
Space space1 = new Space();
space1.setId("1");
space1.setPrettyName("space1");
Expand All @@ -1109,7 +1109,7 @@ public void shouldGetNotFoundWhenDeletingNewsDraftThatNotExists() throws Excepti
ConversationState.setCurrent(new ConversationState(currentIdentity));

lenient().when(request.getRemoteUser()).thenReturn(JOHN);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(null);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), nullable(String.class))).thenReturn(null);
lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space());
lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true);
lenient().when(spaceService.isSuperManager(eq(JOHN))).thenReturn(true);
Expand All @@ -1131,7 +1131,7 @@ public void shouldGetBadRequestWhenDeletingNewsDraftWithIdNull() throws Exceptio
ConversationState.setCurrent(new ConversationState(currentIdentity));

lenient().when(request.getRemoteUser()).thenReturn(JOHN);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(null);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), nullable(String.class))).thenReturn(null);
lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space());
lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true);
lenient().when(spaceService.isSuperManager(eq(JOHN))).thenReturn(true);
Expand Down Expand Up @@ -1721,7 +1721,7 @@ public void shouldDeleteNews() throws Exception {
News news = new News();
news.setId("1");
news.setCanDelete(true);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean())).thenReturn(news);
lenient().when(newsService.getNewsById(anyString(), any(), anyBoolean(), anyString())).thenReturn(news);
lenient().when(spaceService.getSpaceById(anyString())).thenReturn(new Space());
lenient().when(spaceService.isMember(any(Space.class), eq(JOHN))).thenReturn(true);

Expand Down
Loading

0 comments on commit 8be717f

Please sign in to comment.