Skip to content

Commit aa65ce7

Browse files
committed
feat: Implement share news service layer - EXO-70812 - Meeds-io/MIPs#119 (#26)
1 parent 5759b88 commit aa65ce7

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

content-service/src/main/java/io/meeds/news/listener/NewsActivityListener.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import io.meeds.news.service.NewsService;
3636
import io.meeds.news.utils.NewsUtils;
3737

38+
import static io.meeds.news.utils.NewsUtils.NewsObjectType.ARTICLE;
39+
3840
/**
3941
* A triggered listener class about activity lifecyles. This class is used to
4042
* propagate sharing activity in News elements to let targeted space members to
@@ -76,8 +78,8 @@ public void shareActivity(ActivityLifeCycleEvent event) {
7678
String newsId = originalActivity.getTemplateParams().get(NEWS_ID);
7779
org.exoplatform.services.security.Identity currentIdentity = ConversationState.getCurrent().getIdentity();
7880
try {
79-
News news = newsService.getNewsById(newsId, currentIdentity, false);
80-
if (news != null) {
81+
News news = newsService.getNewsById(newsId, currentIdentity, false, ARTICLE.name().toLowerCase());
82+
if (news != null && !news.isDeleted()) {
8183
Identity posterIdentity = getIdentity(sharedActivity);
8284
Space space = getSpace(sharedActivity);
8385
newsService.shareNews(news, space, posterIdentity, sharedActivity.getId());

content-service/src/main/java/io/meeds/news/service/impl/NewsServiceImpl.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,8 @@ public boolean canViewNews(News news, String authenticatedUser) {
708708
|| isMemberOfsharedInSpaces(news, authenticatedUser))) {
709709
return false;
710710
}
711-
if (news.isPublished() && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE)
712-
&& !spaceService.isMember(space, authenticatedUser)) {
711+
if (news.isPublished() && StringUtils.equals(news.getPublicationState(), PUBLISHED) && news.getAudience().equals(NewsUtils.SPACE_NEWS_AUDIENCE)
712+
&& !(spaceService.isMember(space, authenticatedUser) || isMemberOfsharedInSpaces(news, authenticatedUser))) {
713713
return false;
714714
}
715715
if (StringUtils.equals(news.getPublicationState(), STAGED)
@@ -732,6 +732,35 @@ public void shareNews(News news,
732732
org.exoplatform.social.core.identity.model.Identity userIdentity,
733733
String sharedActivityId) throws Exception {
734734

735+
if (!canViewNews(news, userIdentity.getRemoteId())) {
736+
throw new IllegalAccessException("User with id " + userIdentity.getRemoteId() + "doesn't have access to news");
737+
}
738+
if (sharedActivityId != null) {
739+
// update article metadata activities
740+
NewsPageObject newsPageObject = new NewsPageObject(NEWS_METADATA_PAGE_OBJECT_TYPE, news.getId(), null);
741+
MetadataItem metadataItem = metadataService.getMetadataItemsByMetadataAndObject(NEWS_METADATA_KEY, newsPageObject).stream().findFirst().orElse(null);
742+
if (metadataItem == null) {
743+
throw new ObjectNotFoundException("News metadata object with id " + news.getId() + " wasn't found");
744+
}
745+
746+
Map<String, String> properties = metadataItem.getProperties();
747+
if (properties == null) {
748+
properties = new HashMap<>();
749+
}
750+
if (properties.containsKey(NEWS_ACTIVITIES)) {
751+
String newsActivities = properties.get(NEWS_ACTIVITIES);
752+
newsActivities = newsActivities.concat(";").concat(space.getId()).concat(":").concat(sharedActivityId);
753+
properties.put(NEWS_ACTIVITIES, newsActivities);
754+
} else {
755+
properties.put(NEWS_ACTIVITIES, space.getId().concat(":").concat(sharedActivityId));
756+
}
757+
758+
metadataItem.setProperties(properties);
759+
metadataService.updateMetadataItem(metadataItem, Long.parseLong(userIdentity.getId()));
760+
761+
NewsUtils.broadcastEvent(NewsUtils.SHARE_NEWS, userIdentity.getRemoteId(), news);
762+
}
763+
735764
}
736765

737766
/**

content-service/src/test/java/io/meeds/news/listener/NewsActivityListenerTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
package io.meeds.news.listener;
2121

22+
import static io.meeds.news.utils.NewsUtils.NewsObjectType.ARTICLE;
2223
import static org.mockito.ArgumentMatchers.eq;
2324
import static org.mockito.ArgumentMatchers.nullable;
2425
import static org.mockito.Mockito.mock;
@@ -188,7 +189,7 @@ public void testNotShareWhenSharedActivityWhenNewsNotFound() throws Exception {
188189

189190
newsActivityListener.shareActivity(event);
190191

191-
verify(newsService, times(1)).getNewsById(newsId, currentIdentity, false);
192+
verify(newsService, times(1)).getNewsById(newsId, currentIdentity, false, ARTICLE.name().toLowerCase());
192193
verify(newsService, never()).shareNews(nullable(News.class),
193194
nullable(Space.class),
194195
nullable(Identity.class),
@@ -232,11 +233,11 @@ public void testShareWhenNewsFound() throws Exception {
232233
ConversationState.setCurrent(new ConversationState(currentIdentity));
233234

234235
News news = new News();
235-
when(newsService.getNewsById(newsId, currentIdentity, false)).thenReturn(news);
236+
when(newsService.getNewsById(newsId, currentIdentity, false, ARTICLE.name().toLowerCase())).thenReturn(news);
236237

237238
newsActivityListener.shareActivity(event);
238239

239-
verify(newsService, times(1)).getNewsById(newsId, currentIdentity, false);
240+
verify(newsService, times(1)).getNewsById(newsId, currentIdentity, false, ARTICLE.name().toLowerCase());
240241
verify(newsService, times(1)).shareNews(eq(news), nullable(Space.class), nullable(Identity.class), nullable(String.class));
241242
}
242243
}

0 commit comments

Comments
 (0)